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-clou-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进行负载均衡,电脑不咋好使,就不截图了。

​​​​​​​单个节点宕机,并不影响整个集群的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556527.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2025,企业管理平台的理想模型V0.1

1.前言 近期出于综合考虑,准备休息一段时间......... 在这段时间里,准备重新梳理下企业管理平台应该具备的能力.并准备使用开源项目来一次组合式组装,最终形成一个初步可行的运行平台。 2.企业管理平台的主要组成 企业管理平台不是独立存…

安卓如何实现双击触摸唤醒点亮屏幕功能-Android framework实战开发

背景 经常有学员朋友在群里问到一个目前市场上常见的功能: 手机待机时候双击屏幕可以唤醒点亮手机屏幕功能 如何实现这个功能,经常有同学在群里求助,今天就刚好来讨论一下这个待机时候双击触摸唤醒点亮屏幕的功能的实现方案。 功能核心方案设…

深入理解 Spring Cache 的工作原理及集成其它第三方缓存

目录 1、Spring Cache 简介2、常用注解2.1、常用注解介绍2.2、常用注解的主要参数 3、缓存注解上 SPEL 表达式可使用的元数据4、入门案例4.1、引入依赖4.2、开启缓存功能4.3、使用缓存4.3.1、新建一个 UserServiceImpl4.3.2、新建一个 UserController 5、工作原理5.1、缓存自动…

Python从0到100(六十二):机器学习实战-预测波士顿房价

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

77寸OLED透明触摸屏有哪些应用场景

说到77寸OLED透明触摸屏,那可真是市场营销中的一大亮点,应用场景多到数不清!我这就给你细数几个热门的: 商业展示:这可是77寸OLED透明触摸屏的拿手好戏!在高端零售店铺里,它可以作为陈列窗口&am…

大模型之大模型压缩(量化、剪枝、蒸馏、低秩分解),推理(vllm)

目录 前言 一、模型量化(quantization) 1. 量化概念 2. 模型量化优点 3. 什么情况下应该/不应该使用模型量化 4. 落地挑战 5. 量化方法 5.1 量化训练(Quant Aware Training, QAT) 原理 [伪量化节点(fake quant)](https://blog.csd…

​通用代码生成器典型应用场景​

​通用代码生成器典型应用场景​ 1. 通用代码生成器简介 通用代码生成器或称动词算子式通用代码生成器,是一系列各种语言的易用的整站式代码生成器。其根本原理是把方法分解成动词算子和域对象的笛卡儿积。根据动词算子式代码生成器的基本原理。所有方法&#xff…

[uni-app]小兔鲜-08云开发

uniCloud可以通过JS开发服务端,包含云数据库, 云函数, 云存储等功能, uniCloud可结合 uni-ui 组件库使用 效果展示: <picker>城市选择组件不支持h5端和APP端, 所以我们使用 <uni-data-picker>组件进行兼容处理 <uni-data-picker>的数据使用云数据库的数据 云…

项目——超级马里奥——Day(2)

争取今天晚上能搞一半啊&#xff0c;啊啊啊啊&#xff0c;感觉事多的忙不过来 设计思路&#xff1a; 1&#xff09;创建并完成常量类 ------->一张图片的情况 先完成对图片的封装------>把图片加载一遍 &#xff08;老实说&#xff0c;我也不太知道为什么&#xff0…

Stable Diffusion整合包与手动本地部署结合内网穿透远程AI绘画!

前言 文章目录 前言1. 本地部署Stable Diffusion Web UI 1.1 整合包安装1.2 手动安装Stable Diffusion Web UI 2. 安装Cpolar内网穿透3. 实现公网访问Stable Diffusion Web UI4. 固定Stable Diffusion Web UI 公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学…

六自由度机械重力补偿控制

1.动力学方程 六自由度机械臂动力学方程形式如下&#xff1a; 进行重力补偿&#xff0c;就是在驱动力矩中对重力G进行补偿&#xff0c;从而消除重力的影响&#xff0c;这样就能够在进行闭环控制的时候避免重力影响带来的大超调问题&#xff0c;使得机器人更好的实现轨迹跟踪控…

(附源码)基于springboot的“我来找房”微信小程序的设计与实现-计算机毕设 23157

基于springboot的“我来找房”微信小程序的设计与实现 摘要 随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级的应用程序形式&#xff0c;已经成为人们日常生活的重要组成部分。为了满足广大用户在租房方面的需求&#xff0c;本文设计并实现了一个基于SpringBoot…

FredNormer: 非平稳时间序列预测的频域正则化方法

时间序列预测是一个具有挑战性的任务,尤其是在处理非平稳数据时。现有的基于正则化的方法虽然在解决分布偏移问题上取得了一定成功但仍存在局限性。这些方法主要在时间域进行操作,可能无法充分捕捉在频域中更明显的动态模式,从而导致次优的结果。 FredNormer论文的研究目的主要…

【C++】认识匿名对象

文章目录 目录 文章目录前言一、对匿名对象的解读二、匿名对象的对象类型三、匿名对象的使用总结 前言 在C中&#xff0c;匿名对象是指在没有呗命名的情况下创建的临时对象。它们通常在单个语句中执行一系列操作或调用某个函数&#xff0c;并且不需要将结果存放进变量中。 匿名…

Oracle登录报错-ORA-01017: invalid username/password;logon denied

接上文&#xff1a;Oracle创建用户报错-ORA-65096: invalid common user or role name 我以为 按照上文在PDB里创建了用户&#xff0c;我以为就可以用PLSQL远程连接了&#xff0c;远程服务器上也安装了对应版本的Oracle客户端&#xff0c;但是我想多了&#xff0c;客户只是新建…

使用Python查找WeChat和QQ的安装路径和文档路径

在日常工作和生活中&#xff0c;我们经常需要查找某些应用程序的安装位置或者它们存储文件的位置。特别是对于像WeChat&#xff08;微信&#xff09;和QQ这样的即时通讯软件&#xff0c;了解它们的文件存储位置可以帮助我们更好地管理我们的聊天记录和共享文件。今天&#xff0…

【Diffusion分割】Cold SegDiffusion:医学图像分割的扩散模型

Cold SegDiffusion: A novel diffusion model for medical image segmentation 摘要&#xff1a; 随着深度学习的发展&#xff0c;扩散模型在医学图像分割任务中表现出了卓越的性能。然而&#xff0c;传统的分割扩散模型通常采用随机高斯噪声生成分割掩膜&#xff0c;导致分割…

Java建筑行业智能化管理系统源码,PC端、手机端、大屏端源码,智慧工地管理平台源码,智慧建设平台 智慧住建平台

智慧工地平台全套源码合作 智慧工地是指运用现代信息技术&#xff0c;如物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;、云计算、移动互联网等&#xff0c;对传统建筑工地进行智能化改造和管理的新型工地。它通过高度集成的系统和设备&#…

NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

一、写在开头 大家好,Build哥回来啦!停更了大概2个月之久,之前有段时间去写小说去了,后来又因为公司活太多,牛马干的太投入,就拉下了博客的更新,国庆节期间,难得的闲下来,准备回归老本行啦。 大致的翻看了一下之前更新的内容,已经写到了Java的IO部分,作为网络传输…

eNodeB User Manual-Introduction

eNodeB architecture ### 概述 srsENB是一个完全由软件实现的LTE eNodeB基站。它作为一个应用程序运行在标准的基于Linux的操作系统上&#xff0c;能够连接到任何LTE核心网络&#xff08;EPC&#xff09;并创建一个本地LTE小区。为了通过空气传输和接收无线电信号&#xff0c;…