处理异步相互通信的最佳实践?


10

最近完成了一个处理信用卡处理的项目。我面临的困难之一是处理通知消息的延迟/可能失败。最复杂的示例是:

  • 发送付款请求的外部系统
  • 我的系统将该请求转换为对支付网关的请求
  • 将用户发送到网关
  • 等待用户执行付款
  • 用户返回我的系统,但是一直被保留,直到系统收到成功/失败通知
  • 根据故障将用户发送回外部系统

更加困难的事实是,一旦发送通知失败,网关将尝试每15分钟发送通知数小时。

我使用未决事务的数据库记录解决了它,然后从返回中加上成功的延迟侦听器(用于通知和事务处理)来检测返回的成功和失败...

相当困难!

但是,这一定已经解决了无数次,所以最佳实践是什么?

我看到我的未来将是编写所有这些系统之间的处理程序,并管理时间延迟和可能的网络故障,因此我希望遵循最佳实践。

书籍/文章推荐会很棒。

提前致谢!

Answers:


13

在构建分布式系统时,“同步”系统和“异步”系统之间的区别是:同步系统在计算和消息传递时间上具有已知的上限。因此:您有一个异步系统,其中某些事件没有这些已知的上限。您如何处理?

  1. 如果这些异步过程具有概率上限,则可以使用超时使系统像部分同步的系统一样工作。如果付款网关的98%响应时间为5秒,则5秒钟的时间限制会使98%的请求成功,而另外2%的请求将失败。这意味着您现在知道此过程成功或失败需要多长时间。这种概率故障检测是将异步系统转变为同步系统的关键工具。

  2. 保留这些事件的持久记录,以便在系统发生故障时可以恢复系统状态。如果您的付款网关处理程序将这些事件保存在易失性内存中,并且崩溃了,那么您就大为困惑。

  3. 本质上,每个复杂的事务都是基于系统内消息(事件)的发送和接收的一系列状态转换。听起来您正在使用“未决事务记录”进行非正式的建模,但我建议您进一步:对于需要管理的每个事务,创建一个描述它的正式状态机并保留其当前状态的持久记录。 。您会发现这些状态机易于理解,易于测试,并且可以为您和您的用户提供对这些过程的迫切需要的可视性。

系统越异步,在管理这些复杂的事件状态转换时就需要越正式和明确。超时,持久事件记录和状态机是此处的最佳实践。例如,这就是为什么Erlang OTP将其许多应用程序行为基于状态机模型的原因。

作为参考,我没有找到比《可靠和安全的分布式编程简介》更好的了。它将为您从基本原理上理解同步和异步系统提供强大的算法基础。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.