2015-09-18 23 views
7

Akkaの最新バージョンでは、耐久性のあるメールボックスがAkkaから削除されたことに気づいたとき、私は作業していました。恒久的なメールボックスが削除されたので、Akka Actorsでメッセージを回復する方法は?

クラッシュ後の再起動時に私のメッセージが回復することを確認する必要があります。耐久性のあるメールボックスや他の誰かによるカスタム実装なしで作業する別の方法がありますか?

また、私はAkka Persistenceを試しましたが、メッセージを再生し、すべてのメッセージの実行に費用がかかることを考えると、クラッシュ時に同じメッセージを2回送信したくありません。

答えて

1

これはAkka Actorsと対話するための正確な解決策ではありませんが、問題の元の問題はここで解決します。

ここではAkkaを使用する代わりに、akka/reactive-kafkaなどの反応ストリームとともにKafkaのようなものを使用することをお勧めします。

このようなシステムは永続性に非常に優れており、クラッシュ時にメッセージキューを保持するための非常に優れたセマンティクスを提供します。これは、処理されるメッセージのどこかにメッセージを格納するよりも優れており、一般的にはパフォーマンスが向上します。

これはカフカでなくても、リアクティブストリーム(Akkaの実装など)でプラグできるバックエンドです。

-1

Akka Persistenceは、受信したコマンドに基づいて作成されたイベントを再生します。イベントは検証後にコマンドメッセージから生成され、無効なアクター状態を作成できないようにすべきです。

これは、最初に受信したメッセージ(コマンド)を必要以上に再生しないことを意味しますが、クラッシュ後にアクターの状態を再構築するのに適用するのに安価なイベントを維持できます。さらに、snapshotsを使用して状態を直接回復することもできます。

編集: 私は俳優の唯一の状態が永続化されたことは事実であるとのクラッシュを存続コメントで述べたように。この状態は消費されたメッセージのみを反映し、まだアクターメールボックスに存在するメッセージは反映しません。

しかし、永続的なメールボックスに格納されるアクターにメッセージをプッシュするのではなく、メッセージのリストを自分の状態の一部として保管する永続アクターからメッセージを引き出すための代替方法があります。

UntypedPersistentActorWithAtLeastOnceDelivery akkaパーシステンスの一部として、送信者が永続メッセージを処理する別の可能性があります。

システムを再考する必要があるため、これらのメールボックスは耐久性のあるメールボックスには置き換えられません。これまでのところ、消費者からの仕事を引き出してくれました。当初、メッセージキュー製品(耐久性キューを備えたRabbitMQ)も考慮しましたが、私たちの初期作業項目はdbから来て以来、耐久性のあるメッセージなしでakkaクラッシュを処理できます。

+2

永続性機能は耐久性メールボックスとは異なります。ノードがクラッシュし、メッセージが消費されない(永続化される)場合に失われるメモリ内のキューがまだあります。 – Jags

関連する問題