漫谈大规模交易系统架构设计方法--Performance

假设下面的pseudo code是一段重要的实时操作的程序:

。。。。

Begin Transaction
Call Remote Service A To Write Data in A system
Insert Record
Update Status
Call Remote Service B To insert Data in B system
Send Email To Notify User
Call Remote Service C To Update Data in C system
End Transaction

。。。。

大家都知道,上面pseudo code非常愚蠢,性能会非常差。违反了原则“事务中执行的操作越少越好”。

还有个原则大家时常用,但不一定总结出来;那就是“事务中不是万不得已,绝对禁止远程访问”。为啥?万一网络原因导致链接出问题,这个事务就可能要花时间等待远程访问结果,就会堵在哪儿。大规模系统中,事情总会是祸不单行的;由于网络原因,可能大量的事务因为这个原因而堵在那儿。数据库就会因此被搞爆掉,出大事故。

好,优化一下上面的pseudo code。得到以下的:

。。。。
Call Remote Service A To Write Data in A system

Begin Transaction
Insert Record
Update Status
End Transaction

Call Remote Service B To insert Data in B system
Send Email To Notify User
Call Remote Service C To Update Data in C system
。。。。
 

假设“insert Data in B system”和“Update Data in C system” 并不需要是实时的操作。如何提高性能?

不知大家有没有想到异步的方法?

对,最佳解决方案就是异步的“消息/事件订阅”。在交易系统中,所谓“消息/事件订阅”,就是将不需要实时处理的操作从主交易流程中移走,将它们变成外围服务;它们预定(Subscribe)主交易流程的消息或事件,异步的来消费主交易流程的消息/事件;从而大大提高主交易流程的性能。

主流程

。。。。
Call Remote Service A To Write Data in A system
Begin Transaction
Insert Record
Update Status
End Transaction
Push Message/Event To Queue
。。。。

外围子服务

服务1

。。。。
Subscribe Above Kind Message/Event
。。。。
Call Remote Service B To insert Data in B system
。。。。

服务2

。。。。
Subscribe Above Kind Message/Event
。。。。
Send Email To Notify User
。。。。

  

服务3

。。。。
Subscribe Above Kind Message/Event
。。。。
Call Remote Service C To Update Data in C system
。。。。

经过这样一改进,主流程的性能至少提高个几倍, 系统能同时处理的交易量会大大的提高。还有一个好处是主流程程序会简化很多,相关程序能够解出一些烦人的相互耦合。

猜你喜欢

转载自hubertwu.iteye.com/blog/741017