2016-08-09 4 views
1

AtLeastOnceDelivery永続アクタを使用しています。我々は膨大な量の未確認メッセージを取得しており、この数値が大きすぎるとOutOfMemoryErrorが発生しています。Akka Persistence - AtLeastOnceDelivery:メモリ不足で未確認メッセージを無制限に取得する方法

未確認のメッセージを確認するまでメモリに保存するのではなく、未確認のメッセージをディスクに保存するようにAtLeastOnceDeliveryアクタを設定する方法はありますか?

また、この制限を回避するAtLeastOnceDeliveryの代替手段がありますか?

+0

私たちは未確認メッセージの最大数を設定して遊んでいます。この値を小さくするとOutOfMemoryErrorが発生しなくなりますが、その後のメッセージは破棄されます。私たちは未確認のメッセージがメモリに保存されないが、メッセージを失うことなく常にファイルに書き出される解決策を望んでいる。 –

答えて

0

AtLeastOnceDeliveryの特性をディスクに保存し、情報をメモリに保持しないように調整する方法はありません。 AtLeastOnceDeliveryは、永続アクタと同様のセマンティクスに従います。配信可能メッセージはAkka永続性バックエンドにバックアップされ、高速アクセスのためにメモリに保持されます。メモリ内の記憶域はhardcoded to the traitです。

境界内でメモリ使用量を維持できない場合は、おそらく、それが起こっている理由と解決方法を調べる必要があります。メモリ不足のままになっている俳優は、メッセージ配信への応答が十分に速くないため、成果物が積み重なっているようです。

メッセージ処理のスピードを上げるためにいくつかの方法があります。メッセージ処理の個々のコンポーネントを最適化して高速化するか、Router actorなどの手法を使用してメッセージ処理を並列化することができます。ただし、処理を高速化するにはこれらのトリックでは不十分な場合があります。これは、処理のためにメッセージがどのようにアクターに送られるかを制御する必要がある場合です。

俳優がそれに来るすべてのメッセージを受け入れる代わりに、make the actor pull the workを代わりに使用できます。このパターンを実装する方法はたくさんありますが、アクターのすべてのメッセージを直接ダンプするのではなく、データベース(または大量のデータを処理できるもの)にメッセージを保存してから、アクターは、格納されたメッセージをできるだけ早く引き出し、処理します。私はパターンのための多くの既製のソリューションがあるとは思わないので、おそらく自分でソリューションを実装するための少しの作業を行う必要があります。

+0

@Jaakoあなたの答えに感謝します。あなたはあなたが作った多くの点にスポットを当てています。作業や背圧を何とか引き出すためのメカニズムを実装する必要があるかもしれないように見えます。 –

関連する問題