RabbitMQ事务模块
目录
消息分发
负载均衡
幂等性保障
顺序性保障
顺序性保障方案
二号策略:分区消费
三号策略:消息确认机制
四号策略:
消息积压
RabbitMQ集群
选举过程
RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,要么全部成功,要么全部失败,
1.不采用事务:
正常来说,这种情况发一个,然后一个出错了,,第一条消息成功,这样就会第二条消息会不成功
@RequestMapping("/trans")public String trans(){System.out.println("trans test ....");rabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE,"trans test 1..");int num=5/0;rabbitTemplate.convertAndSend("",Constants.TRANS_QUEUE,"trans test 2..");return "消息发布成功";}2.采用事务
还需要下面这两个一个创建Manager,还要加上@Transactional,事务,要么都成功,要么都失败
消息分发
当队列中有多个消费者时候,队列会把消息分派给不同的消费者,每条消息只会发送给订阅列表里面的一个消费者
channel.basicQos方法:来限制当前信道上的消费者所能保持的最大未确认消息的数量
场景理解:
通过设置prefetchCount参数,同时必须要设置消息应答方式为手动应答.
prefetchCount:控制消费者从队列中预取(prefetch)消息的数量,以此来满足流控制和负载均衡
未确认5个,等待发送15个
通过这里可以看到1号处理速度快,2号速度慢
负载均衡
公平分发,五五分成,一个处理任务快,一个处理慢,就会造成快的一直处于忙的状态,而
幂等性保障
幂等性是数学和计算机中某些运算的性质,可以被多次应用,而不改变初始应用结果
数据库的select操作,不同时间两次查询结果可能不同,但是这个操作符合幂等,幂等事对资源的影响,而不是返回结果,查询操作对资源本身不会影响,之所以结果不同,可能是中间有其他操作对资源造成了修改。
应用上的幂等性,对于同一个订单,订单系统多次调用支付系统,支付系统只能处理一次扣款
MQ幂等性介绍,同等消息多次消费,对系统的影响是相同的。
Exactly once:恰好一次,每条消息肯定会被传输一次且仅传输一次(没人实现,性能太低)
At most once:可能会丢失,但是绝对不会重复传输
At least once:最少一次,消息绝对不会消失,但是有可能会重复(比如支付系统,出现这个就麻烦了,
解决方案:(所有MQ都面临这个问题)当消费者收到重复消息,如何处理
全局唯一ID:
1.每一条消息分派唯一ID(UUID,自增ID,业务ID,时间戳+业务ID,时间戳+业务ID)
2.消费者收到消息后,先用id判断该消息是否已经消费过,假如已经消费过,则放弃处理
3.如果未消费过,消费者开始消费消息,业务处理成功后,把唯一ID保存起来(数据库/redis)redis 原子性操作setnx(set if not exists)来保证幂等性,唯一ID作为key放到redis中,返回1,说明之前没有消费过,正常消费返回0,说明这条消息已经消费过,抛弃。
业务逻辑判断
检查数据库中是否存在相关数据记录,或者使用乐观锁机制来避免更新已被其他事务更改的数据,再或者处理消息之前,先检查相关事务状态,确保消息对应操作尚未执行,然后才进行处理,具体根据业务场景来处理.
顺序性保障
消费者,消费消息的顺序和生产者生产消息的顺序保持一致,比如生产者发送消息的顺序为msg1,msg2,msg3,那么消费者也安装msg1,msg2,msg3顺序进行消费
哪些情况可能会打破RabbitMQ的顺序性呢?
1.多个消费者:队列配置多个消费者时候,消息可能被不同的消费者并行处理,从而导致消息处理的顺序性无法保证。
2.网络抖动或者异常:消息传递过程中,出现网络波动或者异常
3.消息重试:消费者处理消息后未能及时发送确认或者确认消息在传输过程中丢失,那么MQ可能会认为消息未被成功消费而重试
4.消息路由:在复杂的路由场景中,可能会根据路由键被发送到不同队列,无法保障顺序
5.死信队列:消息因为某些原因被放入死信队列,死信队列被消费,无法保证消息的顺序和生产者发送顺序一致。
顺序性保障方案
局部顺序性保证,全局顺序性保障
二号策略:分区消费
当需要多个消费者来提高处理速度时候,可以使用分区消费,把一个队列分割成多个分区,每个分区由一个消费者处理,以此来保持每个分区消息的顺序性.
订单状态修改:1.创建 2.取消 3.已支付 4.已经删除
同一个订单ID的消息,保持顺序性就可以了
业务逻辑:根据订单ID,进行hash(或者其他算法),同个订单ID,经过这个算法,得到的队列名称是一致的(基于spring-cloud-stream操作)
三号策略:消息确认机制
保证在一个队列中,是顺序性的
四号策略:
有时候,即使消息乱序,但是也可以在业务层实现顺序控制,如在消息中嵌入序列号等,并在消费时候,根据这些消息来处理。
消息积压
消息生产过快:在高流量或者高负载的情况下,生产者以极高的速率发送消息,超过了消费者的处理能力(消费者处理不过来)
消费者处理能力不足:消费者处理处理消息的速度跟不上消息生产的速度,也会导致消息在队列中积压
1)消费端业务逻辑复杂,消耗时间长
2)消费端代码性能低
3)系统资源限制,如cpu,内存,磁盘IO等也会限制消费者处理消息的速率。
4)异常处理不当:消费者在处理消息时候,出现异常,导致消息无法被正常处理和确认
网络问题:网络延迟或则会不稳定,消费者处理无法及时接收或者确认消息,最终导致消息积压
RabbitMQ配置过低
解决方案:
1.提高消费者效率:
1)增加消费者实例数量,比如新增机器
2)优化业务逻辑,比如实现多线程来处理业务
3)设置prefetchCount,当一个消费者阻塞时,消息转发到其他未阻塞的消费者
4)消息发生异常,设置合适的重试策略,或者转入到死信队列
2.限制生产者速率:比如流量控制,限流算法等
a.流量控制:在消息生产者中实现流量控制逻辑,根据消费者处理能力动态调整发送速率
b.限流:使用限流工具,为消息发送速率设置一个上限
c.设置过期时间.如果消息未被消费,可以配置死信队列,以避免消息丢失,并且减少对主队列的压力
3.资源与配置优化:
比如升级RabbitMQ服务器硬件,调整RabbitMQ的配置参数等等。
RabbitMQ集群
多机多节点:要求在同一个局域网上,这样(他会没有延迟)
三台机器分别安装RabbitMQ,三个版本最好一致
ifconfig(内网IP) more /etc/hostname #查看主机名称
vi /etc/hosts (在这里面编辑,获取完上面两个后粘贴进去)不能写错
比如本地是7Z,我们在b
scp /var/lib/rabbitmq/.erlang.cookie root@iZ2xxxxx8Z:/var/lib/rabbitmq/
单机多节点:伪集群
主节点关闭后,队列从节点也会自动消失
换句话说,数据只存在于主节点,从节点并不存在,如果关闭的是rabbit2,那么testQueue2的数据会消失.
仲裁队列:
一种基于Raft一致性算法实现的持久化实现的队列,仲裁队列提高队列复制能力,保证数据的高可用和安全性,使用仲裁队列可用在RabbitMQ节点进行队列数据的复制,从而达到在一个节点宕机时,队列仍然可以提供服务的效果.
Raft是一种共识算法,旨在实现高可用性和数据的持久性,通过节点间复制数据,来保证分布式系统中的一致性.
选主:
每个节点处于以下三种角色之一:
Leader(领导制):负责处理所有的客户请求,并将这些请求作为日志复制项,复制到所有Foolower,Leader定期向所有Foller发送心跳消息,以维持领导者地位,防止Follower进入选举过程
Follow(跟随者):接收来自Leader的日志条目,并且在本地应用这些条目,跟随者不直接处理客户请求
Candidate(候选者):当跟随者在一段时间内没有收到来自Leader的心跳消息时候,他就不确定Leader是否可用,这种情况下,跟随者变成候选者,并且尝试投票过程选举Leader.
正常情况:
集群中只有一个Leader,其余都是follow
任期:
Raft将时间划分任意长度的任期,每一段任期从一次选举开始,此时会有一个或者多个candidate尝试变成leader,在成功一次完成选举后,这个leader会一致管理集群,直到任期结束,在某些情况下,一次选举选不出来leader,这个时候任期会以没有leader而结束
RequestVote RPC:请求投票,由candidate在选举过程中发出
AppendEntries RPCs:追加条目,由leadeer发出,用来做日志复制和提供心跳机制。
选举过程
当服务器启动,所有节点都是follow状态,如果follower在election timeout内没有收到来自leader的心跳,则会主动发起选举
为了解决情况三循环:Raft采取选举超时时间,确保很少产生无结果投票,并且就算发生了也能很快解决,为了防止选票一开始就瓜分,一半超时时间有一个固定区间(150-300ms)随机选择,一半超时时间短了,会重新选举更快,这样就可以赢得选举,并且在其他服务器超时之前,发送心跳
仲裁队列,如果集群中节点少于5个,一主两从
大于5个,则一主四从,假如7个,也是一主四从
使用HAProxy进行负载均衡,电脑不咋好使,就不截图了。
单个节点宕机,并不影响整个集群的使用。
相关文章:
RabbitMQ事务模块
目录 消息分发 负载均衡 幂等性保障 顺序性保障 顺序性保障方案 二号策略:分区消费 三号策略:消息确认机制 四号策略: 消息积压 RabbitMQ集群 选举过程 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,要么全部成功,要么全…...
Android终端GB28181音视频实时回传设计探讨
技术背景 好多开发者,在调研Android平台GB28181实时回传的时候,对这块整体的流程,没有个整体的了解,本文以大牛直播SDK的SmartGBD设计开发为例,聊下如何在Android终端实现GB28181音视频数据实时回传。 技术实现 Andr…...
AI金融攻防赛:金融场景凭证篡改检测(DataWhale组队学习)
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何解决 金融场景凭证篡改检测的核心问题,以及解决思路和代码实现过程。希望…...
华为OD机试真题---喊7的次数重排
题目描述 喊7是一个传统的聚会游戏。N个人围成一圈,按顺时针从1到N编号。编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1。但是,当将要喊出来的数字是7的倍数或者数字本身含有7时,不能把这个数字直接喊出来&#x…...
使用阿里巴巴的图
参考链接1 引用彩色图标可参考以下链接 (到第三步 测试图标效果 的时候 还是可以保持之前的写法:<i/sapn class“iconfont icon-xxx”>也会出现彩色的) 参考链接2 阿里巴巴字体使用 也可以直接将官网的代码复制过来到页面的css区域...
【hot100-java】排序链表
链表题。 使用归并排序法。 一图解决。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; thi…...
腾讯云视立方TRTCCalling Web 相关
基础问题 什么是 TRTCCalling? TRTCCalling 是在 TRTC 和 TIM 的基础上诞生的一款快速集成的音视频的解决方案。支持1v1和多人视频/语音通话。 TRTCCalling 是否支持接受 roomID 为字符串? roomID 可以 string,但只限于数字字符串。 环境问题 Web …...
使用argparse库实现命令行参数解析的实用指南
使用argparse库实现命令行参数解析的实用指南 在现代软件开发中,命令行工具的使用越来越普遍。无论是自动化脚本、数据处理工具,还是系统管理工具,命令行参数解析都是一个不可或缺的功能。Python的argparse库提供了一种简单而强大的方式来处理命令行参数,使得开发者能够轻…...
kafka消息队列核心内容及常见问题
目录 1. 使用消息队列的目的(优点与缺点) 2. 常见各消息队列对比 3. kafka介绍 3.1 kafka简介 3.2 kafka特点 3.3 kafka系统架构 3.4 设置数据可靠性 3.4.1 Topic 分区副本 3.4.2 消息确认机制 4. 常见问题(面试题) 4.…...
电脑无线网wifi和有线网同时使用(内网+外网同时使用)
一、要求 我这里以无线网wifi为外网,有线网卡为内网为例: 一、基本信息 无线wifi(外网):ip是192.168.179.235,网关是192.168.179.95有线网(内网):ip是192.168.10.25&…...
Ubuntu22.04阿里云服务器 Gitlab搭建CICD
gitlab搭建cicd流水线教程 1、阿里云申请免费云盘 申请免费云盘用于创建gitlab 申请方法百度 2、安装gitlab-ce 更新系统: sudo apt update sudo apt upgrade -y 安装必要的依赖: sudo apt install -y curl openssh-server ca-certificates pos…...
2024最新全流程ChatGPT深度科研应用、论文与项目撰写、数据分析、机器学习、深度学习及AI绘图
2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。 2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其…...
网络流C++
网络流问题及其应用 网络流问题是图论中的一个经典问题,应用于交通调度、物流配送、计算机网络等领域。它通过模型化图中的流量传递过程,解决从源点传递流量到汇点的最优流量分配问题。本文将介绍网络流的基本概念、几种经典算法,并通过一个…...
RTC -
RTC 目录 RTC 回顾 RTC 如何实现RTC制作一个时钟日历 代码编写 rtc.c完整代码 模块开发的步骤: 1、找文档 2、 在文档里面找通信方式,通信过程(协议) 3、代码> -- 前面学的是模块的开发,串口类,I…...
图像处理中常用的统计矩
目录 原点矩中心矩常用的统计矩偏度(Skewness)定义解释 峰度(Kurtosis)定义解释 统计矩的应用MATLAB相关函数 原点矩(Moment about the Origin)和中心矩(Central Moment)是概率论和数…...
Ubuntu 详解| Ubuntu ssh| Ubuntu apt命令大全| Ubuntu性能优化| Ubuntu换镜像源
Ubuntu 是Debian开源linux系统体系下的子分支之一 Debian-ubuntu 和它一样的还有 kali(一款渗透测试软件) Debian-kali 小白参考 :Centos 7.9 安装 图解版 小白必看 最新_centos7.9-CSDN博客文章浏览阅读2.5k次,点赞…...
Linux安全命令(Linux Security Commands)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
2024最新版安装教程!Python安装+PyCharm安装使用教程!!(非常简单)
Python下载安装 一、进入Python官网首页,下载最新版的Python 官方网址:Download Python | Python.org 鼠标悬浮在Downloads,选择最新版本 注意:由于Python官网服务器设立在国外,所以下载速度非常慢,我这…...
C++:STL:vector类常用函数介绍(附加部分重要函数模拟实现)
cplusplus.com/reference/vector/vector/https://cplusplus.com/reference/vector/vector/ vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,有了string的基础,vector其实大体使用方法上二者是类似的: 这里我们先给…...
[工程构建] 使用 pkg-config 的 cmake 模板
可执行文件 # 1) cmake basic cmake_minimum_required(VERSION 3.12) #cmake version check set(CXX_STANDARD 17) #c standard version)# 2) project info #auto generated variables as below: #PROJECT_NAME: "hello" #hello_BINARY_DIR: build root dir #hello_…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...










