RabbitMQ消息丢失问题和保证消息可靠性-消费端不丢消息和HA(二)

2023-09-17 13:57
-->

继续上篇文章解决RabbitMQ消息丢失问题和保证消息可靠性(一) 未完成部分,我们聊聊MQ Server端的高可用和消费端如何保证消息不丢的问题?

回归上篇的内容,我们知道消息从生产端到服务端,为了保证消息不丢,我们必须做哪些事情?

  • 发送端采用Confirm模式,注意Server端没成功通知发送端,需要重发操作需要额外处理
  • 消息的持久化处理

上面两个操作保证消息到服务端不丢,但是非高可用状态,如果节点挂掉,服务暂时不可用,需要重启后,消息恢复,消息不会丢失,因为有磁盘存储。

本文先从消费端讲起:

RabbitMQ Server到消费者消息如何不丢?

上面一篇文章也提到了,消费者获取到消息之后,没有来得及处理完毕,自己直接宕机了,因为消息者默认采用自动ack,此时RabbitMQ的自动ack机制会通知MQ Server这条消息已经处理好了,此时消息就丢了,并不是预期的。

那么我们采用手动ack机制来解决这个问题,消费端处理完逻辑之后再通知MQ Server,这样消费者没处理完消息不会发送ack,如果在消费者拿到消息,没来得及处理的情况下自己挂了,此时MQ集群会自动感知到,它就会自觉的重发消息给其他的消费者服务实例。

根据上面的思路你需要完成下面的两步操作:

第一:消费者监听设置手动ack

  1. this.channel = channelManager.getListenerChannel(namespace);
  2. this.queue = queue;
  3. this.channel.basicConsume(queue, false, consumerTag, this);
  4. this.disconnectedCallback.setChannel(channel);

核心代码: this.channel.basicConsume(queue, false, consumerTag, this); 第二个参数设置 false 代表不自动ack

第二:业务执行完成后手动ack

  1. public static void ack(MessageContext context) {
  2. long deliveryTag = context.getEnvelope().getDeliveryTag();
  3. try {
  4. context.getChannel().basicAck(deliveryTag, false);
  5. } catch (IOException e) {
  6. throw new MqAckException("消息ack出错:连接异常或远端关闭", context, e);
  7. }
  8. }

核心代码: context.getChannel().basicAck(deliveryTag, false);

这里封装来,需要业务在执行完自己的业务代码后,调用对象channel 的ack方法通知MQServer,说我这边执行完了,你可以删除了。

注意这里有个问题: 如果忘记调用这个 context.getChannel().basicAck(deliveryTag, false);

或者因为代码异常,这个代码没被执行,会怎么样?后面找时间再写一篇文章讲这个问题。

RabbitMQ Server中存储的消息高可用

当我们解决了,生产端和消费端的问题后,基本保证消息的不丢问题,但是还有一个是消息的高可用问题,单节点问题,普通节点的问题都会影响消息的临时不可用,这个时候要用上我们的HA 镜像集群模式来保证。

上一篇文章 解决RabbitMQ消息丢失问题和保证消息可靠性(一) 已经提到过,服务端消息部署的三种模式的区别,今天就专门讲镜像模式的介绍。

镜像模式至少采用3节点,2个磁盘节点和1个内存节点来保证,架构图:

设置镜像也有一些策略:

  • 同步至所有的,一般不这么做,性能会受到极大影响
  • 同步最多N个机器
  • 只同步至符合指定名称的nodes

命令处理HA策略模版:rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

  1. 为每个以“rock.wechat”开头的队列设置所有节点的镜像,并且设置为自动同步模式
  1. rabbitmqctl set_policy ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
  2. rabbitmqctl set_policy -p rock ha-all "^rock.wechat" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
  1. 为每个以“rock.wechat.”开头的队列设置两个节点的镜像,并且设置为自动同步模式
  1. rabbitmqctl set_policy -p rock ha-exacly "^rock.wechat" \
  2. '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
  1. 为每个以“node.”开头的队列分配指定的节点做镜像
  1. rabbitmqctl set_policy ha-nodes "^nodes\." \
  2. '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'

但是:HA 镜像队列有一个很大的缺点就是: 系统的吞吐量会有所下降

所以采用镜像模式,要根据具体的业务规则定制话处理,没那么重要的业务,消息丢了也没关系的场景,又要求必须高的性能的时候,镜像也可以不用设置。

总结

两篇文章的讲解,分析了消息中间件高可用问题的大概的思路,没有具体的代码详细,如有疑问可以下方留言评论,我会及时回复解答,后面我会逐步完善相关细节,欢迎多多关注。

后面计划更新文章如下:

  • 什么情况会导致重复消费并怎么解决?
  • 什么样的真实业务场景需要保障顺序性和如何保证消息的顺序性?
  • 如何通过消息队列优雅的解决微服务间接口失败的重试?

推荐阅读

解决RabbitMQ消息丢失问题和保证消息可靠性(一)

