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

这篇具有很好参考价值的文章主要介绍了如何在不依赖于Mq的形式下更优雅地实现异步任务处理!!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

考虑到现有业务很多依赖于MQ的方式进行,这种方式需要依赖于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

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

                    图1.2 RabbitMQ

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

                    图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重复)。

六.实现类图

方案一:

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

                                            图1.4 类图

方案二:

  

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

                                   图1.5 类图

以上类图开发自行根据习惯可自行选用哪种模式。
如有更好的方式请留言指教,以上供参考。
文章来源地址https://www.toymoban.com/news/detail-825068.html

到了这里,关于如何在不依赖于Mq的形式下更优雅地实现异步任务处理!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用C++20协程和io_uring优雅地实现异步IO

    距离2020年已经过去很久了,各大编译器对于C++20各项标准的支持也日趋完善,无栈协程也是其中之一,所以我就尝试着拿协程与 io_uring 实现了一下proactor模式,这篇文章用来记录一下我的设计和想法。除此之外,我们能在网络上找到许多优秀的C++20协程的教程以及许多优秀的

    2024年03月27日
    浏览(51)
  • Hystrix 如何在不引入 Archaius 的前提下实现动态配置更新

    Hystrix 是 Netflix 开源的一个限流熔断降级组件,防止依赖服务发生错误后,将调用方的服务拖垮。这里对 Hystrix 本身不做过多介绍。 Hystrix 目前处于维护状态(不再更新),但是还有大量项目对它进行了使用,因此仍然非常重要。 在 Hystrix 中, HystrixCommand 是非常重要的一个类

    2023年04月24日
    浏览(37)
  • Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现

    目录 Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、关键代码 附录 : HttpWebRequest 的一些基础知识 1、HttpWebRequest 常用属性 2、HttpWebRequest 

    2024年02月05日
    浏览(60)
  • 微服务中间件--MQ服务异步通信

    MQ的一些常见问题 消息可靠性问题 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: 发送时丢失: 生产者发送的消息未送达exchange 消息到达exchange后未到达queue MQ宕机,queue将消息丢失 consumer接收到消息后未消费就宕机

    2024年02月11日
    浏览(48)
  • 微服务通信[HTTP|RPC同步通信、MQ异步通信]

    A服务调用B服务,B服务调C服务,C服务调D服务,即微服务之间的通信(也可以叫微服务之间的调用) 一种轻量级的通信协议,常用于在不同的微服务之间进行通信,也是最简单的通信方式 使用REST ful为开发规范,将服务对外暴露的HTTP调用方式为REST API(如GET、POST、PUT、DELETE等),已经成

    2024年02月09日
    浏览(40)
  • 一文搞懂 Promise 新 Api allSettled 的用法和 all 区别,以及如何在不支持新特性的环境下实现一个 Polyfill

    返回一个数组,每一个元素都是一个对象,里面必然包含 status 属性 status 属性只会有两个值, fulfilled 或者 rejected ,非黑即白的既即视感 allSettled 总是走 then 的,也就是并发的 Promise 出现 reject 也不会走 catch ,需要自行遍历返回的数组,判断 status 来做错误捕获 对象中还有另

    2024年02月01日
    浏览(38)
  • JavaScript 生成器函数详解:优雅处理异步任务流

    目录 1. 生成器函数的定义和使用 2. 暂停和恢复执行 3. 与其他语言特性的配合使用 Iterator Protocol 迭代器协议  解构赋值  生成器和 Promise 的组合使用          使用 Promise:         使用 async/await: 委托给另外一个Generator函数         Generators 是 JavaScript 中的一种

    2024年02月12日
    浏览(56)
  • 【深度思考】如何优雅的实现脱敏?

    最近做了个脱敏的需求,要对系统中的敏感信息,如手机号、车牌号、身份证号、银行卡号等进行脱敏显示。 效果类似下面这样: 简单来说,就是对敏感信息中的某几位进行掩码显示,常见的一般是使用*。 本篇文章就来讲解下在项目中该如何优雅的实现脱敏。 首先,需要

    2024年02月11日
    浏览(35)
  • 如何优雅的实现前端国际化?

    JavaScript 中每个常见问题都有许多成熟的解决方案。当然,国际化 (i18n) 也不例外,有很多成熟的 JavaScript i18n 库可供选择,下面就来分享一些热门的前端国际化库! i18next 是一个用 JavaScript 编写的全面的国际化框架,提供标准的 i18n 功能,包括复数、上下文、插值、格式等。

    2024年01月23日
    浏览(61)
  • C语言如何实现将一个小数以百分比的形式输出

    在C语言中我们用连着的两个百分比符号表示一个百分比符号,即“%%”就表示一个百分比符号,例如我们想输出40%这个数到屏幕上我们可以执行以下语句: 这样就可以将40%输出在屏幕上了 若我们想要将0.857这个浮点数以百分制的形式输出在屏幕上呢?我们知道将0.857这个数转

    2024年02月06日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包