まず、私は Akka の初心者ではありません (2 年以上使用しています)。大量のネットワーク I/O を実行する高スループット (数百万のメッセージ/分/ノード) のアプリケーションがあります。最初のアクター ( によって支えられているRandomRouter
) はメッセージを受け取り、処理のために適切な子アクターに配布します。
private val distributionRouter = system.actorOf(Props(new DistributionActor)
.withDispatcher("distributor-dispatcher")
.withRouter(RandomRouter(distrib.distributionActors)), "distributionActor")
アプリケーションは高度に調整されており、優れたパフォーマンスを発揮します。の前に耐久性のあるメールボックスを使用して、耐障害性を高めたいと考えていますDistributionActor
。関連する構成は次のとおりです (ファイルベースのメールボックスの追加のみが変更されます)。
akka.actor.mailbox.file-based {
directory-path = "./.akka_mb"
max-items = 2147483647
# attempting to add an item after the queue reaches this size (in bytes) will fail.
max-size = 2147483647 bytes
# attempting to add an item larger than this size (in bytes) will fail.
max-item-size = 2147483647 bytes
# maximum expiration time for this queue (seconds).
max-age = 3600s
# maximum journal size before the journal should be rotated.
max-journal-size = 16 MiB
# maximum size of a queue before it drops into read-behind mode.
max-memory-size = 128 MiB
# maximum overflow (multiplier) of a journal file before we re-create it.
max-journal-overflow = 10
# absolute maximum size of a journal file until we rebuild it, no matter what.
max-journal-size-absolute = 9223372036854775807 bytes
# whether to drop older items (instead of newer) when the queue is full
discard-old-when-full = on
# whether to keep a journal file at all
keep-journal = on
# whether to sync the journal after each transaction
sync-journal = off
# circuit breaker configuration
circuit-breaker {
# maximum number of failures before opening breaker
max-failures = 3
# duration of time beyond which a call is assumed to be timed out and considered a failure
call-timeout = 3 seconds
# duration of time to wait until attempting to reset the breaker during which all calls fail-fast
reset-timeout = 30 seconds
}
}
distributor-dispatcher {
executor = "thread-pool-executor"
type = Dispatcher
thread-pool-executor {
core-pool-size-min = 20
core-pool-size-max = 20
max-pool-size-min = 20
}
throughput = 100
mailbox-type = akka.actor.mailbox.FileBasedMailboxType
}
これを導入するとすぐに、多くのメッセージがドロップされていることに気付きました。Typesafe Console でプロファイリングすると、大量のデッド レター (1M あたり 100k 程度) が表示されます。私のメールボックス ファイルはアクターあたり 12 MB しかないので、制限に近づいているわけではありません。また、デッド レターをカウントするデッド レター リスナーを設定して、プロファイラーの外部で実行できるようにしました (おそらく、インストルメンテーションの問題でしょうか?)。同じ結果です。
デッドレターの原因は何ですか?
Scala 2.9.2 で Akka 2.0.4 を使用しています。
アップデート:
私は、死んだ手紙が が所有する数人の子役に宛てられているように見えることに気付きましたDistributionActor
。親のメールボックスを変更するとこれに影響する理由はわかりませんが、これは間違いなく動作です。