RabbitMQ学习总结

2016-02-19 demon7452 更多博文 » 博客 » GitHub »

原文链接 https://demon7452.github.io/2016/02/19/RabbitMQ%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


RabbitMQ学习总结

定义

RabbitMQ是一个消息代理。从本质上来说,它是从生产者(producer)接收信息,然后将信息分发给消费者(consumer)。你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ就扮演着邮箱、邮局以及邮递员的角色。

名词解析

  • 生产(Producing)的意思就是发送信息。一个发送信息的程序就是生产者。我们使用"P"来表示:
  • 队列(queue)就是邮箱的名称。消息通过你的应用程序和RabbitMQ进行传输,它们能够只存储在一个队列(queue)中。 队列(queue)没有任何限制,你要存储多少消息都可以——基本上是一个无限的缓冲池(buffer)。多个生产者(producers)能够把消息发送给同一个队列,同样,多个消费者(consumers)也能够从同一个队列(queue)中获取数据。队列可以绘制成这样(图上是队列的名称):
  • 消费(Consuming)和获取消息是一样的意思。一个消费者(consumer)就是一个等待获取消息的程序。我们把它绘制为"C":
Note:生产者、消费者、代理需不一定要放在同一台机器上;事实上大多数应用也确实不会将他们放在一台机器上。

AMQP说明

1、AMQP是什么

AMQP(高级消息队列协议)是一个网络协议。它用来支持 符合要求的客户端应用(application)与 消息中间件代理(messaging middleware broker) 进行通信。

2、消息代理和他们所扮演的角色

消息代理(message brokers)从发布者(publishers)亦称生产者(producers)那儿接收消息,并根据既定的路由规则把接收到的消息发送给处理消息的消费者(consumers)。

由于AMQP是一个网络协议,所以这个过程中的发布者,消费者,消息代理 可以存在于不同的设备上。

3、AMQP 0-9-1 模型简介

AMQP 0-9-1的工作过程如下图:消息(message)被发布者(publisher)发送给交换机(exchange,交换机常常被比喻成邮局或者邮箱)。然后交换机将收到的消息根据路由规则分发给绑定的队列(queue)。最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

  • 模型的一些说明
    • 发布者(publisher)发布消息时可以给消息指定各种消息属性(message meta-data)。有些属性有可能会被消息代理(brokers)使用;而其他的属性则是完全不透明的,它们只能被接收消息的应用所使用。
    • 从安全角度考虑,网络是不可靠的,接收消息的应用有可能在处理消息的时候失败。基于此原因,AMQP模块包含了一个消息确认(message acknowledgements)的概念:当一个消息从队列中投递给消费者后(consumer),消费者会通知一下消息代理(broker),这个通知可以是自动执行的也可以由处理消息的应用(consumer)的开发者执行。当“消息确认”功能被启用后,消息代理不会完全将消息从队列中删除,除非消息代理收到来自消费者的确认回执(acknowledgement)。
    • 在某些情况下,例如当一个消息无法被成功路由时,消息或许会被返回给发布者并被丢弃。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中。此时,消息发布者可以选择某些参数来处理这些特殊情况。
    • 队列(queue),交换机(exchange)和绑定统称为AMQP实体(AMQP entities)。

多种MQ之间的比较

MQ(Message Queue)消息队列框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。

1、RabbitMQ,ActiveMq,ZeroMq之间的比较

  • TPS(系统吞吐量):ZeroMq 最好,RabbitMq 次之, ActiveMq 最差。
    • 持久化消息和瞬时消息的比较;
    • 每秒钟发送和接收的消息数的比较;

持久化消息和瞬时消息 每秒钟发送和接收的消息数

  • 持久化消息比较:zeroMq不支持,activeMq和rabbitMq都支持。持久化消息主要是指:MQ down或者MQ所在的服务器down了,消息不会丢失的机制。
  • 技术点:可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统、社区。
    • RabbitMq最好,ActiveMq次之,ZeroMq最差。当然ZeroMq也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。
    • 所以在可靠性和可用性上,RabbitMQ是首选,虽然ActiveMQ也具备,但是它性能不及RabbitMQ。
  • 高并发:从实现语言来看,RabbitMQ最高,原因是它的实现语言是天生具备高并发高可用的erlang语言。

总结: 通过上面的比较可以看出,RabbitMQ的系统吞吐量比较好,对消息进行了持久化,具备持久性、投递确认、发布者证实和高可用性等特性,还有具有高并发的特性。

2、kafka和RabbitMQ的比较

  • RabbitMq比kafka成熟,在可用性上,稳定性上,可靠性上,RabbitMq超过kafka
  • Kafka设计的初衷就是处理日志的,可以看做是一个日志系统,针对性很强,所以它并没有具备一个成熟MQ应该具备的特性
  • Kafka的性能(吞吐量、tps)比RabbitMq要强,但两者在这方面没有可比性。

参考文档

1.RabbitMQ官方教程 2.RabbitMQ官方教程翻译 3.AMQP 0-9-1 简介 4.RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总