ディスラプター-新しいマルチスレッドプログラミングパラダイム

先週、私が働いているLMAX会社が、DisruptorフレームワークでJava Duke's Choice Award 2011受賞しました。 以前、オブジェクトプログラミングに関する出版物で多くの読者に知られているMartin Fowlerは 、この技術について書いていました。



この記事では、このテクノロジーと、このテクノロジーがLMAXで解決する特定の問題について簡単に説明します。



LMAXは、非常に低いレイテンシーと高いスループットを備えたCFDおよび外国為替取引プラットフォームを提供します。



1秒間に1万回を超える操作の実行速度を実現するために、LMAXはDisruptorパターンを開発しました。 これは、並列プログラミングの問題を解決するためのまったく新しい、非常に型破りなアプローチです。 ディスラプターは、マルチスレッドの並列トランザクション処理フレームワークであり、高いスループットと非常に低いレイテンシを備えています。 ディスラプターLMAXはjava.util.concurrent.ArrayBlockingQueueを置き換え、最大80倍のパフォーマンスを実現します。



マルチスレッドプログラミングの問題



パフォーマンステストでは、キューを使用してシステムの各部の間でデータを転送することにより遅延が生成されることが示されています。 スレッドのロックとセマフォは、理解とテストが難しく、多くの場合、実際の問題を解決するよりもデバッグに時間がかかります。 また、マルチスレッドプログラミングのテストでは、多くの場合、複数のスレッドを使用するとパフォーマンスが向上するだけでなく、パフォーマンスが低下することが示されました。



この表は、2.4Ghz Nehalemプロセッサ( 同僚のブログから盗まれた)でさまざまな手法を使用して64ビットカウンターを5億倍に増やすコストを示しています。

方法

時間(ミリ秒)

シングルスレッド

300

メモリバリアを備えた単一ストリーム

4,700

CASを使用した単一ストリーム

5,700

CASを使用した2つのストリーム

30,000

ロック付きシングルスレッド

10,000

ロック付きの2つのスレッド

224,000





LMAXアプローチ



簡単な例を使用して説明しましょう。 お菓子のパックを注文し、クレジットカードで支払うと想像してください。 簡単な小売システムが注文に関する情報を受け取り、クレジットカード検証サービスを使用してカード番号を確認し、注文を確認します。これらはすべて1つのトランザクションで行われます。 クレジットカードのチェックを待機している間、注文を処理するスレッドはブロックされますが、このロックはユーザーにとってそれほど長くなく、サーバーは常にプロセッサで別のスレッドを開始できます。



LMAXアーキテクチャでは、この操作は2つの部分に分割されます。 最初の操作は、注文に関する情報の収集です。注文に関する情報の収集は、クレジットカード会社のイベントの終了(クレジットカード検証要求)で終了します。 その後、ビジネスロジックプロセッサは、入力イベントストリームでクレジットカード検証イベントを受信するまで、他のクライアントのイベントを処理し続けます。 このイベントの処理後、注文が確認されます。



ディスラプターは、スレッド間でメッセージを交換するための非常に高速で低遅延の方法です。 これは、ステロイド(大量のステロイド!)を待ち行列に入れるようなものです。そして、LMAX交換の主要な革新の1つです。 ディスラプターには、製造業者、消費者、および循環バッファーが含まれます。 各生産者と消費者は、シリアル番号、つまり現在処理しているバッファ内のセルを知っています。 各メーカーと消費者は、自分の番号をカウンターに書き込み、他のカウンターを読み取ることができます。 したがって、消費者はメーカーのカウンターを読んで、書き込みたいセルが利用可能であることを確認できます。 また、コンシューマは、別のコンシューマが処理を終了した後にのみ、メッセージを処理することを確認できます。



LMAXのディスラプター



Disruptorの利点は、消費者が遅れている場合に他の人にすばやく追いつくことができることです。 メッセージコンバーター(非マーシャラー)がセル15で問題を検出し、受信者がセル31にいるときにこれを実現すると、セル16〜30からデータを一度に読み取り、すぐに追いつくことができます。 大きなブロックを読み取る機能は、遅れている消費者が他の消費者にすばやく追いつくのに役立ち、その結果、待ち時間が短縮されます。



ビジネスロジックプロセッサは、メソッド呼び出しに応答して出力イベントを生成するシングルスレッドJavaプログラムを使用して、ビジネスロジック全体を制御します。 データベースやその他の永続的なストレージなしで、RAMで完全に動作します。



ビジネスロジックは単一のスレッドで実装されますが、ビジネスオブジェクトを呼び出す前にいくつかのタスクを実行する必要があります。 ネットワークからの着信メッセージは、ビジネスロジックに便利な形式でアンマーシャルする必要があります。事故が発生した場合にデータを回復できるように、信頼できるドライブに保存する必要があります。



これらの問題は、入力および出力ディスラプターによって解決されます。 ビジネスロジックプロセッサとは異なり、これらは低速で独立したI / O操作を含むため、並列コンポーネントです。



画像



イベントの入力ストリームは信頼できるストレージ(これは入力ディスラプターのタスクの1つです)に格納されるため、入力イベントを再生することにより、ビジネスロジックプロセッサの現在の状態をいつでも復元できます。 。



結論とリソース



ディスラプターは開発ごとの普遍的なソリューションではありませんが、正しく使用すると、ソフトウェアシステムの速度が著しく向上することがあります。

多くの場合、金融会社はテクノロジーについて語りません。 LMAXは、その開発についてオープンに語っているだけでなく( ブログを参照)、 オープンソースのDisruptorコードもリリースしています。



参照- 公式LMAXウェブサイトおよびロシア語の LMAX パートナーサイト



PSこのフレームワークは、1年前にローンチされたLMAX取引プラットフォームの中心にあり、毎秒数千のトランザクションを正常に処理できると付け加えます。




All Articles