マイクロサービス ネットワークで ejabberd / mongooseIm を使用したいと考えています。XMPP は、REST API ネットワークとは別に、チャット プロトコルにする必要があります。xmpp サーバーで受信したメッセージをダウンストリームのワーカー サービスに送信したいと考えています。誰かがこれを行ったことがありますか、それとも私を正しい方向に導くことができますか?
私の最初の考えは、RabbitMQ を使用して、新しい受信メッセージをワーカーに送信することです。
マイクロサービス ネットワークで ejabberd / mongooseIm を使用したいと考えています。XMPP は、REST API ネットワークとは別に、チャット プロトコルにする必要があります。xmpp サーバーで受信したメッセージをダウンストリームのワーカー サービスに送信したいと考えています。誰かがこれを行ったことがありますか、それとも私を正しい方向に導くことができますか?
私の最初の考えは、RabbitMQ を使用して、新しい受信メッセージをワーカーに送信することです。
一般に、マシン間、モノのインターネット、マイクロサービスなどのメッセージング システムを構築するために使用される最も一般的な XMPP 拡張機能は、XEP-0060で定義されている PubSubです。
これは、ejabberd で有効にできるモジュールです。API ベースであるため、そのモジュールの動作をアプリケーション固有にカスタマイズすることもできます。
Pubsub は基本的に送信側と受信側を切り離すことを可能にし、特にそのユースケース向けに設計されています。
ejabberd / MongooseIM によってルーティングされたメッセージへのアクセス権をワーカーに与えるには、基本的に 2 つの選択肢があります。私はそれをよく知っているので、MongooseIM に焦点を当てます (免責事項: 私は開発チームに所属しています)。
1 つ目は、非同期 / ポーリング方式でメッセージ アーカイブをスキャンすることです。メッセージ アーカイブ管理では、それにアクセスするためのXMPP レベルのプロトコルについて説明していますが、ユース ケースでは重要な部分はメッセージの永続性です。そのため、関連するモジュール ( mod_mam
) がサーバー構成で有効になっていて、メッセージがデータベースにヒットすることを確認してください。MAM でサポートされているデータベースは PostgreSQL と Riak ですが、Cassandra バックエンド (YMMV) に関する作業もいくつかありました。選択した言語の DB ドライバーが利用可能である限り、Erlang でサーバーをいじる必要はありません。PR#657以降、シリアライゼーション モジュールを作成する場合は、生の XML やカスタム フォーマットでメッセージを保存することができます。
2 番目のオプションは、フックとハンドラー(ejabberd でも利用可能) のサーバー メカニズムを使用することです。これにより、「ユーザーがメッセージを送信した」、「ユーザーがログインした」、「ユーザーがログアウトした」などのイベントでサーバー アクションをトリガーできます。ただし、これには、Erlang で記述されたサーバー側の拡張機能が必要です。最も単純なケースでは、拡張機能は AMQP を介して (メッセージ コンテンツとメタデータを含む) 興味深いイベントを転送するか、外部の HTTP/REST API を呼び出すことができます。これにより、実際の作業はワーカーによって実行され、実装言語に関して自由が得られます。 . このオプションでは、メッセージの永続性のためにデータベースを有効にしたり設定したりする必要もありませんmod_mam
(永続的なメッセージ キューを使用することもできます...)。
一般に、このアイデアは完全に実現可能です。