パチンコ台データオンライン

Wasmでストリーミングエンジンを実装したRedpandaを紹介

2023年10月20日(金)
松下 康之 - Yasuyuki Matsushita
LFのオンラインセミナーからWebAssemblyでストリーミングを実装したRedpandaを紹介する。

The Linux Foundationが公開した動画から、WebAssemblyを使ってストリーミング処理のためのエンジンを実装したRedpandaを紹介する。2023年8月19日に公開された「LF Live Webinar: How Wasm Simplifies Streaming Data Pipelines」と題された動画から、その概要とアーキテクチャー、そしてストリーミングにWasmを応用する利点などを解説したい。

●動画:

Wasmを使ってストリーミング処理をシンプルにするというタイトルの動画

Wasmを使ってストリーミング処理をシンプルにするというタイトルの動画

セッションを担当したのはRedpanda Dataのテクニカルリード、Tyler Rockwood氏だ。Redpanda DataはAkamaiでエンジニアをしていたAlexander Gallego氏が2019年にサンフランシスコで創業したベンチャーである。

セッションを担当したRedpanda DataのTyler Rockwood氏

セッションを担当したRedpanda DataのTyler Rockwood氏

このセッションのアジェンダには「WebAssemblyとは何か」「Wasmをストリーミング処理に使う理由は何か」「難しい点は何か」「その難しさを解決する方法は」などが挙げられている。

セッションのアジェンダ

セッションのアジェンダ

まずは前提知識としてWebAssemblyとは何かを簡単に紹介した。ここではスタックベースの仮想マシンで実行するためのバイナリー実行形式ファイルフォーマットであること、さまざまなプログラミング言語からコンパイルターゲットとして設計されていること、ブラウザーからサーバーまで幅広く適用できることなどを挙げている。

WebAssemblyとは何か

WebAssemblyとは何か

そしてさまざまなCPUアーキテクチャーで実行できるよう、複数の命令セットに対応していること、バージョンに依存せずに後方互換性を重視していること、メモリーセーフなサンドボックスで実行されることを3つの特徴として紹介した。

WebAssemblyの3つの特徴

WebAssemblyの3つの特徴

通常のWebAssemblyの解説であればここで終わってしまうが、ストリーミング処理に向かうためのより細かな解説としてモジュール、メモリー、テーブルというコンセプトを紹介。

モジュール、メモリー、テーブルという3つのコンセプトを紹介

モジュール、メモリー、テーブルという3つのコンセプトを紹介

またWebAssemblyの実行命令はスタックベースであることも追加し、プログラムに記述されたCPUのインストラクション(命令)がどのように扱われるのかを解説した。これは後に解説されるthread-per-coreにも繋がる部分だ。

スタックベースの計算方式を紹介

スタックベースの計算方式を紹介

そしてインタープリターによる実行とコンパイルされたプログラムはコンパイル時間と実行時間のトレードオフとなることも紹介し、これも実行速度を求めるストリーミング処理にはコンパイラによって最適化された命令セットとデータセットの組み合わせが必要であることを説明した。

インタープリター方式とコンパイラ方式の違い

インタープリター方式とコンパイラ方式の違い

比較対象として、従来のストリーミング処理の代表格であるApache Flinkを例に挙げて違いを説明。ここではApache Flinkはステートレスと書かれているがステートフルの誤記ではないだろうか。

クラシックなストリーミング処理のOSS、Apache Flinkを紹介

クラシックなストリーミング処理のOSS、Apache Flinkを紹介

WebサイトなどでクリックされたデータをJSONで入力し、シリアライゼーションのためにAVROフォーマットで出力するという例を紹介している。

これに対しRedpandaでは、Wasmで書かれたプログラムがRedpandaの中で実行され、同様にJSONからAVRO形式でデータが変換されることを示している。

Redpandaの中でWasmのプログラムが実行される

Redpandaの中でWasmのプログラムが実行される

「どうしてWasmが必要なのか?」という部分には、「さまざまなプログラミング言語で処理を記述できること」「実行時間を厳密に管理できること」「サンドボックスによってPOSIXの機能を呼び出せるWASIがあること」などを挙げている。

ストリーミング処理にWasmを使う理由

ストリーミング処理にWasmを使う理由

このスライドのサブタイトルに「Javaは同じ機能を実装しているはずだったのでは?」という問いかけがあるのが興味深いところだろう。JavaはWrite once run everywhereを目指して開発された言語だったが、この期待を現状では満足できていない。これはRockwood氏が暗に言いたいことでもあるのだろう。「さまざまなプログラミング言語」という部分ではC++やRust、Goなどに加えてまだ多くのデベロッパーが使うJavaもWasmのターゲットの一つとして挙げられている。

Wasmをターゲットとする各種プログラミング言語の例

Wasmをターゲットとする各種プログラミング言語の例

