1. 首页
  2. >
  3. 编程技术
  4. >
  5. Java

消息队列技术调研

消息队列的协议

  • AMQP:高级消息队列协议(AMQP,Advanced Message Queuing Protocol),RabbitMQ 和 HornetQ 都实现了该协议。
    • 优势:功能最丰富,能够适用最多的场景。
    • 劣势:其实现上不轻量化。
    • 应用场景:简单的pub/sub模型无法满足要求的场景。
  • ZeroMQ:这是一种协议,也是一个开源组件,无中心化的broker。
    • 优势:无中心化,速度很快。
    • 劣势:学习曲线比较高。
    • 应用场景:需要海量吞吐和无单点故障的场景
  • STOMP:面向流文本的消息传输协议(STOMP,Streaming Text Oriented Messaging Protocol),是 WebSocket 通信标准。在通常的发布-订阅语义之上,它通过 begin/publish/commit 序列以及 acknowledgement 机制来提供消息可靠投递。
    • 优势:由于协议简单且易于实现,几乎所有的编程语言都有 STOMP 的客户端实现。
    • 劣势:但是在消息大小和处理速度方面并无优势。
    • 应用场景:信息交换基于文本,适用要求简单的场景。
  • MQTT:一种二进制的协议,MQTT(Message Queue Telemerty Transport),主要用于服务器和那些低功耗的物联网设备(IoT)之间的通信。它位于 TCP 协议的上层,除了提供发布-订阅这一基本功能外,也提供一些其它特性:不同的消息投递保障(delivery guarantee),“至少一次”和“最多一次”。通过存储最后一个被确认接受的消息来实现重连后的消息恢复。Mosquitto和VerneMQ实现了MQTT协议。
    • 优势:它非常轻量级,并且从设计和实现层面都适合用于不稳定的网络环境中。
    • 劣势:实现的很简单,因为就是面向嵌入式物联网场景的。
    • 应用场景:物联网(IoT)场景中更适合,支持几乎所有语言进行开发,并且浏览器也可通过 WebSocket 来发送和接收 MQTT 消息。
  • JMS:Java 消息服务(JMS,Java Messaging Service),是一种协议,同时也是 Java 消息服务规范的标准实现。JMS可以用来实现 请求/响应 模式的远程过程调用 RPC(Remote Procedure Calls)/RMI(Remote Method Invocation)。AMQP和ZeroMQ是通过响应队列(response-queue)来实现这种模式,而JMS可以直接实现RMI。
    • 优势:直接可以进行RMI。
    • 劣势:?
    • 应用场景:不引入其他组件,直接用java实现RMI 。


    消息队列中间件

  • RabbitMQ
  • ActiveMQ:同时支持amqp,mqtt,openwire,stomp。
  • Apache RocketMQ:由阿里巴巴开源,使用自定义协议 ,不支持AMQP。
  • Redis
  • Kafka:由linkedin使用自定义协议 ,不支持AMQP。
  • memcacheq
  • LightQ:LightQ是一个基于MIT协议开源的高性能代理消息队列,它支持瞬态(每秒1M的性能)和持久化(每秒300k左右的性能)两种队列。LightQ的持久化队列类似于Kafka,即首先数据写入到文件,而由消费者再从文件中读取数据。