简述----消息中间件
一、简介
中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称中间件。
**消息中间件(MQ)**也成消息队列, 专注于数据的发送和接受,利用高效可靠的异步消息传递机制进行数据交流,并基于数据通信集成分布式系统
典型的消息中间件包含 3 部分 :
- broker(消息中间件)
- producer(发布者)
- consumer(消费者)
二、为什么要使用消息中间件
通过服务调用让其他系统感知事件的发生,系统之间耦合度太高,用户体验不好
通过消息中间件可以解耦服务调用
上图中可以看出,通过消息中间件可以实现解耦合,独立的扩展或修改两边的处理过程
还具有以下优势:
- 冗余(副本):消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险
- 扩展性:
- 灵活,峰值处理能力:缓解瞬时高流量压力
- 可恢复性:
- 顺序保证:保证消息先进先出
- 缓冲:解决生产消息和消费消息的处理速度不一致的情况
- 异步通信:允许用户把一个消息放入队列,但并不立即处理它
消息中间件主要有以下几个应用场景:
- 异步处理
- 应用解耦
- 系统间通讯
- 消息队列
- 驱动型架构
- 错峰与流控
- 日志收集
- 广播等待
三、消息中间件的两种模式
3.1 点对点模式(P2P)
- 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
- 接收者在成功接收消息之后需向队列应答成功
如果需要发送的每个消息都应该被成功处理,就使用P2P模式
3.2 发布/订阅模式(Pub/Sub)
- 每个消息可以有多个消费者。
- 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者。
- 它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被**(运行),它也能接收到发布者的消息。
如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型