消息队列的基本概念,JMS与AMQP的对比

2018-06-02  本文已影响0人  缓慢移动的蜗牛

概述

消息代理(message broker)和目的地(destination)

当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地。

解决的问题

异步处理

简单的注册流程,写库-->发送邮件-->发送注册短信,这样串行下来需要花费150ms

加入多线程处理方案,写入数据库后,并行的处理发送邮件和发送短信,性能提升,花费100ms

采用消息队里模式,用户注册信息入库后,只需要向队列里面写入需要的数据后,就可以给用户响应,花费55ms

后续再继续处理发送邮件和发送短信业务即可

应用解耦

订单系统和库存系统不再直接相关联,而是通过消息队列进行连接

流量削峰

例如:秒杀业务,用户来抢购商品,不会直接去处理用户的请求,而是先放入到有界队里中

引入MQ后,可能带来的问题

  1. 系统可用性降低,MQ一旦故障,系统之间的数据传递就不能进行,导致各个系统无法正常运行。
  2. 导致系统问题变多,进而导致系统复杂性变高。例如:系统A给系统B发送一条数据就可以了,结果因为系统A与MQ之间协调出了问题,系统A重复发送了一条数据,导致系统B内部插入了两条数据。
  3. 一致性问题,有人给系统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层的协议标准;天然具有跨平台、跨语言特性。
上一篇下一篇

猜你喜欢

热点阅读