IntelliJ IDEA提升效率开发插件必备

END

如有收获,请帮忙转发,后续会有更好文章贡献,您的鼓励是作者最大的动力!

欢迎关注我的公众号:架构师的修炼,获得独家整理的学习资源和日常干货推送。

-->

相关文章

告别阿里“大锅饭”,优酷何去何从?

2023-10-05 20:39
李智表示,首先,他们工作室的员工没有参加阿里的年度绩效考核。 13工资变成了12工资,大家的工资变成了底薪+奖金。能否拿到奖金的考核标准很简单,就是能否完成项目。初始 KPI 目标设定。李智表示,业务...

vs2010激活码安全_Visual S

2023-10-05 19:54
YCFHQ-9DWCY-DKV88-T2TMH-G7BHPVisual Studio 2010激活码 Visual Studio 2010注册码 YCFHQ-9DWCY-DKV88-T2TMH-G7B...

stm32单片机可以做什么项目(stm3

2023-10-05 19:54
stm32单片机可以做什么项目(stm32单片机可以做什么项目)有谁知道企业一般使用哪些STM32产品?学了这个以后在深圳找工作待遇怎么样?STM32 是一款 32 位微控制器。一般用于工业控制、仪器...

progisp可以烧录 51_progi

2023-10-05 19:51
本文内容列表:1.如何烧写arduino bootloader2、如何使用progisp1.72编程?对于stc的89c51,我可以只使用isp刻录器吗?3、AT系列51单片机串口编程方法4、ATME...

vs2010中三角函数_系列概述 - A

2023-10-05 18:25
1.下载gsl1. 从http://gnuwin32.sourceforge.net/packages/gsl.htm 下载完整包,除了sources 和Sources 两个exe 文件。 (注:我从...

PHP使用cURL相关函数设置代理并处理

2023-10-05 18:12
设置代理:如果需要通过代理服务器访问目标URL,可以使用以下cURL相关函数来设置代理:curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com:8080'...

Python核心编程1

2023-10-05 18:12
Python是一种动态语言1。动态语言的定义动态编程语言是高级编程语言的一类,已广泛应用于计算机科学领域。它是一种结构可以在运行时更改的语言:例如,可以引入新函数、对象甚至代码,可以删除现有函数,或者...

Python多线程和锁

2023-10-05 18:12
多线程类似于同时执行多个不同的程序。多线程具有以下优点:(1)使用线程可以将长期的程序任务放到后台处理。(2)用户界面可以更加美观,这样如果用户点击按钮触发某些事件的处理,可以弹出进度条来显示处理的进...

合友网络安全:保护您的数字生活(合友网络

2023-10-05 17:54
如今,互联网已经成为不可或缺的一部分,一切形式的生活和工作都与互联网有关。然而,随着互联网的广泛使用和数字生活方式的普及,网络安全问题日益严重。大量私人信息被网络黑客窃取,甚至个人和国家安全受到威胁。...

Redis漏洞危害及防范(什么是redi

2023-10-05 17:51
Redis漏洞:危害及防范Redis 是一个高性能的键值存储系统。由于其速度快、部署简单、使用方便等优点,已广泛应用于各种业务场景。然而Redis本身也存在很多漏洞。最致命的漏洞称为“未经授权的访问”...

如何查看Redis中的连接数(redis

2023-10-05 17:51
Redis是一个开源的NoSQL数据库,因其高性能、扩展性强等优势,在互联网领域得到广泛应用。在Redis中,连接数是一个非常重要的指标,它直接影响Redis的性能和稳定性。那么,如何查看Redis的...

Linux输入法安装指南(如何安装lin

2023-10-05 17:51
Linux系统中输入法的安装非常简单,即使是新手也可以完成安装,无需太麻烦。我们来看看Linux输入法安装指南。1。安装Linux必要的环境文件开始安装输入法之前,需要安装Linux平台必需的环境文件...

windows7原版iso镜像下载_wi

2023-10-05 17:37
哪里下载windows7原版iso镜像文件稳定?很多用户在选择系统的时候,都希望可以安装正版系统。因为正版系统永久激活,可以长期使用。那么今天系统城小编就和大家分享windows7原版镜像文件下载地址...

win7官方原版镜像下载地址|免费下载w

2023-10-05 17:37
win7官方原版镜操作界面深受用户喜爱,凡是有给电脑安装过win7官方原版镜像系统的用户都说很好用。集成最全面的硬件驱动,精心挑选的系统维护工具。既然小伙伴这么喜欢win7官方原版镜像系统,今天就让小...

win7中文正式版下载 win7官网原版

2023-10-05 17:37
微软作为一个国外的电脑公司,推出的原版软件大部分都是英文版的,所以对于部分中国用户来说不太习惯使用,有很多的小伙伴想要寻找Windows7官网中文原版镜像文件下载却总是找不到或者依然时英文版的,所以今...

年度爆文