RabbitMQ的开发应用

RabbitMQ 介绍RabbitMQ 是一个由erlang语言编写的、开源的、在AMQP基础上完整的、可复用的企业消息系统 。支持多种语言,包括JAVA、Python、ruby、php、C/C++等 。
1.1.AMQP模型AMQP:advanced message queuing protocol ,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 。基于此协议的客户端与消息中间件可传递的消息并不受客户端/中间件不同产品、不同开发语言等条件的限制 。
AMQP模型图
 

RabbitMQ的开发应用

文章插图
 
1.1.1.工作过程发布者(Publisher)发布消息(Message),经由交换机(Exchange) 。
交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue) 。
最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取 。
1、发布者、交换机、队列、消费者都可以有多个 。同时因为 AMQP 是一个网络协议,所以这个过程中的发布者,消费者,消息代理 可以分别存在于不同的设备上 。
2、发布者发布消息时可以给消息指定各种消息属性(Message Meta-data) 。有些属性有可能会被消息代理(Brokers)使用,然而其他的属性则是完全不透明的,它们只能被接收消息的应用所使用 。
3、从安全角度考虑,网络是不可靠的,又或是消费者在处理消息的过程中意外挂掉,这样没有处理成功的消息就会丢失 。基于此原因,AMQP 模块包含了一个消息确认(Message Acknowledgements)机制:当一个消息从队列中投递给消费者后,不会立即从队列中删除,直到它收到来自消费者的确认回执(Acknowledgement)后,才完全从队列中删除 。
4、在某些情况下,例如当一个消息无法被成功路由时(无法从交换机分发到队列),消息或许会被返回给发布者并被丢弃 。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中 。此时,消息发布者可以选择某些参数来处理这些特殊情况 。
1.1.2.Excharge交换机交换机是用来发送消息的 AMQP 实体 。交换机拿到一个消息之后将它路由给一个或零个队列 。它使用哪种路由算法是由交换机类型和绑定(Bindings)规则所决定的 。常见的交换机有如下几种:
1. direct 直连交换机:Routing Key==Binding Key,严格匹配 。
2. fanout 扇形交换机:把发送到该 Exchange 的消息路由到所有与它绑定的 Queue 中 。
3. topic 主题交换机:Routing Key==Binding Key,模糊匹配 。
4. headers 头交换机:根据发送的消息内容中的 headers 属性进行匹配 。
具体有关这五种交换机的说明和用法,后续会有章节详细介绍 。
1.1.3.Queue队列AMQP 中的队列(queue)跟其他消息队列或任务队列中的队列是很相似的:它们存储着即将被应用消费掉的消息 。队列跟交换机共享某些属性,但是队列也有一些另外的属性 。
· Durable(消息代理重启后,队列依旧存在)
· Exclusive(只被一个连接(connection)使用,而且当连接关闭后队列即被删除)
· Auto-delete(当最后一个消费者退订后即被删除)
· Arguments(一些消息代理用它来完成类似与 TTL 的某些额外功能)
1.2.rabbitmq和kafka对比rabbitmq遵循AMQP协议,用在实时的对可靠性要求比较高的消息传递上 。kafka主要用于处理活跃的流式数据,大数据量的数据处理上 。主要体现在:
1.2.1.架构1. rabbitmq:RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据) 。rabbitMQ以broker为中心 。
2. kafka:kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据 。
1.2.2.消息确认1. rabbitmq:有消息确认机制 。
2. kafka:无消息确认机制 。
1.2.3.吞吐量1. rabbitmq:rabbitMQ在吞吐量方面稍逊于kafka,他们的出发点不一样,rabbitMQ支持对消息的可靠的传递,支持事务,不支持批量的操作;基于存储的可靠性的要求存储可以采用内存或者硬盘 。
2. kafka:kafka具有高的吞吐量,内部采用消息的批量处理,zero-copy机制,数据的存储和获取是本地磁盘顺序批量操作,具有O(1)的复杂度,消息处理的效率很高 。


推荐阅读