質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

Q&A

解決済

5回答

2001閲覧

お金のようなデータを扱うシステムはどのようなアーキテクチャしたら良いでしょうか

urbainleverrier

総合スコア200

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

ドメイン駆動設計

ドメイン駆動設計(Domain-driven design, DDD)とは、ソフトウェアの設計手法、および設計思想や哲学のことです。ドメインモデル構築の際に、設計上の判断を決定する枠組みとドメイン設計に関して議論するボキャブラリを提供するものです。

0グッド

4クリップ

投稿2019/10/24 18:02

編集2019/10/25 06:10

分からないこと

会員のユーザー同士でお金のようなデータ(円やドル、仮想通貨、ポイントなど全てを含み、かつ法令を遵守できる、またユーザーにとって希少なもの)を交換するシステム(「送金」と表現することにします)をどのように作れば良いかわかりません。
ここで、想定しているのは、あるユーザーが別のユーザーに残高の一部を移動させるだけのシステムです。

追記(2019/10/25)

※法令遵守できるかどうかといった部分で、食い違いが起きてしまいましたので、より具体的なケースを記しました。

想定しているシステムについて追記します。
お金について、ユーザーが何らかの決済手段を用いて得た(購入したとは限りません)、サイト内のみ使えるポイントと定めます。
ここで、ポイントとは、あくまでサイトの所有物として、万が一紛失しても責任は問われないようなケースで、ユーザーにはそのことをよく理解しているものとします。

あるt時点のポイントのアカウントテーブルを次のように定めます。

idaccountuser_id
1100a
270b

上記のテーブルのt+1時点は、以下です。

idaccountuser_id
190a
280b

id:1, user_id:aのアカウントから10引いて、id:2, user_id:bのアカウントに10足した状態を表現したということです。

上のシステムを作るとなった場合、どのようなアーキテクチャにしたら良いでしょうか。

考えたこと

私なりに考えたところ、

  1. 送金を表現するトランザクションログが、意義のある一定期間で保存が必要
  2. 現在の残高を表現するトランザクションログのスナップショットが必要
  3. データを絶対に紛失してはならない
  4. トランザクションの原子性、一貫性、独立性を満たす必要
  5. 4が満たされない(あってはならないバグが原因で)、または不正が行われた場合に、ある時点からリトライ・ある時点までロールバックできるようにすること

があるんじゃないかなと思いました。
5が思い浮かんだのは以前仮想通貨の取引所で、不具合が起きた時に、
残高やら取引履歴やらの全てが、不具合直前の状態が戻されたというニュースを聞いて、
印象に残っていたためです。

考えたことが全部合っている場合のアーキテクチャ

もし、上記の想定が合っているなら、
アプリケーションのアーキテクチャとして

  • トランザクションログとしてkafkaのようなMQ
  • at least onceなConsumerとして残高を冪等にRDBMSのデータベースへ記録するアプリケーション
  • ある時点までのトランザクションを入力とした強制ロールバック用のアプリケーション

またデータについては

  • 複数サーバーに同期的な書き込み
  • トランザクションログを3年分?アーカイブとして保存する

と思いました。

以上、金融システム実装のご経験のある方からお話を伺いたいです。

※法律で、資金力の問題や、免許を取得しなければならないといったシステムと直接関係のない問題は全て解決できるものとします。システムアーキテクチャに関係のある法令(ログは3ヵ月は保持しましょうというような)を満たさない可能性をご存知であれば、ご指摘いただきたいです。
※セキュリティとして、ユーザーや管理者の認証や認可は全て正しく行われているものとします。お金固有のこだわらなくてはならないポイントがあれば、教えていただきたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/10/24 22:37

電子マネーや仮想通貨ではなくリアルマネーの話ですよね。 相談する場所が違う気がします。
takasima20

2019/10/24 23:16

取扱い可能な金額とリアルタイム性をどこまで保証するかは考えておいた方がいいと思います。あと、カネが絡むとサポートのプレッシャーが高くなりがちですね。
urbainleverrier

2019/10/25 04:15

m.ts10806さん、ありがとうございます。 リアルマネーかどうかは定めません。いわゆるサイト内のみ使用可能なポイントや仮想通貨でも良いです。
urbainleverrier

2019/10/25 04:37 編集

takasima20さんありがとうございます。 リアルタイム性とはデータについて結果整合性を求めるかリアルタイム整合性を求めるかということですか? もしくは、レプリカ間のfsyncのことについてですか? 取扱い可能な金額を考慮するとは、数字の型についてよく検討するということですか? 全く見当違いであればコメントいただきたいです。
m.ts10806

2019/10/25 04:17

