2

私はカフカからメッセージを取得し、ターゲットシステムを呼び出して従来のOracle DBを更新するアプリケーションを持っています。ターゲットシステムがダウンしたときにSpring Cloud Stream @StreamListenerがリッスンするのを停止します

対象システムがダウンしている場合、メッセージをKafkaバスに残し、一定期間処理しないシナリオを有効にしたいと考えています。 Circuit-breaker Hystrixベースのソリューションを検討していましたが、Spring Cloud Streamにリスニングイベントを「停止」させる仕組みは見つかりませんでした。私が考えることができる唯一の他の選択肢は、サーキットブレーカが開いている場合、これらのメッセージをエラー/再処理のトピックに転送することですが、それは私のアンチパターンのように聞こえるでしょう。私はは、イベントを処理することからシステムを一時停止することができます、それはマイクロサービスアプリのパブ/サブの利点です。

どのようなヘルプもうまくいくでしょう。

答えて

0

1つの解決策は、アプリケーションコンテキストを自動配線することです。

@Autowired 
private ConfigurableApplicationContext context; 

することはできstop()start()コンテキスト。

あなたはしかし@StreamListenerを呼び出し、または( - ウサギのバインダーと、少なくともコンテナは、デフォルトでは5秒間に終了し、そのスレッドを待ちますので)停止が遅れることになるスレッドでstop()を呼び出すべきではありません。

もちろん、JMXや何らかの制御トピックをリスンする別のアプリケーションコンテキストなど、何らかのアウトオブバンドメカニズムを再起動する必要があります。

+0

素晴らしいアイデア!私はそれを試してみましょう。私が推測しているのは、コンテキスト全体を停止するとアプリケーション全体が停止するので、これは完全な機能を備えた回路ブレーカのソリューションではありませんが、それは良い出発点です。 – odedia

+0

これは素晴らしい作品です。エラーの特定のしきい値に達すると、コンテキストを停止し、サーバーが起動しているかどうかをテストするための単純なwhileループに入ります(内部は30秒)。サーバーが起動すると、context.start()をもう一度呼び出すだけです。したがって、JMXやその他のものは必要ありません。このシナリオでは、プロセスは自己修復のようなものですが、すべてのメッセージはカフカに並んでいます。もちろん、pingメソッドではSpringの機能を使用することはできませんが、それは本当に簡単なので大丈夫です。再度、感謝します! – odedia

関連する問題