概述
- 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
- 消息服务中两个重要概念:
消息代理(message broker)和目的地(destination)
当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地。
- 消息队列主要有两种形式的目的地
- 队列(queue):点对点消息通信(point-to-point)
- 主题(topic):发布(publish)/订阅(subscribe)消息通信
解决的问题
异步处理
简单的注册流程,写库-->发送邮件-->发送注册短信,这样串行下来需要花费150ms
加入多线程处理方案,写入数据库后,并行的处理发送邮件和发送短信,性能提升,花费100ms
采用消息队里模式,用户注册信息入库后,只需要向队列里面写入需要的数据后,就可以给用户响应,花费55ms
后续再继续处理发送邮件和发送短信业务即可
应用解耦
订单系统和库存系统不再直接相关联,而是通过消息队列进行连接
流量削峰
例如:秒杀业务,用户来抢购商品,不会直接去处理用户的请求,而是先放入到有界队里中
引入MQ后,可能带来的问题
- 系统可用性降低,MQ一旦故障,系统之间的数据传递就不能进行,导致各个系统无法正常运行。
- 导致系统问题变多,进而导致系统复杂性变高。例如:系统A给系统B发送一条数据就可以了,结果因为系统A与MQ之间协调出了问题,系统A重复发送了一条数据,导致系统B内部插入了两条数据。
- 一致性问题,有人给系统A发送请求,本来这个请求应该是A、B、C、D系统都执行成功了,才能返回,结果A、B、C系统都执行成功了,但系统D执行失败,就导致用户的整个请求都失败了。
基本模式
- 点对点式
消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
消息只有唯一的发送者和接受者,但并不是说只能有一个接收者
- 发布订阅式
发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息
JMS与AMQP的对比
JMS:基于JVM消息代理的规范。ActiveMQ、HornetMQ是JMS实现
AMQP:高级消息队列协议,也是一个消息代理的规范,兼容JMS
RabbitMQ是AMQP的实现
JMS | AMQP | |
---|---|---|
定义 | Java api | 网络线级协议 |
跨语言 | 否 | 是 |
跨平台 | 否 | 是 |
Model | 提供两种消息模型: (1)、Peer-2-Peer (2)、Pub/sub | 提供了五种消息模型: (1)、direct exchange (2)、fanout exchange (3)、topic change (4)、headers exchange (5)、system exchange 本质来讲,后四种和JMS的pub/sub模型没有太大差别,仅是在路由机制上做了更详细的划分; |
支持消息类型 | 多种消息类型: TextMessage MapMessage BytesMessage StreamMessage ObjectMessage Message (只有消息头和属性) | byte[] 当实际应用时,有复杂的消息,可以将消息序列化后发送。 |
综合评价 | JMS 定义了JAVA API层面的标准;在java体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差; | AMQP定义了wire-level层的协议标准;天然具有跨平台、跨语言特性。 |
网友评论