美文网首页
消息队列 消息中间件 JMS与AMQP

消息队列 消息中间件 JMS与AMQP

作者: lynnnnyl | 来源:发表于2022-05-09 16:58 被阅读0次

    一、简介

    中间件:中间件(Middleware)是处于平台(硬件和操作系统)和应用程序之间的通用服务。也就是说,中间件是提供普遍独立功能需求的模块。中间件屏蔽了底层操作系统的复杂性,使开发人员得以基于一个简单而统一的开发环境,集中进行业务开发,而不必考虑程序在不同系统上的兼容性问题,从而提升开发效率,且减少系统维护的工作量。
    消息中间件:也称消息队列,利用可靠的消息传递机制进行系统之间通信,具有接受数据、接受请求、存储数据、发送数据等功能。消息代理(message broker)和目的地(destination)是消息服务中两个重要的概念。当一个消息被发送后,会被交给消息代理,消息代理可以确保消息被发送到指定目的地,同时解放发送者,使其能够继续进行其它业务。消息代理通常有ActiveMQ、RabbitMQ...,目的地通常有队列和主题。

    1. 队列(queue):点对点消息通信(point-to-point)
    2. 主题(topic):发布(publish)和订阅(subscribe)消息通信
      点对点式
    • 发送者发送消息,消息代理将其放入队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
    • 消息只有唯一的发送者和接受者,但是可以有多个接收者(因为一个消息只能被读取一次)
      发布订阅式
      发送者(发布者)发送消息到主题,由于多个接收者(订阅者)监听(订阅)这个主题,所以在消息到达主题的同时收到消息

    二、JMS与AMQP

    常见的两个消息规范分别是JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)。JMS是一个基于JVM的消息代理规范,常见实现有ActiveMQ和HornetMQ;AMQP是一个基于应用层标准的统一消息队列协议,是应用层协议的一个开放标准。基于此协议的客户端与消息中间件的消息传递,并不受客户端、中间件和不同开发语言等限制。AMQP兼容JMS,常见实现有RabbitMQ。下表列举了JMS与AMQP的区别:

    • JMS基于Java,不能跨语言、跨平台,提供点对点和发布订阅式消息模型,支持多种消息类型(TextMessage、MapMessage、ByteMessage、
      StreamMessage、ObjectMessage及Message(只有消息头和属性))
    • AMQP是应用层级别的协议,支持跨语言、跨平台,提供了五种消息模型(direct exchange\fanout exchange\topic exchange\headers exchange\system exchange,后四种与JMS中的发布订阅模式本质上没有太大区别,仅在路由机制上做了更详细的划分),支持消息类型为byte[](复杂的消息会序列化之后发送)
      简而言之,JMS定义了Java API层面的标准,在Java体系中,多个client可以通过JMS进行交互,应用无需修改代码,但对跨平台的支持较差;AMQP定义了wire-level层的协议标准;天然具有跨平台、跨语言特性。

    三、Spring与Spring Boot支持

    • spring-jms提供了对JMS的支持
    • spring-rabbit提供了对AMQP的支持
    • 需要ConnectionFactory的实现来连接消息代理
    • 提供JmsTemplate、RabbitTemplate来发送消息
    • @JmsListener(JMS)、@RabbitListener(AMQP)注解在方法上监听消息代理发布的消息
    • @EnableJms、@EnableRabbit开启支持
      Spring Boot自动配置
      – JmsAutoConfiguration
      – RabbitAutoConfiguration

    相关文章

      网友评论

          本文标题:消息队列 消息中间件 JMS与AMQP

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