でしたら「お金を送金」等の表現は改められた方が良いです。ポイントならまだ簡単な話ですが仮想通貨だとかなり難しい話になります。要は、要件定義を具体的にしないと話が進みませんということですね
urbainleverrier

2019/10/25 04:42

タイトル、質問文、適宜訂正させていただきました。他、改めるべき箇所ございましたら、ご指摘いただければ幸いです。 「要件定義を具体的に」というご指摘最もか、と思います。 質問文、訂正いたします。
guest

回答5

0

設計以前の問題として、金融システム関連の法令・指針があるのはご存知ですか?
とりあえず、金融庁のページ貼っときます。
この中のどれを見ればいいかは知りませんが、個人でどうこう出来ることではありませんね。

https://www.fsa.go.jp/common/law/index.html

投稿2019/10/24 23:55

kaina

総合スコア418

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urbainleverrier

2019/10/25 04:19

各種法令があり、資金決済法やら送金業やら銀行業やら、がんじがらめになっているのは知っています。法令をないがしろにしようとは思っていませんので、どうかご安心ください。 お聞きしたいのは、「絶対に不整合のあってはならないお金という性質を持つデータ」をどのように扱うべきかということです。 どうかよろしくお願いいたします。
guest

0

その、送金、というのは具体的になにをするんでしょうか。

全てそれにかかってきますが。

投稿2019/10/24 22:47

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urbainleverrier

2019/10/25 04:24 編集

例えば、残高を表すテーブルがあり、idとamountとuser_idのカラムがあったとします。 ある2ユーザー間でamountを送金額分、足し引きするようなものを想定しています。 もし何か追記必要であればコメントいただければ幸いです。
y_waiwai

2019/10/25 04:55

そういうデータのはなしではなく、実際の送金というのはどう考えてますか? 送金した、という指示があればあなたが現金書留にカネ入れて送るんですか?
urbainleverrier

2019/10/25 05:02

ご不快に思わせてしまい、申し訳ございません。 「現金書留」を使う想定はしておりませんでした。 質問文、コメントいただいた後で、訂正させていただきました。 私の質問文の内容が不足しておりました。 ここで、お金とは、必ずしも国で定めたような広く流通するお金とは限らず、ユーザーにとって希少なもの=お金として読んでいただければ幸いです。
y_waiwai

2019/10/25 05:14

実際のカネじゃなければ、すきにすればいい、という話になりますね。 どれだけのことを許され、どれだけのことが許されないというのはあなたの頭の中にしかありませんし
urbainleverrier

2019/10/25 05:34

y_waiwaiさんありがとうございます。 よく検討してみます。
guest

0

システム設計以前にサービス設計したほうが良いですよ。

ちなみに、法律/ガイドラインは「絶対に不整合のあってはならないお金という性質を持つデータ」をどのように扱うべきかということを明文化したものです。

サービス設計の基幹であり、最低限満たすべき要件です。

投稿2019/10/25 05:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urbainleverrier

2019/10/25 05:06

te2jiさん、ありがとうございます。 よく法律について勉強しようと思います。
退会済みユーザー

退会済みユーザー

2019/10/25 05:12

サービス設計後に参照されるのは、多くの場合 PCI DSS です。質問にあるような枝葉の話ではなくもう少し根幹の定義になります。
urbainleverrier

2019/10/25 05:34

te2jiさんありがとうございます。 よく検討してみます。
guest

0

自己解決

みなさま、私の未熟故な質問に真摯に答えてくださり、ありがとうございました。
アドバイスを一つ一つ検討していきたいと思います。

また、こちらの質問はこの自己解決の投稿を持って一度閉めさせていただきます。
回答に対するコメント(お礼含む)も以降、省略させていただきますので、
ご理解のほどよろしくお願いいたします。

投稿2019/10/25 07:57

urbainleverrier

総合スコア200

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

不整合な状態にならないようにしたいなら BeginTransaction~Commit or Rollback すればいいし、
ある時点に戻す必要があるのであれば適切な頻度でバックアップ取ればいいのではないでしょうか。

投稿2019/10/25 06:56

workaholist

総合スコア559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

urbainleverrier

2019/10/25 07:54

workaholistさんありがとうございます。 私も、バックアップを取ることで実現できるのではないかと思いました。 しかし、ふと残高テーブルとは、送金というEventを大切にして、EventStreamのある時点の状態を表現すしたものに過ぎないんじゃないかなと思いました。 要するに、EventStreamにある送金Eventの連なりが真実であり、最も重要なデータで、残高テーブルが多少間違っていたとしても、EventStreamをもう一度さらえば残高テーブルをいつでも表現できるという状態が最も望ましいのではないかなと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問