1

いくつかのエラーのためにローカルデータベースが同期しなくなる可能性がないように、重要な財務業務の処理に関連する「デザインパターン」はありますか?

例:

金融取引レコードがローカルデータベースに作成され、顧客に請求するためのリクエストがリモート支払い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()

これで、リモート決済サービスから返される可能性のあるエラーを処理しても、DBサーバーがダウンしたり、ネットワーク接続がダウンしたりするなど、さまざまな問題が発生する可能性があります。

上記のコードでは、トランザクションレコードを作成した直後に、DBサーバーにアクセスできなくなる可能性があるため、リモートサービスによって金融トランザクション自体が正常に実行された場合でも、そのレコードをOKとしてマークできない場合があります。言い換えれば、顧客は課金されますが、予約されていません。

これは、リモートサービスと定期的に同期する、TransactionReturn処理されているが10分または1時間より古い-sを調査するなど、さまざまな方法で回避できます。

しかし、私の質問は、そのような状況を処理するための確立されたパターンがあるかどうかです(お金が関係しているので、すべてが「常に」適切に機能するはずです)?

PS。この質問にどのタグを使用すればよいかわかりません。タグを付け直してください。

4

1 に答える 1

2

シナリオで発生するような、データベース接続のダウンやネットワーク接続のダウンなどのケースに対処するための「デザインパターン」はないと思います。これらの2つのシナリオはいずれも主要な障害イベントであり、手動による介入が必要になる可能性があります。

適切なエラーチェックを行い、サポートに適切な通知を提供し、機能しない機能を自動的に無効にすること以外に、それらに対処するために実行できるコーディングはあまりありません(アプリケーションが支払いサービスのダウンを検出した場合は、「支払いの送信」ボタンを無効にする必要があります)。

適切なエラー処理と状態管理を行うと、サポートを大幅に削減できます。あなたの場合、トランザクションレコードはその状態を[保留中]->[送信済み]->[処理済みまたは拒否済み]などから変更する必要があります。

また、すべてのサービスが同期のための機能を提供しているわけではありません。

于 2013-01-04T20:45:24.973 に答える