RabbitMQ 学习笔记
RabbitMQ
是一个支持多种消息传递协议的消息代理, 支持 AMQP
(一个具有强大路由功能的开放式连接协议),实现了信息发送者和接受者的解耦。
整体架构
rabbitmqStructure.jpg rabbitmq.png上面两张图表示了同样的意思,消息传递分为三部分:
- 生产者(Producer/Publisher)生产和发送消息。
- 代理(Broker)也被称为messagebus,负责消息的路由和分发(维护一条从Producer到Consumer的线路)。RabbitMQ就工作在这部分。
- 消费者(Consumer)接收消息。
术语
Producer
- 生成消息并发送到MQ
- Message包含 payload(有效载荷) 和 label。payload就是传输的消息,label是exchange的名字或者一个tag,它描述了payload,RabbitMQ通过label来决定把这个Message发给哪个comsumer。
- 不属于RabbitMQ的一部分,e.g. Gerrit。
- 多种语言都能用来发消息。
Consumer
- 从队列(queue)里面读 messages
- 读(read/consume)和 确认(ack)消息
- 不属于RabbitMQ的一部分,e.g. Jenkins。
- 消息被读取(read&ack)后,它从队列中被删除。
Broker
-
exchange 邮局 PostOffice(are where producers publish their messages.)
- 能被动态创建
- 可以被多个队列绑定
- 多个type (不同的路由算法)
- Direct (如果 routing key 匹配, 那么Message就会被传递到相应的queue中。)
- Fanout (会向响应的queue广播)
- Headers
- Topic (对key进行模式匹配,比如ab* 可以传递到所有ab*的queue)
-
queue 邮箱 Mailbox (where the messages end up and are received by consumers)
- 能被动态创建
-
binding 控制消息路由
- links exchange and queue
- binding key
- 能被动态创建
还有几个概念是上述图中没有标明的,那就是Connection(连接),Channel(通道,频道)。
Connection: 就是一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQ Server的。
Channels: 虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。 目的是共用TCP连接,减少消耗。
Virtual hosts
每个virtual host本质上都是一个RabbitMQ Server,拥有它自己的queue,exchagne,和bings rule等等。这保证了你可以在多个不同的application中使用RabbitMQ。
实际生产中,我们一般一个server只配置了一个vhost,所以感受不到这一点。
总结
RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制。