分布式系统性能-异步处理

本文探讨了分布式架构中的异步处理,如何通过任务调度和批量处理提升系统性能。介绍了事件溯源的概念,强调其在保持数据一致性和简化系统复杂性方面的优势。同时,讨论了异步处理中的关键技术和挑战,如任务调度、幂等性处理和事务一致性。最后,阐述了异步处理如何将被动任务转化为主动任务,实现系统资源的最大化利用。
摘要由CSDN通过智能技术生成

异步处理

在分布式架构中,我们的系统被拆成了很多的子系统。如果想把这堆系统合理地用好,并更快地处理大量的任务,我们就需要统一地规划和统筹整体,这样可以达到整体的最优。本质上,这和邮递公司处理邮件一样,是相同的道理。

在计算机的世界里,到处都是异步处理。比如:当程序读写文件时,我们的操作系统并不会真正同步地去操作硬盘,而是把硬盘读写请求先在内存中 hold 上一小会儿(几十毫秒),然后,对这些读写请求做 merge 和 sort。

这就是异步系统所带来的好处——让我们的系统可以统一调度。

异步处理的设计

首先,我们需要一个前台系统,把用户发来的请求一一记录下来。这有点像请求日志。这样,我们的操作在数据库或是存储上只会有追加的操作,性能会很高。我们收到请求后,给客户端返回 " 收到请求,正在处理中 "。

然后,我们有个任务处理系统来真正地处理收到的这些请求。为了解耦,我们需要一个任务派发器,这里就会出来两个事,一个是推模型 Push,一个是拉模型 Pull。

所谓 Push 推模型,就是把任务派发给相应的人去处理,有点像是一个工头的调度者的角色。而 Pull 拉模型,则是由处理的人来拉取任务处理。这两种模型各有各的好坏。一般来说,Push 模型可以做调度,但是它需要知道下游工作结点的情况。

一般来说,我们构建的都是推拉结合的系统,Push 端会做一定的任务调度,比如它可以像物流那样把相同商品的订单都合并起来,打成一个包,交给下游系统让其一次处理掉;也可以把同一个用户的订单中的不同商品给拆成多个订单。然后 Pull 端来订阅 Push 端发出来的异步消息,处理相应的任务。

事件溯源

所谓 Event Sourcing,其主要想解决的问题是,我们可以看到数据库中的一个数据的值(状态),但我们完全不知道这个值是怎么得出来的。就像银行的存折一样,我们可以在银行的存折看到我们收支的所有记录,也能看得到每一笔记录后的余额。

当然,如果我们有了所有的收支流水账的记录,我们完全不需要保存余额,因为我们只需要回放一下所有的收支事件,就可以得到最终的数据状态。这样一来,我们的系统就会变得非常简单,只需要追加不可修改的数据操作事件,而不是保存最终状态。除了可以提高性能和响应时间之外,还可以提供事务数据一致性,并保留了可以启用补偿操作的完整记录和历史记录。

还有一个好处,就是如果我们的代码里有了 bug,在记录状态的系统里,我们修改 bug 后还需要做数据修正。然而,在 Event Sourcing 的系统里,我们只需要把所有事件重新播放一遍就好了,因为整个系统没有状态了。

事件溯源不需要直接更新数据存储中的对象,因而有助于防止并发更新造成冲突。

最重要的是,异步处理 + 事件溯源的方式,可以很好地让我们的整个系统进行任务的统筹安排、批量处理,可以让整体处理过程达到性能和资源的最大化利用。

异步处理的设计要点

异步处理中的事件驱动和事件溯源是两个比较关键的技术。

异步处理可能会因为一些故障导致我们的一些任务没有被处理,比如消息丢失,没有通知到,或通知到了,没有处理。有这一系列的问题,异步通知的方式需要任务处理方处理完成后,给任务发起方回传状态,这样确保不会有漏掉的。

另外,发起方也需要有个定时任务,把一些超时没有回传状态的任务再重新做一遍,你可以认为这是异步系统中的 " 对账 " 功能。当然,如果要重做的话,就需要处理方支持幂等性处理。

异步处理的整体业务事务问题,也就是说,异步处理在处理任务的时候,并不知道能否处理成功,于是其会一步一步地处理,如果到最后一步不能成功,那么你就需要回滚。这个时候,需要走我们在弹力设计中说的补偿事务的流程。

最后,还想强调一下,异步处理系统的本质是把被动的任务处理变成主动的任务处理,其本质是在对任务进行调度和统筹管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值