RabbitMQ(三)RabbitMQ模式

120 阅读5分钟

上文中我们在linux服务器中安装了RabbitMQ中间件。这里我们来了解一下RabbitMQ中的交换机模式。

 

1 :Direct exchange(直连交换机)

Direct 模式是fanout模式上的一种叠加,增加了路由RoutingKey的模式。

1.jpg.png

直连型交换机(direct exchange)是根据消息携带的路由键(routing key)将消息投递给对应队列的。直连交换机用来处理消息的单播路由(unicast routing)(尽管它也可以处理多播路由)。下边介绍它是如何工作的:

 

将一个队列绑定到某个交换机上,同时赋予该绑定一个路由键(routing key)

当一个携带着路由键为R的消息被发送给直连交换机时,交换机会把它路由给绑定值同样为R的队列。

直连交换机经常用来循环分发任务给多个工作者(workers)。当这样做的时候,我们需要明白一点,在AMQP 0-9-1中,消息的负载均衡是发生在消费者(consumer)之间的,而不是队列(queue)之间。

 

2 topic exchange (主题交换机)

Topic 模式是direct模式上的一种叠加,增加了模糊路由RoutingKey的模式。

2.jpg.png

主题交换机(topic exchanges)通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由(multicast routing)。

 

主题交换机拥有非常广泛的用户案例。无论何时,当一个问题涉及到那些想要有针对性的选择需要接收消息的 多消费者/多应用(multiple consumers/applications) 的时候,主题交换机都可以被列入考虑范围。

 

使用案例:

1)   分发有关于特定地理位置的数据,例如销售点

2)   由多个工作者(workers)完成的后台任务,每个工作者负责处理某些特定的任务

3)   股票价格更新(以及其他类型的金融数据更新)

4)   涉及到分类或者标签的新闻更新(例如,针对特定的运动项目或者队伍)

5)   云端的不同种类服务的协调

6)   分布式架构/基于系统的软件封装,其中每个构建者仅能处理一个特定的架构或者系统。

 

3 funout exchange (扇形交换机)

Fanout —发布与订阅模式,是一种广播机制,它是没有路由key的模式。

3.jpg.png

扇型交换机(funout exchange)将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键。如果N个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的N个队列。扇型用来交换机处理消息的广播路由(broadcast routing)。

 

因为扇型交换机投递消息的拷贝到所有绑定到它的队列,所以他的应用案例都极其相似:

 

大规模多用户在线(MMO)游戏可以使用它来处理排行榜更新等全局事件

体育新闻网站可以用它来近乎实时地将比分更新分发给移动客户端

分发系统使用它来广播各种状态和配置更新

在群聊的时候,它被用来分发消息给参与群聊的用户。(AMQP没有内置presence的概念,因此XMPP可能会是个更好的选择)

 

四:Work模式 - 轮询模式(Round-Robin)

该模式接收消息是当有多个消费者接入时,消息的分配模式是一个消费者分配一条,直至消息消费完成;

4.jpg.png

消费者 1 消费的是 偶数,消费者 2 消费的是奇数,或者反过来,这种方式叫做轮询分发(Round-Robin),结果就是不管谁忙或者谁清闲们都不会多给一个消息

任务消息总是你一个我一个。

这种模式在两个消费者能力相同的时候适用。

 

五:Work模式 - 公平分发(Fair Dispatch)

由于消息接收者处理消息的能力不同,存在处理快慢的问题,我们就需要能者多劳,处理快的多处理,处理慢的少处理;

4.jpg.png

   公平分发(Fair Dispatch)即消费者1(C1)从队列(Queue)中获取一条消息之后,处理完消息之后手动发送反馈回执,告诉RabbitMQ我处理完了,接着就会再从队列中获取一条消息 ;在消费者1(C1)获取消息后处理业务之时,消费者2(C2)也会从队列中获取一条消息之后,处理完消息之后同样会手动发送反馈回执,告诉RabbitMQ我处理完了,接着也会再从队列中获取一条消息。两个消费者(C1&C2)不需要彼此等待对方处理完业务才能获取消息,这样一来业务处理时间短的消费者就能多处理消息,做到“能者多劳”,提高工作效率。

保证消费者一次只接收一条消息(Channel.basicQos(1));

 

以上大概就是对RabbitMQ的工作模式得基本了解。

 

有好的建议,请在下方输入你的评论。