reactor-logbackを試した。+ LMAX Disruptorの Technical Paperを読んだメモ

以下のモジュールを試した。

Reactor LogbackはLMAX Disruptorの上に作られたReactorのアドオンだ。 このモジュールはアプリケーションのための高速で非同期なロギングの機能を提供する。パフォーマンスもロギングも諦めたくないあなたにおすすめだ。

利用方法はリポジトリに書かれているが、簡単だ。リポジトリに書いてあるサンプルを下に示しているが logback-classicに入っているAsyncAppenderと同じ形で適用可能だ。

<configuration>

  <!-- The underlying appender will be the standard console one. -->
  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
        %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
      </pattern>
    </encoder>
  </appender>

  <!-- Wrap calls to the console logger with async dispatching to Disruptor. -->
  <appender name="async" class="reactor.logback.AsyncAppender">
    <appender-ref ref="stdout"/>
  </appender>

  <!-- Direct all logging through the AsyncAppender. -->
  <root level="info">
    <appender-ref ref="async"/>
  </root>

</configuration>

適用した結果はあまり代わり映えしなかったが この状態で負荷試験をしてみたい。

なぜ試したか

ある本を読んでいて、Reactorのモジュールの紹介の中にreactor-logbackが紹介されていた。

気になったのでリポジトリを覗いてみたところ LMAX Disruptorを使っていると書かれており、試したくなった。

LMAX Disruptorとは

詳細については別途調べてほしいが 以下のテクニカルペーパーを読むと非常に興味深い。

彼ら曰く、高速なFXのトランザクション処理システムを作っていたところ パフォーマンスの追求の末、Queueが遅いことが分かったようだ。

非常に高速なQueueの開発をしていたが、結果としてはQueueでは駄目だ、となったようだ。 従来の構造では、ロックによる競合が激しくこれによってスループットが下がってしまうらしい。

上記に示したテクニカルペーパーにはロックなどの技術に関して オーバーヘッドがどのくらいか、といった話が記載されている。

Abstractにはこう記載されている 「Testing has shown that the mean latency using the Disruptor for a three-stage pipeline is 3 orders of magnitude lower than an equivalent queue-based approach. In addition, the Disruptor handles approximately 8 times more throughput for the same configuration.」

3ステージあるパイプラインをQueueベースのものと比べたところ、3桁低いレイテンシを計測し 8倍のスループットを弾き出したようだ。

非常に興味内容が他にも色々書かれている。 ぜひハイパフォーマンスを求める並列処理を書きたいあなたに読んでほしい。

なぜLMAX Disruptorを調べたか

これはElasticのAPMのコードを見たときに依存関係に見たことのないツールが入っていたからだ。

この他にも興味深い依存関係が書かれているので 非常にコードとしても面白いリポジトリだった。

ただ、disruptorは全然聞いたことないので 調べてみたところ、日本語でいくつかのブログが見つかった。 そのブログの中にあるリンクを辿るといくつかの英語のブログにもリンクがあった。 その中には有名なMartin Fowlerも記事を書いて紹介していた。

まとめ

最近見つけたreactor-addonである、reactor-logbackの紹介記事でした。 また、その中で使われているLMAX DisruptorのTechnical Paperを読んだメモを調べた経緯と共に書いた。

OSSのツールの中身を見るのは楽しい。 まだ見たことのないライブラリに出会いたい。

そういえば、途中だがTechnical Paperの和訳を自分用メモとして書いたので ここにリンク

Disruptor · GitHub

を残しておく