私は、JMS(ActiveMQ)を介して緩く(非同期に)結合されたさまざまなコンポーネント(サービス)で構成される分散システムを開発しています。
したがって、私は車輪の再発明をしたくありません。これらのコンポーネント間のリモートプロシージャコールを容易にし、メソッドインターフェイスの処理に役立つ(よく知られている)プロトコル/ライブラリを探しています。
それでは、私が現在すでに解決している問題を、汚い解決策で分解してみましょう。
- コンシューマーコンポーネントはサービスを呼び出したいので、要求文字列を作成します(手書きおよびダーティ)
- リクエスト文字列は圧縮されてJMSメッセージに入れられます(ダーティも)
- 要求メッセージは、JMSおよびルーティングメカニズムを介して送信されます(その部分は問題ありません)
- サービスはまず、正しいメソッドを識別するために、要求文字列を解凍して解析する必要があります(ダーティ)
- メソッドが呼び出され、応答は#2-#4のようになります。
つまり、これはSOAPに非常によく似ていますが、SOAPはアプリケーションにとって非常に重いと思いますが、さらにHTTPをまったく使用していません。問題をさまざまなコンポーネントに分解できるかもしれないと私は考えていました。
- パートA:HTTPはJMSに置き換えられます(これで問題ありません)
- パートB:XMLはより軽量なものに置き換えられています(ここではMessagePackが便利です)
- パートC:要求/応答文字列を解析して操作名とパラメーター値を識別するメカニズム(これがここでの本当の問題です)
私はMessagePack、ProtocolBuffers、Thriftなどを調べていましたが、実際の(TCP)通信を処理する独自の方法を導入しているのが気に入らない点です。そして、すでに洗練されたJMSインフラストラクチャ(負荷分散なども処理します)をバイパスします。
上記のパートCをさらに詳しく説明するために、これが現在の処理方法です。消費者がサービスを呼び出す場合、次のようなことを行うことを知っています。サービスがテキストを受け取り、キーワードに応答するとします。コンシューマーにJMSメッセージを作成させ、それを(ActiveMQを介して)サービスに送信させます。メッセージには次のものが含まれます。
Syntax: OPERATION_NAME [PARAMETERS]
Method: GET_ALL_KEYWORDS [String text] returns [JSON String[] keywords]
Example Request: GET_ALL_KEYWORDS "Hello world, this is my input text..."
Example Reply: ["hello", "world", "text"]
言うまでもなく、それは一緒にハッキングされたように感じます。私が目にする問題は、パラメータを追加または削除してメソッドインターフェイスを変更する場合、変更を同期するためにすべての要求/応答文字列の構築/分解をチェックする必要があることです。それはかなりエラーが発生しやすいです。「プロトコル例外:必須パラメーターが設定されていません」などのようなものを台無しにした場合は、Javaインターフェイスを確認し、実行時に実際の例外をスローすることで、ライブラリに適切な要求/応答構文を構築させたいと思います。
そのために知られているプロジェクト/ライブラリはありますか?
要件は次のようになります
- 小型軽量で高速です。
- それはJAVAで実装されています
- それはあまり多くの目的を果たしません( Springなどの本格的なフレームワークのように)