首页 > 其他分享 >共性化异步任务处理方案

共性化异步任务处理方案

时间:2024-01-29 09:45:53浏览次数:23  
标签:异步 方案 ack 轮询 ACK 处理 消息 共性 RabbitMQ

背景

考虑到现有业务很多依赖于MQ的方式进行,这种方式需要依赖于MQ,发送消息到mq和消费mq消息时需要了解mq消息结构进行相应处理;

对于后续对同样的事件做其他处理的人如不能提前了解到已有相应消息发到了mq就得再发一次消息到mq等。

                    图1.1 消息中间件

现需要考虑在不依赖于Mq的形式下如何更优雅地实现异步任务处理!!!

一.消息任务

1.1 现有轮询方式

轮询:针对每一个业务记录一张轮询中间表,通过轮询扫描消费。

优点:

1. 时间性把控粒度高。

2. 每个业务彼此分离,互不干涉。

缺点:

1. 每次创建业务都要建立一张属于自己的轮询表,也要建立一个新的轮询配置。

2. 资源消耗大。

3. 研发效率低。

1.2优化方式

模拟RabbitMq的ACK方式建立一张共性表解决通用性业务的消息体存储,共性化业务通用一个轮询。

模拟RabbitMq的ACK模式,使用轮询的方式替代mq的消息发送机制。制定专属表字段Table_Name模拟RabbitMq的RoutingKey。

每个业务处理通过Table_Name方式实现接口进行派发处理。每个实现了轮询逻辑派发接口的类即可以认为是一个队列。

以这种方式可以有效的实现消息的异步处理。

优点:

1. 代码规范化,每个服务中心只需要建立集中的一个轮询业务;

2. 符合开闭原则,每增加一个轮询处理只要多实现一个接口类即可;

3.可以减少数据库资源的消耗;

4.减少无用代码的增加,提高开发效率。

缺点:

1.由于数据量的增加,轮询压力增大,对特殊业务的轮询时间性无法针对性的把控,需要建立特殊业务轮询处理(增加轮询)。

二.演变模型

2.1演化方向:模型由图1.2 ——》 图1.3

                    图1.2 RabbitMQ

                    图1.3 定时任务模拟图

三.ACK模式

3.1什么是ack模式?

RabbitMQ 的 ACK 模式是指消息确认机制,即消费者消费消息后需要向 RabbitMQ 服务器发送一个 ACK(acknowledgement)信号来告诉服务器该消息已经被处理。

ACK 模式主要有以下两种:

1.自动确认模式(autoAck)

在自动确认模式下,消费者在收到消息后会立即向RabbitMQ 服务器发送一个 ACK 信号,表示该消息已经被消费。

这种模式适用于对于消息的可靠性要求不高的场景,比如日志处理等。

2.手动确认模式(manualAck)

手动确认模式下,消费者需要在处理完消息后,主动向RabbitMQ 服务器发送 ACK 信号。

如果消费者没有发送 ACK 信号,RabbitMQ 认为该消息没有被正确处理,并将该消息重新分发给其他消费者。

此外,在手动确认模式下,如果消费者在处理消息时出现异常,可以通过拒绝消息(NACK)来告诉 RabbitMQ 服务器该消息不能被处理,

此时 RabbitMQ 将会将该消息重新分发给其他消费者或保存到死信队列中。

四.表结构

4.1建立合适的表结构

1. Uid,table_name,msg,remark,ack

2. Hisid,Uid,table_name,msg,remark,ack (历史表,用于记录处理过的消息)

(表名称和字段名称可根据业务自行命名,以上数据结构供参考,可自行根据业务外拓字段)

五.消息体

1.规范化msg的输入形式。可以走切面或者监听的方式异步记录。写一个公用方法写入(特殊业务可调用该方法写入)。

2.规范化Table_Name字段:采用驼峰名称,代表哪个表写进来的数据。

3.规范化ack,默认设置为0;消费完成,写入2表(历史表)。

如有特殊要处理的,可以增加业务逻辑通过ack模式处理,这里ack默认值为0;

默认轮询处理失败一次ack自增1 。通用轮询方法只扫ack默认为0或者1的。

Ack不等于0,1的,通过二次轮询,第二个特殊轮询业务处理。(减少通用轮询的压力,避免造成轮询卡单。消息消费延缓等问题)。

如有特殊业务申请对应轮询:需要申请ack默认值处理。比如特殊业务1,ack值设置100。(0-9不建议,给默认通用轮询留下可用空间;

每次申请的特殊轮询ack默认在原先基础最大值上增加100,每次建立轮询通过这个方案执行的ack都要走申请,避免ack重复)。

