共性化异步任务处理

背景

考虑到现有业务很多依赖于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 类图

方案二:  

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么说2023年是AI元年

前言 思考者~ 2023年被称为AI元年,主要是因为在这一年中,人工智能技术在各个领域取得了突破性的进展和应用,这些技术的广泛应用深刻地影响了人们的生活和工作方式,也预示着未来AI技术的更大潜力和发展空间。 首先,…

第 8 章:Linux中使用时钟、计时器和信号

在本章中,我们将开始探索Linux环境中可用的各种计时器。随后,我们将深入了解时钟的重要性,并探讨UNIX时间的概念。接下来,我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后,我们将进入std::chrono的领域&…

透明拼接屏生产全解析:从生产流程到质量标准与出货流程

透明拼接屏,作为现代显示技术中的佼佼者,其生产过程复杂而严谨。本文将详细介绍透明拼接屏的生产流程、质量标准以及出货流程,尼伽小编带您了解这一高科技产品背后的精湛工艺。 一、生产流程 原材料采购与检验:生产透明拼接屏的第…

实用干货:分享一个““自动转``的VSCode插件

大家好,我是大澈! 本文约1000字,整篇阅读大约需要2分钟。 感谢关注微信公众号:“程序员大澈”,免费领取"面试礼包"一份,然后免费加入问答群,从此让解决问题的你不再孤单&#xff01…

数学算法知识编程

(1)辗转相除法求最大公约数(gcd) 辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现…

分布式ID介绍实现方案总结

分布式 ID 介绍 什么是 ID? 日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&…

原来服务器这么有用-使用轻量应用服务器搭建专属自己PDF处理工具

原来服务器这么有用-使用轻量应用服务器搭建专属自己PDF处理工具 1、前言 PDF文件是日常办公中经常使用的一种文档格式。最近,青阳面临一个问题:某公司发送过来的文件需要我们进行印章流程,但由于该公司系统在电子文件加盖电子公章后会自动…

OpenGL ES 渲染 NV21、NV12 格式图像有哪些“姿势”?

使用2个纹理实现 NV21 格式图像渲染 前文提到渲染 NV21 格式图像需要使用 2 个纹理,分别用于保存 Y plane 和 UV plane 的数据,然后在片段着色器中分别对 2 个纹理进行采样,转换成 RGB 数据。 OpenGLES 渲染 NV21或 NV12 格式图像需要用到 GL_LUMINANCE 和 GL_LUMINANCE_A…

Covalent (CQT):构建全新链上协议收入体系,致力于财务透明

在充满活力的区块链世界以及去中心化技术领域,Covalent Network(CQT) 正在通过其创新的协议收入模型对链上经济体系进行重塑。这一特性与传统金融系统不同,这一特性带来了无与伦比的可访问性,消除了中介,并…

电商平台如何安全的出金入金?如何合规避税?如何消除泡沫?

大家好 我是一家软件开发公司的产品经理 我叫吴军 最近银行卡风控非常严重,不管是电商行业,各行各业都是如此,连去银行取大额都要提前预约并且说明来意。 做生意的老板都知道,但凡有一笔资金被冻结,就有可能导致资金…

掌握 Android JNI 基础

写在前面 最近在看一些底层源码,发现 JNI 这块还是有必要系统的看一下,索性就写一写博客,加深加深印象🍻 本文重点聊一聊一些干货,避免长篇大论 JNI 概述 JNI 是什么? 定义:Java Native In…

vue3使用@imengyu/vue3-context-menu完成antv/x6右键菜单

1、下载插件&#xff1a; npm i imengyu/vue3-context-menu1.3.6 2、在页面中引入并使用插件&#xff1a; <script setup> import ContextMenu from "imengyu/vue3-context-menu";graph.on("node:contextmenu", ({ e, x, y, cell, view }) > {ha…