消息队列的两种传递模式
-
点对点模式
点对点模式是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。
-
发布订阅模式
发布订阅模式定义了如何向 个内容节点发布和订阅消息,这个内容节点称为主题 (topic) ,主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题中订阅消息。主题使得消息的订阅者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模式在消息的一对多广播时采用。
面向消息的中间件(简称为 MOM Message Oriented Middleware) 提供了以松散耦合的灵活方 式集成应用程序的 种机制。它们提供了基于存储和转发的应用程序之间的异步数据发送,应用程序彼此不直接通信而是与作为中介的消息中间件通信 ,消息中间件提供了有保证的消息 发送,应用程序开发人员无须了解远程过程调用 RPC) 和网络通信协议的细节。(由此我们看出消息中间件的作用之一就是解耦)
消息中间件的作用
- 解耦:主要体现在应用程序彼此不直接通信儿是作为中介的消息中间件通信,两边程序都需要实现消息中间件的相关数据处理接口;
- 存储:主要体现在消息持久化,将消息持久化到存储中,等消息成功消费后再完成相关消息删除。确保数据被安全的保存,直到你使用完毕;
- 削峰: 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流 并不常见。如果以能处理这类峰值为标准而投入资源,无疑是巨大的浪费 使用消息中间件能够使关键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩惯;
- 扩展性:只需要增加处理过程即可,不需要修改相关代码,也不需要调节参数;
- 可恢复性: 即使 一个处理消息的进程挂掉,加入消息中间件中的消息仍然可以在系统恢复后
进行处理; - 顺序性保证: 在大多数使用场景下,数据处理的顺序很重要,大部分消息中间件支持 定程
度上的顺序性; - 缓冲: 在任何重要的系统中,都会存在需要不同处理时间的元素。消息中间件通过 个缓
冲层来帮助任务最高效率地执行,写入消息中间件的处理会尽可能快速 该缓冲层有助于控制
和优化数据流经过系统的速度; - 异步: 在很多时候应用不想也不需要立即处理消息 消息中间件提供了异步处理机制,
允许应用把 些消息放入消息中间件中,但并不立即处理它,在之后需要的时候再慢慢处理;
消息中间件的使用
在项目中增加依赖:
com.rabbitmq amqp-client 5.7.1
public class MQNative { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); } } }