同步数据库和外部支付服务

时间:2013-01-02 20:30:19

标签: database finance currency

是否存在与处理重要财务操作相关的“设计模式”,因此由于某些错误,本地数据库无法变得不同步?

示例:

在本地数据库中创建金融交易记录,然后将请求发送到远程支付API端点以向客户收费。伪代码:

record = TransactionRecord.create(timestamp=DateTime.now, amount=billed_amount, status=Processing)
response = Request.post(url=remote_url, data=record.post_data)
if response.ok:
    record.mark_as_ok()
else:
    record.mark_failed()

现在,即使我处理远程支付服务可能返回的错误,仍然会发生许多其他不好的事情:数据库服务器可能会在任意时间点发生故障,网络连接可能会发生故障。

在上面的代码中,数据库服务器在创建事务记录后立即变得不可访问,因此即使远程服务已成功执行财务事务本身,也可能无法将该记录标记为正常。 换句话说:客户收费,但我们没有预订..

这可以通过多种方式解决 - 定期与远程服务同步,通过调查正在处理但比例如年龄大的TransactionReturn - 10分钟或1小时。

但我的问题是,是否有一些完善的模式来处理这种情况(涉及金钱,所以一切都应该“始终”)?

PS。我不确定我应该使用哪个标签来解决这个问题,请随时重新标记它。

1 个答案:

答案 0 :(得分:2)

我认为没有任何“设计模式”可以解决诸如数据库连接断开或网络连接中断等情况。这两种情况中的任何一种都是重大故障事件,很可能需要人工干预。

除了通过正确的错误检查进行防御,提供适当的通知以支持并自动禁用无法正常工作的功能(如果应用程序检测到支付服务已关闭,那么)除了防御之外,您可以做很多编码提交付款'按钮应该被禁用)。

如果您进行了适当的错误处理和状态管理,您将能够显着减少支持。在您的情况下,交易记录必须从Pending - >更改其状态。已提交 - >处理或拒绝或类似的事情。

此外,并非每项服务都提供同步功能。