异步处理功能的通用完备实现模式

最近某个系统的性能问题尤为突出,经常告警数据库表扫描、响应超时、CPU使用率过高等问题。

负责这个模块的兄弟来找我说了一下方案,一看就是技术思维导向。

简单来说,他把可能引发性能问题的各种技术手段做了一个罗列,然后逐类去梳理所有程序。

这种做法对吗?

技术上,对。

合适吗?

商业上,不合适。

因为现在不是按照技术维度,按部就班分析技术情况的时候。

有一句话还需要再强调一遍:技术只是我们的工具,我们交付的是商业能力。

对于一个系统来说,已经出现了问题,那么现在最重要的是要先给功能服务排优先级,按照重要性以及紧迫程度,应用多种技术手段进行提升。

尤其是要找到最能提升性能的关键措施,尽快提升性能,避免影响线上业务服务水平。

都不一定把所有的可提升点全部完善。

是以某个功能的维度,纵向梳理,而不是按照技术的维度横向梳理。

另外,异步一般情况下是提升OLTP类系统性能的不二法门。

这里简单记录一下,一个通用的异步处理的通用实现模式。

1

请求接收

这个接收比较简单,一般就是消费者发起请求,发过来单笔或者批量的处理指令,然后应用将这些指令入库,然后反馈给消费者指令接收成功或者失败状态信息。

注意,这里说的是:指令接收成功或者失败状态信息而不是指令的业务执行结果

业务处理结果应该是第二步获取。

2

后台处理

在指令落库之后,应该通过事件通知机制,或者后台线程扫描的机制,来去扫描指令库中的待执行任务。

这就涉及到任务竟抢一致性保证唯一执行保证等方面内容,在另外文章中可看到,本文不再赘述。

需要注意的是,如果后台系统也是异步任务,那么最终的结果就需要等待回调,或者有另外一个线程来进行查询结果丙更新。

如果是同步任务,一般需要注意业务执行的结果,一般有如下三种状态:成功、失败、异常。

成功最简单,失败这个状态我们一般指业务失败,具体的处理过程可见第四节。

异常,包含网络中断、响应超时等等方面内容,需要进行如下“异常重试”的步骤。

3

异常重试

一般情况下,异常业务都需要重试。

“重试”包含两种情况。

一种是对方已经成功处理完成业务,只不过链接中断,消费方没有及时获取响应,这种模式下只需要把结果查询回来重新更新业务结果,再继续后面流程即可。

另外一种是对方没有收到、处理异常,在保证业务幂等的情况下,可以由后台线程重新发起调用。

两种模式需要根据后台服务的机制进行相应处理。

4

失败补偿

这里的失败,指的是正常处理返回处理失败。

也需要根据业务模式,进行判断,是需要发起重试,或者这就是最终状态,需要通知上层调用方结果,并进行一系列的处理。

如果需要失败重试的,基本机制和上面一节一样。

5

业务告警

对于异步处理模式,有个经常忽略的问题,就是系统后台处理的不透明性。

由于是后台线程处理的,不直接给调用方反馈结果,我们很难知道其内部处理情况。

这个时候,就需要有完善的告警处理机制,防止业务异常后无人跟踪,一直等到客户投诉。



原文始发于微信公众号(架构突围):异步处理功能的通用完备实现模式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/170118.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!