RabbitMQ初探(一):概念及术语

1、AMQP:Advanced Message Queuing Protocol,是一个提供统一消息服务的应用层标准协议。

2、IPC(单一系统进程间通信) -> socket(不同机器间进程通信) -> AMQP(解决大型系统模块与组件间通信)

3、RabbitMQ 基于 Erlang 开发,是 AMQP 的一个开源实现。

4、RabbitMQ 系统架构图:

RabbitMQ初探(一):概念及术语_第1张图片
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 结尾的消息发送到同一个队列。

你可能感兴趣的:(RabbitMQ初探(一):概念及术语)