目录html
AMQP协议是Message Queue消息队列的一种协议,RabbitMQ 是基于AMQP协议实现的一种消息队列框架。
掌握RabbitMQ,必需要对AMQP的协议有所了解,才能使用的驾轻就熟。
本文主要介绍AMQP协议和RabbitMQ的基本概念和架构,详细协议介绍能够参考AMQP的官方协议文档。http://www.amqp.org/编程
消息队列(Message queue)是一种进程间通讯或同一进程的不一样线程间的通讯方式。消息的发送者和接收者不须要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。缓存
消息队列是分布式系统中重要的组件。服务器
producer/publisher: 消息的生产者、发布者
consumer/subscriber: 消息的消费者、订阅者
queue: 消息的缓存者
message: 消息实体
exchange:消息的交换机 (不是必备的)架构
一、解耦:经过消息队列中间件的引入,下降各模块之间的复杂度,达到解耦的目的。
二、异步:消息异步投递,经过消息队列的引入,有更加灵活的处理方式(主动拉取,服务推送),而且能够堆叠消费者进行并行处理消息。
三、限流:同一时间大规模的消息生成,经过消息中间件进行负载均衡,达到限流的目的。并发
Amqp是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不一样的开发语言等条件的限制。负载均衡
Amq model:
框架
Publisher 和 Consumer与Server保持链接, Publiser那一侧,只须要与Exchange进行保持链接。Publisher 和 Consumer登陆时,须要指定virtual host,virtual host 相似C++的命名空间同样,Exchange和 Message Queue被包含在Virtual host的做用域范围以内。异步
消息投递:
编程语言
当Publisher 有消息投递时,须要携带Exchange进行binding须要的routingkey,而且指定message投递到具体Exchange名字。这也就意味着Pushlisher并不直接和Message Queue有关联,消息投递时,只须要跟Exchange那一侧交互便可。 相关投递细节还有消息的持久化,消息投递的确认机制,消息投递的事务的操做等,后续文章会有C的代码实现。
交换机和队列绑定:
交换机与队列经过binding key进行binding, binding key就是路由到具体队列的匹配规则,当有消息进入Exchange时,Exchange会根据消息携带的routing key进行binding, routing key若是符合 binding key的匹配规则,那么消息就会投递到具备binding规则的队列。能够这样理解,routing key是跟消息关联的,binding key是与队列关联的,exchange就是比较这二者的组件。exchange有四种相似:direct topic fanout header
消息消费:
Consumer 一般会建立具体的queue和exchange,而后将其binding,根据不一样的业务消费不一样的消息。具体其余细节还有消费确认,Qos操做,Cancel,事务操做等。
Server
Connection
Channel
Virtual Host
Exchange
Message
Binding
Routing Key
Binding Key
Message Queue
Exchange Type (direct topic fanout)
Producer- Consumer
Publisher- Subscriber (topic Exchange Type)
特性:
Persistent:持久化,须要同时message、 exchange、 queue 支持持久化才能达到持久化的操做
Confirm:发送确认
Quality of Service:消费者能够指定Qos操做,操做预取,节省带宽
Acknowledgements:消费确认
Transaction:事务操做,支持一组消息的发送,和消费,支持回滚操做
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。全部主要的编程语言均有与代理接口通信的客户端库。
RabbitMQ官网有6种使用例子,其余具体场景须要根据本身的业务进行组合取舍
一、hello word
P产生一个hello word的消息,到消息队列,由C消费,这里用了默认的Exchange
二、work queues
P产生一些消息投递到消息队列,由C1, C2分别消费,这里使用了默认的Exchange (direct), C1消费过的消息,不会被C2消费
三、 Publish/Subscribe
发布订阅,使用fanout类型的Exchange, P投递消息到X,X是fanout的类型,分别与两个queue绑定,C1和C2消费同样的消息
四、Routing
灵活的路由,这里使用了direct类型的Exchange,按需binding,按需消费
五、Topic
topic类型的Exchange,组合了具备几个特征集合的消息,进行路由,匹配规则更加灵活
六、Rpc
两个消息队列提供Rpc的功能,客户端投递消息时,须要设置Server端消息投递时须要的Routing key,这样,Server收到消息后,处理完毕,投递返回消息到reply 队列对应的Exchange,而后被Client从reply消费,进而实现Rpc的调用
奈何官方没有C/C++实现,后面我会分享出来我实现上述例子的Demo。
一、持久化、投递确认,消费确认,高可用
二、消息路由灵活,接口使用简单方便
三、集群部署
四、管理方便,有管理后台
五、Erlang编写,高并发支持
https://en.wikipedia.org/wiki/Message_queue
http://www.amqp.org/
http://www.rabbitmq.com/getstarted.html