RabbitMQ初探(一):概念及术语
1、AMQP:Advanced Message Queuing Protocol,是一个提供统一消息服务的应用层标准协议。
2、IPC(单一系统进程间通信) -> socket(不同机器间进程通信) -> AMQP(解决大型系统模块与组件间通信)
3、RabbitMQ 基于 Erlang 开发,是 AMQP 的一个开源实现。
4、RabbitMQ 系统架构图:
rabbitmq.jpg生产者生产消息后不直接直接发到队列中,而是发到一个交换空间:Exchange,Exchange会根据Exchange类型和Routing Key来决定发到哪个队列中
5、名词术语:
-
RabbitMQ Server(broker server):维护一条从 Producer 到 Consumer 的路线,保证数据能够按照指定的方式进行传输;
-
Client A & B:数据发送方,Producers create messages and publish (send) them to a broker server (RabbitMQ),一个有效的 Message 包含 payload 和 label 两部分
-
Client 1、2、3:数据消费方,Consumers attach to a broker server (RabbitMQ) and subscribe to a queue
-
Exchange:Exchanges are where producers publish their messages
-
Queue: Queues are where the messages end up and are received by consumers
-
Binding:Bindings are how the messages get routed from the exchange to particular queues
还有几个隐式的概念:
-
Connection:Producer 和 Consumer 通过 TCP 连接到 RabbitMQ
-
Channel:它建立在上述的 TCP 连接中,数据流动都是在 Channel 中进行的
此外,Exchanges 分三种类型:
-
direct:如果 routing key 匹配,那么 Message 就会被传递到相应的 queue
-
fanout:会向响应的 queue 广播
-
topic:对 key 进行模式匹配,比如
ab*
可以传递到所有ab*
的 queue
direct
如果消息中的路由键和某个队列的路由键匹配的话,就将消息发送给该队列。
RabbitMQ 默认实现了一个名称为空的 direct 交换器,当声明一个队列时,如果没有指定交换器,那么 RabbitMQ 会把该队列自动绑定到这个默认的交换器,并以队列名称作为路由键。
在 RabbitMQ 中,支持在一个交换器上的多个队列配置相同的路由键。也就是说,对于绑定到交换器 Exchang_A 上的队列 Queue_1 和 Queue_2,可以设置同一个 routing_key(假设为 key_test)。当设置了 routing_key 为 key_test 的消息 Message 被发布到 Exchang_A 上时,Exchang_A 会将 Message 同时发送给 Queue_1 和 Queue_2 两个队列。
fanout
设置为 fanout 的交换器,会将消息发送给所有绑定到它身上的队列,类似于广播。
通常应用于需要对一条消息做不同反应的场景中。比如,在社交网站上,如果用户上传了一张照片,在更新用户相册的同时,还需要给用户一些积分奖励。那么这种情况,就可以使用 fanout 类型的交换器来实现。只需要将更新用户相册的队列和增加用户积分的队列绑定到同一个 fanout 交换器上即可。
topic
topic 类型的交换器,可以使来自不同源头的消息到达同一个队列,即支持在路由键中使用通配符。
在 RabbitMQ 中,.
把路由键分成多个部分,*
匹配特定位置的任意文本,#
则表示匹配所有规则。通过对这几种通配符的组合使用,就可以实现将不同来源的消息发送到同一个队列。比如,将 routing_key 设置为 *.error
,就可以将所有 routing_key 以 .error
结尾的消息发送到同一个队列。