Scala でゼロから再実装する予定の Java Web サービスがあります。私は、約 10 ~ 20 人のアクターを使用して、新しいコードのアクター ベースの設計を行っています。ユースケースの 1 つには、次のようなフローがあります。
Actor
A
はメッセージを取得し、Actor によって処理されるa
数十のメッセージを作成し(負荷分散のために複数のインスタンスを作成することもできます)、Actor に対して複数のメッセージを生成します。b
B
c
C
上記のシナリオでは、1 つのメッセージa
で数千のメッセージが送受信される可能性がありますが、1 日に数件以上のメッセージが送信されるとは考えていませんa
(はい、現時点では忙しいサービスではありません)。
次の要件があります。
- メッセージは失われたり、繰り返されたりしてはなりません。システムが b メッセージの処理中に再起動された場合、未処理のメッセージは再起動後に取得する必要があります。一方で、処理されたものは再び取得されるべきではありません (これらのメッセージは最終的に大きな計算を開始し、それらを繰り返すことはコストがかかります)。
- 簡単に拡張できる必要があります。つまり、将来的には、すべての通信 (またはその一部) を読み取ることができる他のコンポーネントをシステムに追加して、たとえば、何が起こったかのログを作成したり、処理された b メッセージの数を数えたりしたいと思うかもしれません。これらの「コンポーネント」は、他の言語で書かれた独立したアプリケーションである可能性があることに注意してください。
私はメッセージ バス テクノロジに慣れていませんが、読んだ内容から、これらの要件は、RabbitMQ、Kafka、Kestrel などの「メッセージ バス」が提供するもののように思えますが、akka も永続化のための手段を提供していることがわかります。私の問題は、非常に幅広い可能性を考えると、どのテクノロジーを使用すればよいか分からないことです。Kafka のようなものは、おそらく私のアプリケーションにとってはやり過ぎだということを読みました。しかし、akka の永続性が私の 2 つの要件 (特に拡張性) を満たすかどうかもわかりません。
私の質問は、エンタープライズ メッセージ バスを使用する必要があるかどうかです。カフカみたいな?それともakkaの持続性のようなものでしょうか?それとも、自分で何かを実装した方がより高速で適切でしょうか (たとえば、拡張性を可能にする AMQP をサポートしています)?
もちろん、この目的に適合するものを知っている場合は、特定のテクノロジーの提案も歓迎します。