分からないこと
会員のユーザー同士でお金のようなデータ(円やドル、仮想通貨、ポイントなど全てを含み、かつ法令を遵守できる、またユーザーにとって希少なもの)を交換するシステム(「送金」と表現することにします)をどのように作れば良いかわかりません。
ここで、想定しているのは、あるユーザーが別のユーザーに残高の一部を移動させるだけのシステムです。
追記(2019/10/25)
※法令遵守できるかどうかといった部分で、食い違いが起きてしまいましたので、より具体的なケースを記しました。
想定しているシステムについて追記します。
お金について、ユーザーが何らかの決済手段を用いて得た(購入したとは限りません)、サイト内のみ使えるポイントと定めます。
ここで、ポイントとは、あくまでサイトの所有物として、万が一紛失しても責任は問われないようなケースで、ユーザーにはそのことをよく理解しているものとします。
あるt時点のポイントのアカウントテーブルを次のように定めます。
id | account | user_id |
---|---|---|
1 | 100 | a |
2 | 70 | b |
上記のテーブルのt+1時点は、以下です。
id | account | user_id |
---|---|---|
1 | 90 | a |
2 | 80 | b |
id:1, user_id:aのアカウントから10引いて、id:2, user_id:bのアカウントに10足した状態を表現したということです。
上のシステムを作るとなった場合、どのようなアーキテクチャにしたら良いでしょうか。
考えたこと
私なりに考えたところ、
- 送金を表現するトランザクションログが、意義のある一定期間で保存が必要
- 現在の残高を表現するトランザクションログのスナップショットが必要
- データを絶対に紛失してはならない
- トランザクションの原子性、一貫性、独立性を満たす必要
- 4が満たされない(あってはならないバグが原因で)、または不正が行われた場合に、ある時点からリトライ・ある時点までロールバックできるようにすること
があるんじゃないかなと思いました。
5が思い浮かんだのは以前仮想通貨の取引所で、不具合が起きた時に、
残高やら取引履歴やらの全てが、不具合直前の状態が戻されたというニュースを聞いて、
印象に残っていたためです。
考えたことが全部合っている場合のアーキテクチャ
もし、上記の想定が合っているなら、
アプリケーションのアーキテクチャとして
- トランザクションログとしてkafkaのようなMQ
- at least onceなConsumerとして残高を冪等にRDBMSのデータベースへ記録するアプリケーション
- ある時点までのトランザクションを入力とした強制ロールバック用のアプリケーション
またデータについては
- 複数サーバーに同期的な書き込み
- トランザクションログを3年分?アーカイブとして保存する
と思いました。
以上、金融システム実装のご経験のある方からお話を伺いたいです。
※法律で、資金力の問題や、免許を取得しなければならないといったシステムと直接関係のない問題は全て解決できるものとします。システムアーキテクチャに関係のある法令(ログは3ヵ月は保持しましょうというような)を満たさない可能性をご存知であれば、ご指摘いただきたいです。
※セキュリティとして、ユーザーや管理者の認証や認可は全て正しく行われているものとします。お金固有のこだわらなくてはならないポイントがあれば、教えていただきたいです
回答5件
あなたの回答
tips
プレビュー