1

apache-camelを使用してimap受信ボックスをポーリングしようとしていますが、このセットアップがクラスター内でどのように動作するのか疑問に思っています。クラスタの各ノードにApacheCamelをデプロイし、各ノードが受信トレイをポーリングします。

多くの消費者が同じメッセージを受け取らないようにするにはどうすればよいですか?

4

3 に答える 3

3

私は単純な道を進み、追加のコンポーネントをインストールしないことにしました。クラスター化された Quartz ジョブを使用して、受信トレイのポーリングをトリガーしました。次に、ポーラーは取得コマンドを Hazelcast 分散キューに配置します。このコマンドは、クラスター内の一連のメッセージ取得コンポーネントによって受信されます。

このタスクを解決するためだけに、キャメルに加えて、インストール、Jms、James の匂いがしました。

于 2012-09-24T07:17:54.223 に答える
1

imap は実際にはこの種のタスクのプロトコルではないため、簡単ではありません。

秘訣は、多くのコンシューマーではなく、1 つのコンシューマーにポーリングを実行させることです。高可用性のために多くのノードがある場合は、JMS でいくつかのトリックを実行して IMAP ポーリングをトリガーできます。

たとえば、jms トリガー メッセージを使用してポーリングを開始し、クラスターのすべてのメンバーにそのポーリングをリッスンさせることができます。concurrentConsumer を 1 および非同期に保ちます。Camel で JMS が無効になりました。メッセージ グループまたはActiveMQ の排他的なコンシューマーに依存して、1 つのノードのみがトリガー メッセージを取得するようにすることができます (生きている場合、そうでない場合は別のノードが引き継ぎます)。ポーリング メッセージの生成は難しいかもしれませんが、各キャメル ノードからのタイマー ルートと同じくらい簡単に行うことができます。周波数を合わせるだけです。

この設定により、IMAP での競合状態が回避されますが、負荷分散は行われず、少なくともフェイルオーバーは保護されます。先に進んで同時ポーリングを行うだけで十分かもしれませんが、問題はほとんどありません。ただし、コンシューマを 1 つだけ許可することなく 100% 安全になるとは思いません。

于 2012-09-22T22:50:21.277 に答える
1

クラスター化された環境では、imap ポーリングを行う、アクティブな単一の Camel ルートを選出する方法を持つことを検討できます。そして、ノードがダウンした場合のフェイルオーバーのロジックを用意します。

Camel では、ルートに適用できるルート ポリシーを見ることができます。 http://camel.apache.org/routepolicy

Zookeeper コンポーネントには、クラスター内のリーダーを選出するためのポリシーがあり、1 つのルートのみをアクティブにできます。ただし、これには Zookeeper を使用する必要があります。 http://camel.apache.org/zookeeper

于 2012-09-23T07:04:43.967 に答える