Wasmでストリーミングエンジンを実装したRedpandaを紹介
The Linux Foundationが公開した動画から、WebAssemblyを使ってストリーミング処理のためのエンジンを実装したRedpandaを紹介する。2023年8月19日に公開された「LF Live Webinar: How Wasm Simplifies Streaming Data Pipelines」と題された動画から、その概要とアーキテクチャー、そしてストリーミングにWasmを応用する利点などを解説したい。
●動画:https://www.youtube.com/watch?v=F86eYIgT3GA
セッションを担当したのはRedpanda Dataのテクニカルリード、Tyler Rockwood氏だ。Redpanda DataはAkamaiでエンジニアをしていたAlexander Gallego氏が2019年にサンフランシスコで創業したベンチャーである。
このセッションのアジェンダには「WebAssemblyとは何か」「Wasmをストリーミング処理に使う理由は何か」「難しい点は何か」「その難しさを解決する方法は」などが挙げられている。
まずは前提知識としてWebAssemblyとは何かを簡単に紹介した。ここではスタックベースの仮想マシンで実行するためのバイナリー実行形式ファイルフォーマットであること、さまざまなプログラミング言語からコンパイルターゲットとして設計されていること、ブラウザーからサーバーまで幅広く適用できることなどを挙げている。
そしてさまざまなCPUアーキテクチャーで実行できるよう、複数の命令セットに対応していること、バージョンに依存せずに後方互換性を重視していること、メモリーセーフなサンドボックスで実行されることを3つの特徴として紹介した。
通常のWebAssemblyの解説であればここで終わってしまうが、ストリーミング処理に向かうためのより細かな解説としてモジュール、メモリー、テーブルというコンセプトを紹介。
またWebAssemblyの実行命令はスタックベースであることも追加し、プログラムに記述されたCPUのインストラクション(命令)がどのように扱われるのかを解説した。これは後に解説されるthread-per-coreにも繋がる部分だ。
そしてインタープリターによる実行とコンパイルされたプログラムはコンパイル時間と実行時間のトレードオフとなることも紹介し、これも実行速度を求めるストリーミング処理にはコンパイラによって最適化された命令セットとデータセットの組み合わせが必要であることを説明した。
比較対象として、従来のストリーミング処理の代表格であるApache Flinkを例に挙げて違いを説明。ここではApache Flinkはステートレスと書かれているがステートフルの誤記ではないだろうか。
WebサイトなどでクリックされたデータをJSONで入力し、シリアライゼーションのためにAVROフォーマットで出力するという例を紹介している。
これに対しRedpandaでは、Wasmで書かれたプログラムがRedpandaの中で実行され、同様にJSONからAVRO形式でデータが変換されることを示している。
「どうしてWasmが必要なのか?」という部分には、「さまざまなプログラミング言語で処理を記述できること」「実行時間を厳密に管理できること」「サンドボックスによってPOSIXの機能を呼び出せるWASIがあること」などを挙げている。
このスライドのサブタイトルに「Javaは同じ機能を実装しているはずだったのでは?」という問いかけがあるのが興味深いところだろう。JavaはWrite once run everywhereを目指して開発された言語だったが、この期待を現状では満足できていない。これはRockwood氏が暗に言いたいことでもあるのだろう。「さまざまなプログラミング言語」という部分ではC++やRust、Goなどに加えてまだ多くのデベロッパーが使うJavaもWasmのターゲットの一つとして挙げられている。
実行時間を厳密に管理できるという部分にはCPUの処理サイクルの回数を制限可能な点や、他のスレッドをアボートできる部分を解説。メモリーについてもメモリーアロケーションのサイズなどについて管理が可能であると説明している。
そしてUNIXにおけるシステムサービスのインターフェースの規格であるPOSIXを例に、WebAssemblyのシステムインターフェースWASIを紹介した。
ここからストリーミング処理にWasmを使う際に必要となる細かなポイントについて解説し、外部サービスとのインターフェースの実装、インタープリター言語の場合はインタープリター自体をWasmにコンパイルする必要があることなどについて解説した。まだ未実装の機能があることなどについても触れ、コンポーネントモデルもまだ未成熟であるために外部プログラムの呼び出しにも制限があることなどにも言及した。
その後、Rockwood氏が所属するRedpandaの製品であるRedpandaについて解説。ここでは高速なストリーミングデータエンジンであると紹介している。
クライアントからはKafkaプロトコルで接続し、データのストリーミング処理を行うのがRedpandaだが、ワーカーとなるエンジン内部ではRaftによる合意アルゴリズムが実装されており、分散処理に適したアーキテクチャーとなっている。Raftはクラウドネイティブの代表格であるKubernetesのデータストアであるetcdが使っていることでも知られているが、それがRedpandaでも使われていることに注目したい。またエンジンそのものは単体のバイナリーで構成されており、外部の依存関係がないという部分もJava製のアプリケーションとは異なる特徴だろう。
データを順次高速に処理することがストリーミング処理の根幹だが、その高速処理を支えているのはthread-per-coreという仕組みだろう。このスライドでは非同期のシステムコール、スレッドで何もシェアしない構造に加えてthread-per-coreが紹介されている。
このスライドに登場するSeastar frameworkは高速リアルタイムNoSQLであるScyllaDBが開発するフレームワークであり、Redpandaはそれを活用しているということになる。
●参考:https://github.com/scylladb/seastar
ScyllaDBについては以下の公式サイトを参照されたい。
thread-per-coreは複数のスレッドがCPUのコアにスワップされて実行されることでオーバーヘッドが発生することを避けるためのテクニックであり、Redpandaが用意している別の動画で簡単に解説されているので、詳しくはその動画を参照して欲しい。
●参考:thread-per-coreの解説:Differences between Apache Kafka and Redpanda - Thread per Core Architecture
この動画ではthread-per-coreはコンテキストスイッチを極力抑えるための方法論ということが解説されている。
また実行の際のメモリーアロケーションについても、クラスターのブート時に予め予約されたメモリー領域を作ってそれをWasmモジュールに割り当てるというストリーミング処理を高速に実行するための仕組みや、スレッドから別のスレッドを非同期に呼び出しを行う仕組みなども解説し、ストリーミング処理を高速に実行するためのテクニックを紹介した。
そしてWasmを組み込んだ例としてEnvoyのフィルター処理、Open Policy AgentのRegoで書かれたポリシーコードをWasmにコンパイル可能する例などを紹介した。
最後にまとめとしてWebAssemblyによってオーバーヘッドを抑えて高速にデータストリーミング処理が可能になったこと、WASIが標準化されることでデベロッパーには馴染みやすい状況になってきたことなどを挙げて、Wasmをデータストリーミングに用いるのは実験的な試みではなく、本番環境での実装を検討すべき状況になったことを紹介して質疑応答に移った。
これまでWasmはIoTやサーバーレスなどマイクロサービスの実行要素として位置付けられている場合が多かったが、高速でメモリーセーフ、さまざまなCPUアーキテクチャーに対応していることなどから、サーバーサイドで大量のデータ処理を行うためのエンジンとしても使えるというのがRedpandaとしてのメッセージだろう。JavaやPythonの牙城ともいえたビッグデータやストリーミングにもWebAssemblyが新しい波を起こせるのか、注目したい。
●参考:Redpandaの公式サイト
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Cloud Native Wasm DayからKafkaの拡張にWasmを使うRedpandaのセッションを紹介
- WebAssemblyとRustが作るサーバーレスの未来
- Wasmの現状と将来の計画をBytecode Allianceが公開。CosmonicのBailey Hayes氏によるセッションを紹介
- KubeCon Europe 2024からWASMとeBPFを使ってストリーム処理を解説するセッションを紹介
- KafkaにWASMモジュールを組み込んでリアルタイムで機械学習を実行するRedpandaのデモセッションを解説
- KubeCon EU 2021からセキュアでコンパクトなバイナリーフォーマットWASMのセッションを紹介
- KubeCon Europe 2023共催のWasm Dayから、AdobeのWASMユースケースを紹介
- CloudNative Days Tokyo 2023から、WasmのクラウドネイティブやAI推論での利用を解説
- WasmCon 2023からLLMをWASMで実装するセッションを紹介
- WebAssemblyを取り巻く最新情報をMeetupから紹介(後半)