web-dev-qa-db-ja.com

ATMとその銀行でのトランザクションは通常どのように同期されますか?

失敗のポイントがあります:

  1. ATMはお金を与えてから、その銀行に控除要求を送信します。リクエストが失敗するとどうなりますか?ユーザーはお金を受け取りましたが、彼のアカウントは差し引かれていません-fail
  2. ATMは銀行に控除要求を送信し、銀行は値を差し引き、要求をATMに送り返します。要求は失敗します(消えます)。ユーザーは差し引かれましたが、お金がありません-fail

実生活で使用されているソリューションを知っているのは誰ですか?

2
arminvanbuuren

免責事項:次の部分については、mostと言っています。これは、すべての銀行システムの経験がないことは明らかです。 。


本当に高速である必要がある他のシステムと同じように、銀行でも最終的には一貫性があります。このようなシステムを実装しているときは、できるだけオンラインにしたいと考えています。顧客が現在どのような状況であっても顧客を遅らせるため、ダウンタイムが発生すると、ビジネスに悪影響を及ぼします。そして私を信じて、ゆっくりと反応する銀行システムは小売業者にとっても本当にひどい経験です。それは皆を傷つけます。

ほとんどのATMやカード端末は、可能な限り高速で動作するように、残高を確認せず、マスターに対するトランザクションをリアルタイムで処理しません。トランザクションの量で、それはシステムをあふれさせるでしょう。

銀行の所有者は、ATMからのお金の引き出しまたはカード取引の発行の要求の大部分が成功することを知っています。このため、実際にATMからお金を引き出したい場合、マシンは銀行の非常に高速でスケーラブルな読み取りモデルにpingを送信し、希望する金額があるかどうかを非常にすばやく確認します。このpingはレプリカで行われるため、マスターとリアルタイムで同期していない可能性があることに注意してください。

Pingが実行され、ステータスが確認されると、ATMは引き出しを行ったことを通知し、お金を分配します。設定された期間ごとに、ATMは行われたすべての引き出しを収集し、適切な当局に送信します。

一部のATMはより複雑である可能性があり(通常はより複雑です)、カードからアカウントに関する情報を覚えておくと、毎回銀行にpingする必要がなくなります。これのおかげで、ATMだけでは、通常、アカウントに含まれているだけの直後に、$ 500と$ 500を引き出すことができません。 $ 501-この場合、最初の引き出しは問題ありませんが、2回目は問題ありません。ATMは$ 501があったことを記憶しているため、$ 500を引き出したため、理論上の残高は$ 1です。明らかに、ATMが毎回銀行協会にpingを送信する一般的なものの1つである場合、レプリカは2回目の引き出しでも$ 501で応答する可能性が高く、2回目の引き出しも許可されます。しかし、これはまだ問題ではありません問題です。

銀行は実際にはマイナスの残高に入るのを気にしていませんので、これらの一時的な中断を許可し、誰かのバランスがマイナスになった場合に管理者とサポートに通知するレポートシステムを実装します。これにより、他のプロセスがトリガーされる可能性があります。

銀行業務は非常に厳しく、すべての操作が一貫している必要があるように思えるかもしれませんが、銀行業務に関しては可用性がより重要な側面であるため、銀行はそのようにプログラムされています。


質問に直接回答するには:

ATMはお金を与えてから、その銀行に控除要求を送信します。リクエストが失敗するとどうなりますか?ユーザーはお金を得ましたが、彼のアカウントは差し引かれていません-失敗。

この問題を回避するために、ATMは、引き出し要求(引き出したい金額に関する情報を含む)と引き出し完了に関するイベントの両方を記録するように実装されています。

WithdrawalRequestedイベントが保存されると、ATMからお金が与えられます。お金を渡した直後にWithdrawalCompletedイベントを保存する前に死亡した場合、これは問題ではありません。

  1. 再起動後、ATMは成功したすべての引き出しを何らかの方法で合計し、ATMに挿入された元の金額から合計値を減算します。
  2. ATMは不整合を検出し、実際には500ドルが不足しているため、WithdrawalCompletedイベントのないすべてのエンティティを検出し、不完全な要求がある場合、[ATM]は単にそれを完了します。

広告2. ATMが一致する引き出しを見つけることができない場合、ATMは当局にこれが発生したことを報告し、調査する必要があります。

ここで、引き出しをリクエストし、WithdrawalRequestedイベントを記録する前にATMが停止した場合、これは問題ではなく、単に何も起こりません。しかし、ATMがWithdrawalRequestedの格納と実際にお金を受け取ることの間に失敗した場合、以前と同様に、再起動後に測定が行われ、要求が実際には当局に送信されないようにする必要があります。 ATM-この場合、金額は元の金額から引かれた引き出しの合計額と一致し、リクエストは単に破棄されます(問題が発生したことをまだ通知している可能性があります)。

ATMは銀行に控除要求を送信し、銀行は値を差し引き、要求をATMに送り返します。要求は失敗します(消えます)。ユーザーは差し引かれましたが、お金がありません-失敗しました

ATMはお金を分配する前ではなくコマンドを発行しないので、この状況は決して起こりません。

7
Andy

通常、これはATMを介した顧客と銀行間のトランザクションではなく、2つの別個のトランザクションです。1つは顧客とATM間のトランザクション、もう1つはATMと銀行間のトランザクションです。 (海外でカードを使用する場合は、ATMから銀行にアクセスできないこともあります)。

そのトランザクションの1つのステップは、ATMが銀行口座にカバレッジを照会することです。現在の場所やATMを使用するタイミングによっては、この手順を省略できる場合があります。ただし、ATMは、サーバー(必ずしも「銀行」ではない)への一時的なトランザクションを格納する前に、お金を提供しません。

顧客とATMの間でトランザクションが完全に完了すると、ATM(または、その銀行サーバー)はメッセージをyour bankに送信し、金額を差し引いてそのトランザクションを確認します。

ATMとそのバックエンドサーバーの間で一時的なトランザクションを完了できない場合(ATMが停止するか、データリンクがこの瞬間に壊れる)、ATMはシャットダウンし、おそらくカードを食べて、誰かが手動で介入するのを待ちます。そのような未完了の(タイムアウトした)トランザクションをバックエンドで頻繁に検索できるため、これは簡単です。この場合、顧客がお金を受け取ったかどうかは、ローカルのATMログだけが知っていることです。実際にお金を受け取った証拠がない場合、銀行はこの金額を消し込む必要があります。私の国では、ATMはログ用に地元の紙の印刷物を生成する必要があります。

0
tofro