美文网首页
消息队列的基本概念,JMS与AMQP的对比

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

作者: 缓慢移动的蜗牛 | 来源:发表于2018-06-02 11:25 被阅读0次

    概述

    • 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力
    • 消息服务中两个重要概念:

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

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

    • 消息队列主要有两种形式的目的地
      • 队列(queue):点对点消息通信(point-to-point)
      • 主题(topic):发布(publish)/订阅(subscribe)消息通信

    解决的问题

    异步处理

    简单的注册流程,写库-->发送邮件-->发送注册短信,这样串行下来需要花费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层的协议标准;天然具有跨平台、跨语言特性。

    相关文章

      网友评论

          本文标题:消息队列的基本概念,JMS与AMQP的对比

          本文链接:https://www.haomeiwen.com/subject/myfrsftx.html