AtLeastOnceDelivery
の特性をディスクに保存し、情報をメモリに保持しないように調整する方法はありません。 AtLeastOnceDelivery
は、永続アクタと同様のセマンティクスに従います。配信可能メッセージはAkka永続性バックエンドにバックアップされ、高速アクセスのためにメモリに保持されます。メモリ内の記憶域はhardcoded to the traitです。
境界内でメモリ使用量を維持できない場合は、おそらく、それが起こっている理由と解決方法を調べる必要があります。メモリ不足のままになっている俳優は、メッセージ配信への応答が十分に速くないため、成果物が積み重なっているようです。
メッセージ処理のスピードを上げるためにいくつかの方法があります。メッセージ処理の個々のコンポーネントを最適化して高速化するか、Router actorなどの手法を使用してメッセージ処理を並列化することができます。ただし、処理を高速化するにはこれらのトリックでは不十分な場合があります。これは、処理のためにメッセージがどのようにアクターに送られるかを制御する必要がある場合です。
俳優がそれに来るすべてのメッセージを受け入れる代わりに、make the actor pull the workを代わりに使用できます。このパターンを実装する方法はたくさんありますが、アクターのすべてのメッセージを直接ダンプするのではなく、データベース(または大量のデータを処理できるもの)にメッセージを保存してから、アクターは、格納されたメッセージをできるだけ早く引き出し、処理します。私はパターンのための多くの既製のソリューションがあるとは思わないので、おそらく自分でソリューションを実装するための少しの作業を行う必要があります。
私たちは未確認メッセージの最大数を設定して遊んでいます。この値を小さくするとOutOfMemoryErrorが発生しなくなりますが、その後のメッセージは破棄されます。私たちは未確認のメッセージがメモリに保存されないが、メッセージを失うことなく常にファイルに書き出される解決策を望んでいる。 –