RabbitMQ学习 (二)---多消费者工作时的消息处理

ACK

在上一篇中,我们尝试安装并且运行了一个一对一的MQ,这一篇中,我们来看下多消费者和持久化相关的问题!

在我们的应用中,应用通常部署多个服务(当然,你部署一台我也没办法,/表情包),因为即使我们的一台机器挂掉了,还有其他的机器提供着支持。所以应用到MQ的场景中,比如我们有N台生产者,然后有C1、C2 两台消费者,P生产消息到队列,然后C1 、C2进行消费(这里之所以会提到多消费者,是因为如果我们只有一台消费者的话,队列中的消息太多的话,消费者只能一直在处理消息,直到全部处理完,这样如果这台消费者还有其他要处理的业务的话,只能和处理消息的业务线程进行竞争,造成业务的处理不及时)。

在消费者处理消息的时候会有处理时间,我们前面使用的代码一旦向消费者发送消息,队列就会标记为立即删除,此时,一旦消费者突然挂掉,我们就失去了要处理的消息,但是我们肯定不想失去任何消息,如果C1消费者挂掉,我们就转给C2消费者进行处理。

RobbitMQ支持消息确认。消费者返回ACK,通知队列已经成功的处理消息,可以进行操 作,这样就避免了消息的执行失败,被队列删除。即如果消费者没有返回ACK,那么队列将把同样的消息发送给其他的消费者,确保消息的执行。

接口 中表示了如果时true,则时一次性消息,如果false,则是确认的消息。

所以我们消费者的代码只要改动一下即可

持久性

我们已经确认了消息的执行返回,但是这样只是在消费者中的保证,如果时RabbitMQ 服务器挂掉的话,我们的消息仍旧会丢失。

因此我们应该将队列的消息标记为持久。即使服务器挂掉了,再重启,仍旧会保留队列中的消息。

为了引入MQ的持久性,我们要在现有的代码中有2个地方的改动。

当然,此时服务器并没有因为这个地方声明了durable是True就持久性了,因为我们的队列名称仍旧是hello_word,RabbitMQ不允许对现有的队列声明不同的配置,可能是一种保护,因此,我们有一个更加简单的办法,就是更换一个新的队列名称。

然后在发布消息消息的时候声明MessageProperties.PERSISTENT_TEXT_PLAIN

这样,即使服务器重新启动了,仍旧会保留现有的消息

注意:

MessageProperties.PERSISTENT_TEXT_PLAIN 告诉MQ Server是一个持久性的消息, 但是消息持久化并不能完全保证消息不会丢失。

 虽然它告诉RabbitMQ将消息保存到磁盘,但是当RabbitMQ接受了消息并没有保存它时,仍然有一个短时间窗口。

另外MQ并不是对每个消息都保存到磁盘中,它可能只是保存到缓存中。

所以我们的服务器应该也具有集群的特点才可能最大化的去保存消息。

公平性

还是引入我们上一节的韩信打野问题,假如我们在开局的时候,遇到抢位置,双打野的情况的时候,就会很尴尬。韩信把红buff和蓝buff都打了,阿珂找不到野了,一生气,你不给我野怪打,我就去送或者挂机,那样我们的体验会很差。

因此,我们要有一个公平的办法,就是韩信打红buff,阿珂打蓝buff。更好的带领我们走向胜利。

在RabbitMQ中,我们可以使用channel.basicQos()方法,设置每个消费者需要处理的消息数,比如设置channel.basicQos(1),这样每个消费者只处理一个消息,韩信也只打一个野怪,剩下的另一个野怪给阿珂打,等韩信打完红buff后,再去打其他的野怪。如果只有韩信一个的话,当然所有的野怪都给它。

今天的MQ 我们就介绍到这里,有什么不对的地方请大家积极反馈

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Linux上搭建Terraria 游戏服务器?

Terraria是一款二维沙盒游戏,类似于Minecraft(我的世界),允许玩家在开放的世界中探索,构建和战斗。2015年,Terraria开发者宣布支持Li...

77530
来自专栏移动安全

移动安全加固基础版操作指引

乐固加固提供了专业版加固服务,相比普通版本整体保护强度更高,主要包括SO加壳保护、APK 防二次打包保护、资源防篡改、内存防dump等服务,目前服务于公司内百万...

50360
来自专栏散尽浮华

Netdata---Linux系统性能实时监控平台部署记录

通常来说,作为一个Linux的SA,很有必要掌握一个专门的系统监控工具,以便能随时了解系统资源的占用情况。下面就介绍下一款Linux性能实时监测工具-Netda...

95880
来自专栏Linux运维学习之路

zabbix自动发现与自动注册及SNMP监控

自动发现与自动注册 自动发现:zabbix Server主动发现所有客户端,然后将客户端登记自己的小本本上,缺点zabbix server压力山大(网段大,客户...

91680
来自专栏木头编程 - moTzxx

VMWare14 安装Mac OS系统(图解)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

2.3K30
来自专栏公有云大数据平台弹性 MapReduce

YARN之label调度在EMR中的应用

在腾讯云EMR的用户场景使用当中,有部分用户要求希望他们能在任务高峰期,对集群进行扩容,利用云端的弹性计算资源,为集群扩展计算能力,并且在集群相对空闲的情况下,...

32630
来自专栏java一日一条

数据库的读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务...

11530
来自专栏杂烩

一个综合的分布式项目之项目环境准备 原

    创建maven项目相信看到这的oscer都会,这里就不赘述,主要贴出一些配置文件(限于篇幅随意贴了点,全部的请看github上)。

7910
来自专栏ionic3+

Cordova插件使用——Office文档在线预览那些事

第一种方式,有两种实现方法,一是使用在线的接口(如谷歌、微软……但前者被墙,后者付费使用,当然也可以自己部署个接口处理转换,不想特别折腾也可以用微软的offic...

1K40
来自专栏FreeBuf

你可曾想过在iOS上跑Linux?

你可曾想过在IOS设备上运行Linux系统?或者用shell来传输文件、编写脚本,又或者使用Vi来开发代码?

17320

扫码关注云+社区

领取腾讯云代金券