六.实现类图

方案一:

                                            图1.4 类图

方案二:

  

                                   图1.5 类图

以上类图开发自行根据习惯可自行选用哪种模式。
如有更好的方式请留言指教,以上供参考。

标签:异步,方案,ack,轮询,ACK,处理,消息,共性,RabbitMQ
From: https://www.cnblogs.com/nihaoyx/p/17993830

相关文章

  • ES数据迁移方案,-自己总结 基于REINDEX_API`
     跨集群ES数据迁移:1.设置白名单在目标ES库(新库)reindex.remote.whitelist:["192.168.9.201:9200"][或者下面参数:reindex.remote.whitelist:"10.*:*"http.cors.enabled:truehttp.cors.allow-origin:"*"]  2.利用kibana修改新ES参数,防止刷新影响性能.   PUT_settings......
  • 华测检测预警解决方案,有效保障人们生命财产安全
    我国地大物博,地质及自然条件多样,因此成为自然灾害高发国家。每年,自然灾害、事故灾害及社会安全事件等突发公共事件导致百万人伤亡,并带来高达数千亿的经济损失。国家和地方应急管理部门的设立标志着政府将根本性地构建应急管理与救援体系、培训应急救援与管理队伍、高效利用应急......
  • 【亿级数据专题】「分布式消息引擎」 盘点本年度我们探索服务的低延迟可用性机制方案
    疾风吹征帆,倏尔向空没。干里在俄顷,三江坐超忽。一孟浩然背景介绍在充满挑战的2023年度,我们不可避免地面对了一系列棘手的问题,例如响应速度缓慢、系统陷入雪崩状态、用户遭受不佳的体验以及交易量的下滑。这些问题的出现,严重影响了我们的业务运行和用户满意度,为了应对这些问题,我们所......
  • 一个例子形象地理解同步与异步
    请看一个示例:同步方式请求接口请求一次接口耗时大约100多毫秒代码一个for循环,循环500次,调用方法Request,Request方法中一个while(true)无限循环,同步方式请求url获取数据。代码点评:要是写一个while(true)没问题,这是想运行500个while(true),这代码是错误的,行不通。应该使用Thread或者T......
  • [postgres]配置主从异步流复制
    前言环境信息IP角色操作系统PostgreSQL版本192.168.1.112主库Debian1215.3192.168.1.113从库Debian1215.3配置主从修改主库的postgresql.conf文件。修改此配置文件需重启数据库服务。归档脚本内容见"附录-clean_archivelog"listen_addresses='*......
  • 蓝牙脂肪秤方案设计与开发
    蓝牙脂肪秤与普通的电子秤主要功能是没有多大区别,他们的区别在于蓝牙脂肪秤是一个可以通过APP连接将数据传送到云端并保存的秤。主要效果是将个人身体数据记录并分析,帮助你在日常生活中随时可查看数据并根据数据合理调节自己的生活健康方式蓝牙脂肪秤方案还可以将你的身......
  • 利用大模型反馈故障的解决方案
    作者观测云数据智能部产品方案架构师范莹莹背景观测云有两个错误巡检脚本,RUM错误巡检和APM错误巡检,代码均开源。错误巡检的主要目的是发现新出现的错误消息(errorstack),原有的巡检在上报了相应的事件报告后,只是定位了问题,并没有给出合适的解决方案。OpenAI的出现,给了解......
  • GET&POST请求和响应的中文乱码解决方案
    Serlvet程序的请求和响应乱码问题get请求与post请求数据乱码publicclassRequestAPIServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{//获取请求......
  • 爬虫-异步抓取一部小说
    一、利用requests请求同步和aiohttp异步,两个结合来获取小说里的内容1、先利用cookie和session来实现登录根据post请求,带入参数来建立会话,并获取session利用session来进行同步请求获取,每一章节的名称和链接地址 通过上面的图,发现在/html/body/div[5]/dl/dd范围内的a标签......
  • 公司用的亿级大表拆分方案,yyds!
    作者:天机术士来源:juejin.cn/post/7078228053700116493前言笔者是在两年前接手公司的财务系统的开发和维护工作。在系统移交的初期,笔者和团队就发现,系统内有一张5000W+的大表。跟踪代码发现,该表是用于存储资金流水的表格,关联着众多功能点,同时也有众多的下游系统在使用这张表的......