今天我们来聊一聊 RabbitMQ 的工作模式与其对于的应用场景有哪些。
你可能会疑惑,作为 MQ 不就是生产者将消息发送到 MQ ,再讲消息发送到消费者哪里,任务不就完成了吗?
其实,不是这样的,MQ 的使用会根据业务场景的不同,也会选择不同的消息工作模式。
在说六中工作模式前,需要先了解一下 RabbitMQ 的基本组件与概念,这样才能更好的学习 RabbitMQ 其工作模式。
这个比较简单,就是一个生产者、一个队列、一个消费者,这种交换机是不参与的。
创建一个工作队列(Work Queue),它会发送一些耗时的任务给多个工作者(Worker)。
在多个消息的情况下,Work Queue 会将消息分派给不同的消费者,每个消费者都会接收到不同的消息,并且可以根据处理消息的速度来接收消息的数量,进而让消费者程序发挥最大性能。
Work Queue 特别适合在集群环境中做异步处理,能最大程序发挥每一台服务器的性能。
在高并发情况下,队列里面的消息很容易产生积压,此模式可以扩容消费者进行负载均衡处理消息。
接下来,我们看看实际使用场景
例如:12306,如果实时发送短信,量不大还好,像节假日这样的情况,没有 MQ 发送短信的访问必然会撑不住大量的并发。
如果改为了 MQ 方式,就可以进行异步处理,且短信涉及到的网络情况时间还长,与第三方交互也会有些情况,改用 MQ 异步处理,就可以支持更多的并发,也可以根据业务的量进行随时扩容。
发布订阅是作为生产者产生的一个消息,他的消费者都是可以收到此条消息的。上图,就可以清晰的说明,生产者将消息发给了 broker ,此模式中前面说的交换机,就可以派上用场了。
交换机的作用是将收到的消息,发给多套副本队列,对于的消费者如果订阅了这个队列的话,就可以收到生产者的消息了。
发布/订阅模式中,生产者不再直接与队列绑定,而是将数据发送至“交换机 Exchange ”。
交换机 Exchange 用于将数据按某种规则送入与之绑定的队列,进而供消费者使用。
发布/订阅模式中,交换机将无差别的将所有消息送入与之绑定的队列,所有消费者拿到的消息完全相同。
接下来,我们看看实际使用场景
发布订阅模式因为所有消费者获得相同的消息,所以特别适合“数据提供商与应用商”。
例如:中国气象局提供“天气预报”送入交换机,网易、新浪、百度、搜狐等门户接入通过队列绑定到该交换机,自动获取气象局推送的气象数据。
例如:有一个新闻机构,每天都会有些独家消息,就可以开个付费专栏。对于其他一些消息平台,想每天收到这家机构提供的独家新闻时,就可以使用使用此模式。
但是作为发布订阅模式也有许多的不足,就拿举的新闻例子来说,如果新闻机构里面分为娱乐、新闻、社会等模块呢,那么发布一次就会让所有的消费者收到,显然这是不符合需求的。针对这个问题发布订阅模式可以进行解决。接着往下看
路由(Routing)模式是在发布订阅模式基础上的变种,发布订阅模式是无条件将所有消息分发给所有消费者队列。路由模式则是 Exchange 根据 Routing Key 有条件的将数据筛选后发给消费者队列。
就用上图不同级别日志来说,对于 error 级别的日志信息可能是我们需要特别关注的,会被单单独的消费者进行处理,此时交换机分发消息是有条件的进行分发,这个就是根据 Routing Key 进行不同的消息分发。
路由模式是一种精准的匹配,只有设置了 Routing Key 消息才能进行分发。可以,在实际的工作中还有一些非常模糊的情况,也就是路由模式的升级版,主题模式。
主题模式是在原有的 Routing Key 增加了通配符,可以进行 Routing Key 的模糊匹配,进行更加灵活的消息分发。
*和#,分表是主题模式的通配符,*代表单个关键字,#代表多个关键字。
在实际使用场景中, 路由模式的效率是高于主题模式,实际工作中可以使用路由模式解决的问题就尽量不要采用主题模式。
我们都清楚作为 MQ 本质上都是异步通讯的,作为生产者将消息送达消息队列后呢,作为生产者他的任务就完成了。至于消费者什么时候消费的最终结果呢,生产者是不关心的。
但是很多时间,异步情况并不能满足我们的需求。很多时候生产者产生消息之后,需要得到消费者消费的结果。这种情况下非常像平时的 RPC 远程调用,这种情况下 RabbitMQ 也提供了对应得工作模式。
这里实际上有两个队列,作为 clinet 产生了消息后,会将 broker 会将消息放入队列。
接着,会被 server 进行消费,消费后的结果也会放入队列,之后会被 client 进行处理。
而这整个过程,线程会进入阻塞状态,这种模式在实际工作中不怎么用。