1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

仮想通貨取引所

Posted at

はじめに

仮想通貨取引所のコア処理をプレ実装設計した時のメモです

「東京証券取引所」の1日の注文受付数は、下記を参考に、2億7000万件/日が理想値です、注文受付時間は、9:00 - 15:00(1時間休み)なので、実運用時間は5時間です。つまり、5400万/hour = 15000注文/sec、秒間15000件の注文を受付可能であれば、東証と同レベルの取引所システムだと言えます

 取引所のフロントエンドは、httpインタフェイスで、そのリクエストは一旦 FIFO キューとして利用するmysqlデータベースに保存します。WEB-FRONTは、このFIFOテーブル(インデクス無し)にINSERT SQLのみを発行することで、おおよそ20Kqpsまで対応できます。つまり秒間2万件の注文リクエストを「受け付ける」ことができます

 https://bitflyer.com/ja-jp/explanation-virtual-currency-regulation
 
 上記を参考にすると、仮想通貨取引所は、24時間365日運用されるようです(途中10分のシステムメンテナンス)。そうすると、最大で秒間15K注文を受け付け可能ということは、注文レコードは1日で「15K x 86400 ≒ 13億レコード」にも達してしまうので、データベース@テーブルリソースのシャーディングが必須になります

image.png

 もっともシンプルなデータベース・シャーディング配置は、ユーザグループ毎に注文レコードをシャーディングすることです

 ユーザが注文を完了したタイミングとは、WEB-browser上でボタンを押下したタイミングではありませんし、Load-Balancer、nginx、http-serverに到達したタイミングでもありません。暗黙的にデータベースにcommitした順番だろうと定義しがちですが、「取引所コアエンジンに注文が到達したタイミングと定義」することで、注文のユーザ公平制御を担保できると定義します

 これによって、ユーザグループ毎にシャーディングするというもっともシンプルな設計を採用できるのです。その場合、注文ステータスを以下のように考えます

desc note
1 注文保存 データベースにINSERT完了
2 注文配信 データベースからbinlogを通じてproxyがdequeし、取引所コアへgrpcで配信
3 約定 取引所コアが約定処理を実施
4 結果反映 post processが約定処理結果をデータベースへINSERT、UPDATE反映

取引所モジュール

エンドポイント(web api)から、取引所(約定)機能、データベースを含めた取引所全体のモジュールブロックです

  • アプリケーションレベルで冗長性を担保する+ モジュール間IPCがたすき掛けに接続される
  • ネットワークレベルの冗長性は、裏面、表面という感じで表現
  • データベースボトルネックをスケールアウトによって回避できる
  • シングルポイントがあるシステムでの動的デプロイを可能とする

平たく言うと、mqなどのミドルウェアをなるべく利用せず、アプリケーションレイヤ、ネットワークレイヤの双方で冗長性を担保する設計

image.png

ネットワーク視点

ネットワーク視点から見たHA構成は以下のようになります。master x master で、互いのmasterイベントをlistenすることでデータベース冗長性 = 経路冗長性を実現します

image.png

モジュールシーケンス

image.png

データシーケンス

image.png

システムステータス

mysql@binlogをシステムの中枢に利用するときに、問題となるのが「どこからbinlog-listenerを開始するのか」というクリーンブート設計です、このシステムではシステムコントロールモジュールがクリーンブートを制御します

image.png

grpc

matching-engineでは、上り下り、双方向インタフェイスでgrpcとしました、grpcライブラリがボトルネックにならないことを確認しました

image.png

スレッドでのスケールはしませんでしたが、プロセス(コア)スケールすることを確認できました

注文シーケンス

フロント側から見た注文処理は、データベースにオーダーをINSERTするだけです。その後の処理は、バックグラウンドで

  1. matching_proxy
  2. matching_engine
  3. matching_publisher

の順に処理が進められます

image.png

ここまでで、High Performance な、仮想通貨取引所を意外とシンプルに実装設計可能なことが確認できました

取引所を実現するには、許認可に大きなコストがかかるとは思いますが、そのコア処理部は意外とシンプルに実装設計できそうでした。もちろん他にも、ユーザ画面、admin画面、ウォレット管理(物理的な)、体制構築(物理的な)等、がなければシステムにはなりません。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?