Apache EventMesh を試してみた
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
はじめに: Apache EventMesh とは
以前に取り上げた Solace が提供する PubSub+ Platform の説明に登場した「イベントメッシュ」は、異なる場所にある PubSub+ 同士を繋ぎ、PubSub+ に流れるイベント(メッセージ)がどこの PubSub+ にあるのかを、アプリケーションが気にすることなくイベントを受信できる環境を実現するための機能でした。
Apache EventMesh は、この「イベントメッシュ」と同様の考え方を持ち(どちらが先に現れたのか、意識しているのかは分かりませんが)、 Apache EventMesh をハブにして様々なメッセージングシステム同士を繋ぎ、多様なシステムが混在しながらメッセージをやり取りする環境を実現するためのミドルウェアです。
現時点では Apache EventMesh についての資料は限られており、例えば下記のものが見つかりました。WeBank という中国を中心に展開している銀行から始まったプロジェクトで、現在までに Apache プロジェクトとなったようです。
- Apache EventMesh
- https://eventmesh.apache.org/
- プロジェクトの公式ページです
- Born at China’s WeBank, now incubating in the ASF: Introducing Apache EventMesh
- https://thestack.technology/apache-event-mesh/
- Apache EventMesh についての概要です(2021-06-29)
- EventMesh: Event-Driven Distributed Application Runtime
- https://apachecon.com/acasia2021/sessions/1154.html
- ApacheCon Asia 2021 の発表資料です(2021-08-07)
Apache EventMesh は、CloudEvents 仕様に準拠した API を持ち、自身もメッセージングシステムとなることができます。ここでいうメッセージングシステムは、パブリッシャーなどと呼ばれるメッセージを発行(送信)するコンポーネントと、サブスクライバーなどと呼ばれるメッセージを購読(受信)するコンポーネントの仲介の役割として、メッセージの伝達・保管を担うコンポーネントを指しています(ブローカーと呼ばれることもあります)。CloudEvents は CNCF (Cloud Native Computing Foundation) によって策定されているクラウドネイティブ環境における標準のメッセージのやり取りのための仕様です。CloudEvents は様々なメッセージング API とのバインディングが開発されており、例えば MQTT などのバインディングが定義されています。従って、CloudEvents 仕様に準拠している、ということは、これら他のメッセージング API でのメッセージのやり取りに対応しているとも言えます。また、Apache EventMesh 自身は独自に gRPC や HTTP で実装された API を提供しています。
また、Apache EventMesh は、Connector (最近は Storage とも呼ばれています)と呼んでいるコンポーネントを持っており、Connector は Apache Kafka や Apache Pulsar、Redis など、他のメッセージングシステムと接続します。Connector は他のメッセージングシステムからメッセージを取り出す、あるいは他のメッセージングシステムへメッセージを送り出すことで、複数のメッセージングシステムと連携し、メッセージのやり取りのシステムを実現します。
以上の実装から、Apache EventMesh がメッセージを様々な方法(様々な API で利用でき、様々なシステムと連携できること)で集め、集めたメッセージを別のシステムに流通させることを主眼に置いたシステムであることが伺えます。
Apache EventMesh を動かしてみた
Apache EventMesh の起動
Apache EventMesh のドキュメント に Getting Started のページがあり、Gradle からのビルド・起動の方法も紹介されていますが、簡単に試すのであれば Docker Hub にて公開された v1.4.0 の Docker イメージを利用するのが良いと思います。なお、現時点で Apache EventMesh の最新版は、Github のリリースページによれば v1.8.0 (2023 年 1 月リリース)となっており、Docker イメージは少し前のバージョンのものが公開されている状態です。
まず、Apache EventMesh の動作のためには、Store と呼ばれる Apache EventMesh の中でメッセージの保持に利用されるコンポーネントが必要となり、RocketMQ が採用されています。
https://eventmesh.apache.org/docs/instruction/store-with-docker
次に、Apache EventMesh の Runtime(サーバー)の起動となります。Doc に書かれた手順は部分的なもので、eventmesh.properties には他にも必須項目があります。私が動作確認のために使用した eventmesh.properties は以下の通りです。
https://eventmesh.apache.org/docs/instruction/runtime-with-docker
eventMesh.server.http.port=10105 eventMesh.server.tcp.port=10000 eventMesh.server.grpc.port=10205 eventMesh.server.idc=DEFAULT eventMesh.server.env=DEV eventMesh.server.cluster=COMMON eventMesh.server.name=EVENTMESH-runtime eventMesh.sysid=0000 eventMesh.connector.plugin.type=standalone #(*1) eventMesh.security.plugin.type=acl #(*2) eventMesh.registry.plugin.type=etcd #(*3) eventMesh.trace.plugin=jaeger #(*4)
(*1) は EventMesh サーバーが持つ Connector を指定します。下記リポジトリで最新の対応している Connector 一覧を確認できます。特に他システムとの連携が必要なければ、standalone で良いと思います。
https://github.com/apache/eventmesh/tree/master/eventmesh-connectors
(*2) は EventMesh サーバーのアクセス制御をするための仕組みを指定します。下記リポジトリで最新の設定項目一覧を確認できます。
https://github.com/apache/eventmesh/tree/master/eventmesh-security-plugin
(*3)は EventMesh サーバーをクラスター化する際に用いる Registry(サーバーの情報を登録する場所)を登録します。下記リポジトリで対応しているものの一覧を確認できます。
https://github.com/apache/eventmesh/tree/master/eventmesh-registry-plugin
(*4)は EventMesh サーバーのメトリック情報などを送信するものを登録します。下記リポジトリで対応しているもののの一覧を確認できます。
https://github.com/apache/eventmesh/tree/master/eventmesh-trace-plugin
(*1)(*2)(*3)(*4)のそれぞれ設定内容によっては、追加の設定項目が必要になります。
Apache EventMesh の起動が完了すると、Docker コンテナは以下の 3 つが起動している状態となります。設定ファイルの内容に合わせ、指定ポートがクライアントからの接続を受け付けている状態となります。
Image | Ports |
---|---|
eventmesh/eventmesh:v1.4.0 | 0.0.0.0:10000->10000/tcp, :::10000->10000/tcp, 0.0.0.0:10105->10105/tcp, :::10105->10105/tcp |
rocketmqinc/rocketmq-broker:4.5.0-alpine | 0.0.0.0:10909->10909/tcp, :::10909->10909/tcp, 0.0.0.0:10911->10911/tcp, :::10911->10911/tcp, 10912/tcp |
rocketmqinc/rocketmq-namesrv:4.5.0-alpine | 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp |
Apache EventMesh サンプルアプリケーションの起動
ドキュメントに記載があるように、eventmesh-examples というところにサンプルアプリケーションが配置されています。サンプルアプリケーションには、gRPC や HTTP の API を用いるパブリッシャーとサブスクライバーが含まれています。
https://eventmesh.apache.org/docs/instruction/demo
Github から以下のリポジトリを取得し、Gradle でビルド(例: gradlew clean build dist)します。Java 8.0 でないとビルドできないため、あらかじめ環境を整えておきます。
https://github.com/apache/eventmesh
ビルドがすべて完了すると、eventmesh-examples にあるサンプルアプリケーションの動作に必要な jar ファイルがすべて取得・生成された状態になります。
eventmesh-examples 以下にある bin ディレクトリのシェルスクリプトは、Apache EventMesh サンプルアプリケーション起動のために参考になりますが、一部環境依存の設定があると思われ、私の検証環境ではそのまま用いることはできませんでした。具体的には java の -classpath オプションが検証環境に適したものではなかったため、ハードコーディングして指定しました。
## incubator-eventmesh リポジトリは /home/user/ 配下にある環境とします -classpath '/home/user/incubator-eventmesh/eventmesh-examples/dist/conf:/home/user/incubator-eventmesh/eventmesh-examples/dist/apps/*:/home/user/incubator-eventmesh/eventmesh-examples/dist/lib/*:/home/user/incubator-eventmesh/eventmesh-common/dist/lib/*'
パブリッシャーの起動、メッセージの送信に成功すると、アプリケーションが使用しているプロトコルによりますが、HTTP を例にすると、下記のような DEBUG メッセージが出力されます。
(response={"retCode":0,"retMsg":"successSendResult[topic=TEST-TOPIC-HTTP-ASYNC, messageId=67]","resTime":1673871722530})
また、サブスクライバーの起動、メッセージの受信に成功すると下記のような DEBUG メッセージが出力されます。
(response={"retCode":0,"retMsg":"success","resTime":1673871923774})
終わりに
Apache EventMesh は様々なインタフェースを持ちメッセージの受け渡しの機能、他のメッセージングシステムと連携してメッセージを転送する役割を持つハブの機能、を持ったミドルウェアです。
ドキュメントを見ると、Apache EventMesh の中にサーバーレスワークフローやイベントコンピューティング(ストリームデータ処理)のシステムを組み込み、メッセージの加工もできるようです。Apache incubating から卒業したばかりの段階であることもあり、現在のドキュメントは利用手順書よりも設計書としての内容がほとんどとなっていました。各機能の利用方法については今後公開・整備されていくものと思われ、より利用者が増えていくことが期待されます。