WebSocket と Google Cloud でリアルタイム市場データのフロントエンドを構築
Google Cloud Japan Team
※この投稿は米国時間 2021 年 3 月 19 日に、Google Cloud blog に投稿されたものの抄訳です。
金融業界のユーザーの場合、金融商品の電子商取引向けのコア アプリケーションには、レイテンシ、スループット、ジッターに関して厳密な許容範囲があります。一方で、関連ユースケースの中には、リアルタイムの市場データのストリームを活用し、パフォーマンスの変動に対する耐性が高いものも存在します(データの可視化やアプリケーションのモニタリングなど)。リアルタイムの市場データは最近まで、関係するオンボーディング、ライセンス、全体的なメンテナンスのコストが高く、多数の企業にとって導入が困難でした。ところが、クラウドベースの配信のおかげで、より多くのアプリケーションがリアルタイムの市場データにアクセスできるようになっています。
企業がクラウド ファーストの視点を通してテクノロジー戦略を見直す際、リアルタイム データ(および付随するメリット)をこうした関連ユースケースに適用し、洞察までの時間を短縮できます。
このブログ投稿では、アプリケーションのフロントエンドへの配信に重点を置いて、クラウド ファーストのアーキテクチャ パターンを共有し、リアルタイムの市場データ ストリームにアクセスする負担の少ない方法をデベロッパーに提供します。このパターンは、2020 年に Google Cloud で Next OnAir ‘20 カンファレンス用に作成した分析市場データアプリに基づいています。
リアルタイムの市場データへのアクセスを簡略化する
リアルタイムの市場データにアクセスするための従来の方法は、企業がデータセンターを同じ場所に設置し、物理ハードウェアの購入と保守を行い、プロバイダと自社データセンターの間の接続を管理する必要があります。大規模な資本市場の参加者であれば、グローバル チーム全体にこうしたアクティビティを担当させる可能性があります。
市場データをクラウドでストリーミングすれば、消費者の参入障壁が低くなります。小売画面取引、時価評価のエクスポージャー モニタリング、インデックス公開、ナウ キャスティング、ファンチャート、モデル駆動型予測などのアプリケーション タイプは、リアルタイム データソースへの拡張アクセスによる恩恵を受けられます。実際問題として、必要な予算と組織構造を備えた機関に限られるインフラストラクチャやメンテナンスのコストがなくても済みます。
ただし、比較的新しいアセットクラスの一つは、その存在のほぼ全体がクラウド ファーストになっています。暗号通貨取引アプリケーションでは、リアルタイムの市場データが WebSocket を介してトレーダーのフロントエンドにストリーミングされることが少なくありません。Next OnAir ’20 アプリを作成したとき、このリアルタイム配布モデルを商品や金融先物の市場に適用しました。その実装の詳細をご紹介します。
リアルタイムの可視化用のアーキテクチャを検討する
使用したリアルタイム データソースは、CME Group から Google Cloud で利用できるサービスである Smart Stream です。データは、マルチキャストで実行される User Datagram Protocol(UDP)ストリームとして CME Globex 取引プラットフォームから送信されます。商品の価格データは、相互接続を介してさまざまな Pub/Sub トピックに転送され、それぞれが銀やバターの先物などの単一の商品に対応します。
メッセージが対応する Pub/Sub トピックにパブリッシュされるとすぐに、登録者はグローバルに利用できるようになります。登録者に対するメッセージ配信のレイテンシは、クライアントのパブリッシュ リージョンへの地理的な近さによって異なります。たとえば、消費者向けブロードバンド接続での一般的な平均パケット遅延は、数十ミリ秒から数百ミリ秒程度です。人間の知覚の基準が約 80 ミリ秒で推移すると仮定すると、ライブ更新されるウェブ フロントエンドの可視化に適しています。
Pub/Sub は、Google Cloud でグローバルに実行されるアプリケーション向けの優れた配布コアメカニズムです。ただし、シナリオによっては、Google Cloud の外部にあるアプリケーションが Pub/Sub トピックのメッセージにアクセスする必要があります。一例として、匿名の消費者にトピック メッセージを表示できる公開ウェブサイトを取り上げます。このようなニーズに対応するために、Autosocket というニックネームのパッケージをオープンソース化し、標準の WebSocket 接続を介して Pub/Sub メッセージを配信しています。
Autosocket はアダプターとして機能し、1 つのトピックにパブリッシュされた Pub/Sub メッセージを受信して、負荷分散された IP アドレスで WebSocket プロトコルを介してクラスタに接続するフロントエンド クライアントに Pub/Sub メッセージを配信します。これは、Cloud Run を使用するコンテナ化されたアプリケーションであり、ミラーリング対象の Pub/Sub トピック名で構成されます。
デプロイされたクラスタはステートレスかつディスクレスで柔軟性があり、グローバルな負荷分散を特徴とします。さらに、クラスタに接続すると、WebSocket クライアントにトピックにパブリッシュされた直近の 10 件のメッセージのキャッシュがストリーミングされます。これにより、メッセージ トラフィックが少ない時間帯のユーザー エクスペリエンスが向上します。
図 2: WebSocket エンドポイント クライアントの接続
実装を開始する
独自の環境に同様のアーキテクチャを実装するには、主に 2 つの手順があります。
Cloud Run インスタンスをデプロイし、Pub/Sub トピックと、フロントエンド ウェブ アプリケーションに送信される WebSocket データとのブリッジを提供する
フロントエンド アプリケーションをコーディングして、WebSocket 接続や、インバウンド データ ストリームに基づく可視化の継続的な更新を管理できるようにする
接続管理
オープンソース パッケージの Autosocket は、Pub/Sub トピックを自動的にミラーリングし、Cloud Run インスタンスとフロントエンド ウェブ クライアントの間の接続を処理します。アプリケーションが可視化する取引シンボルごとに個別のエンドポイントが維持されます。ユーザーが各シンボルの関連タブをクリックすると、現在のシンボルのエンドポイント接続が切断され、新しく選択されたシンボルに対して別の接続が確立されます。構築と破棄が頻繁に発生するため、接続管理は単純にする必要があります。図 3 のコードは、WebSocket 接続を管理する簡単な方法の一例です。
図 3: JaveScript での WebSocket の接続管理
大規模な可視化
アプリケーションの可視化の一つは、ライブ更新される右肩下がりのグラフで、取引所から最良呼び値のデータ ストリームを読み取ったものです。大半の右肩下がりのグラフにプロットされている価格は、単一決済または最新の販売価格を表しています。Smart Stream で利用可能な両面市場の実際の価格があるため、代わりにプロットされました。これにより、特定の先物契約の期間構造全体にわたる相対的なビッドアスク スプレッドを可視化できます。図 4 は、アプリケーションによる右肩下がりのグラフの可視化に関するスナップショットです。
図 4: 右肩下がりのグラフの可視化
グラフを可視化するためのコーディング方法の概要を以下に示し、続いて図 5 に JaveScript 実装のサンプルを示します。可視化には Google Charts を使用しています。
JavaScript の Websocket API を使用して、商品コードの WebSocket エンドポイントに接続する
先物契約の有効期限月までに JavaScript マップにキーを設定し、各エントリの対応する値として最新の価格を維持する
●SocketManager によって呼び出される processMessage() ルーチンで、新しいメッセージごとにこのマップを更新する。これにより、マップに新しい有効期限月が追加されたり、マップにすでに存在する既存の月の終値が更新されたりする可能性がある
●Object.keys() を使用してマップを並べ替え、有効期限月の時系列範囲を示す
●drawChart() ルーチンの新しいデータで可視化を更新し、drawChart() を setInterval(x,i) のコールバックとして使用して、マップからの現在の値でグラフを継続的にレンダリングする
図 5: JavaScript で実際の価格データによりグラフを更新する
実際の市場データフィードは、注文管理システムからのデータと組み合わせるかドロップコピーを交換して、トレーダーのリアルタイムの時価評価のエクスポージャーを表示できます。未実現損益(P&L)の可視化では、2 つの WebSocket 接続を並行して使用します。1 つはトレーダーの入力ポジション用で、もう 1 つはシンボルの現在価格用です。それぞれは別個の Pub/Sub トピックから生成されます。P&L の金額は、トレーダーのポジション エントリ価格と実際の市場価格の差に基づいて実行時に導き出されます。有効期限月の前の矢印は、取引の方向(ロングまたはショート)を示します。
図 6: リアルタイム トレーダーによる未実現損益の可視化
図 6 の左端のボックスには、注文ストリームから受信したデータが強調表示されています。このデータには、取引方向、商品、エントリ価格、トレーダー名が含まれています。右端のボックスには、価格ストリームを介して受信する商品の実際の市場価格が強調表示され、価格の変化に応じて P&L 列を継続的に再評価できるようにします。
実際の様子
クラウドサイトの市場データでは、CME Group のリアルタイム データを使用して、このアーキテクチャ パターンが具体的に実装されています。バックグラウンドでは、Google Cloud Build を使用して、アプリの独立した複数の柱をすばやく稼働させて相互接続できます。そしてもちろん、Terraform と Google Cloud は連携して、構成のずれを防ぐ宣言型の反復可能なデプロイを実現します。
詳しくは金融サービス向けの Google Cloud をご覧ください。
-Google Cloud 金融サービス担当カスタマー エンジニア Fayezin Islam
-Google Cloud 金融サービス担当ソリューション アーキテクト Sal Sferrazza