実行時間を厳密に管理できるという部分にはCPUの処理サイクルの回数を制限可能な点や、他のスレッドをアボートできる部分を解説。メモリーについてもメモリーアロケーションのサイズなどについて管理が可能であると説明している。

実行時間を管理できる機能を紹介

実行時間を管理できる機能を紹介

そしてUNIXにおけるシステムサービスのインターフェースの規格であるPOSIXを例に、WebAssemblyのシステムインターフェースWASIを紹介した。

WasmからOSの環境変数へのアクセスや入出力などを定義するのがWASI

WasmからOSの環境変数へのアクセスや入出力などを定義するのがWASI

ここからストリーミング処理にWasmを使う際に必要となる細かなポイントについて解説し、外部サービスとのインターフェースの実装、インタープリター言語の場合はインタープリター自体をWasmにコンパイルする必要があることなどについて解説した。まだ未実装の機能があることなどについても触れ、コンポーネントモデルもまだ未成熟であるために外部プログラムの呼び出しにも制限があることなどにも言及した。

その後、Rockwood氏が所属するRedpandaの製品であるRedpandaについて解説。ここでは高速なストリーミングデータエンジンであると紹介している。

Redpandaの紹介

Redpandaの紹介

クライアントからはKafkaプロトコルで接続し、データのストリーミング処理を行うのがRedpandaだが、ワーカーとなるエンジン内部ではRaftによる合意アルゴリズムが実装されており、分散処理に適したアーキテクチャーとなっている。Raftはクラウドネイティブの代表格であるKubernetesのデータストアであるetcdが使っていることでも知られているが、それがRedpandaでも使われていることに注目したい。またエンジンそのものは単体のバイナリーで構成されており、外部の依存関係がないという部分もJava製のアプリケーションとは異なる特徴だろう。

データを順次高速に処理することがストリーミング処理の根幹だが、その高速処理を支えているのはthread-per-coreという仕組みだろう。このスライドでは非同期のシステムコール、スレッドで何もシェアしない構造に加えてthread-per-coreが紹介されている。

Redpandaが高速な理由を解説。スレッド間のメッセージ処理にはSeastar frameworkが使われている

Redpandaが高速な理由を解説。スレッド間のメッセージ処理にはSeastar frameworkが使われている

このスライドに登場するSeastar frameworkは高速リアルタイムNoSQLであるScyllaDBが開発するフレームワークであり、Redpandaはそれを活用しているということになる。

●参考:

ScyllaDBについては以下の公式サイトを参照されたい。

●参考:

thread-per-coreは複数のスレッドがCPUのコアにスワップされて実行されることでオーバーヘッドが発生することを避けるためのテクニックであり、Redpandaが用意している別の動画で簡単に解説されているので、詳しくはその動画を参照して欲しい。

●参考:thread-per-coreの解説:

マルチコアとthread-per-coreの比較

マルチコアとthread-per-coreの比較

この動画ではthread-per-coreはコンテキストスイッチを極力抑えるための方法論ということが解説されている。

また実行の際のメモリーアロケーションについても、クラスターのブート時に予め予約されたメモリー領域を作ってそれをWasmモジュールに割り当てるというストリーミング処理を高速に実行するための仕組みや、スレッドから別のスレッドを非同期に呼び出しを行う仕組みなども解説し、ストリーミング処理を高速に実行するためのテクニックを紹介した。

WasmがEnvoy Proxyでどのように使われているか? を紹介

WasmがEnvoy Proxyでどのように使われているか? を紹介

そしてWasmを組み込んだ例としてEnvoyのフィルター処理、Open Policy AgentのRegoで書かれたポリシーコードをWasmにコンパイル可能する例などを紹介した。

最後にまとめとしてWebAssemblyによってオーバーヘッドを抑えて高速にデータストリーミング処理が可能になったこと、WASIが標準化されることでデベロッパーには馴染みやすい状況になってきたことなどを挙げて、Wasmをデータストリーミングに用いるのは実験的な試みではなく、本番環境での実装を検討すべき状況になったことを紹介して質疑応答に移った。

これまでWasmはIoTやサーバーレスなどマイクロサービスの実行要素として位置付けられている場合が多かったが、高速でメモリーセーフ、さまざまなCPUアーキテクチャーに対応していることなどから、サーバーサイドで大量のデータ処理を行うためのエンジンとしても使えるというのがRedpandaとしてのメッセージだろう。JavaやPythonの牙城ともいえたビッグデータやストリーミングにもWebAssemblyが新しい波を起こせるのか、注目したい。

●参考:

著者
松下 康之 - Yasuyuki Matsushita
フリーランスライター&マーケティングスペシャリスト。DEC、マイクロソフト、アドビ、レノボなどでのマーケティング、ビジネス誌の編集委員などを経てICT関連のトピックを追うライターに。オープンソースとセキュリティが最近の興味の中心。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています