Akka.net WebCrawlerから学び、独自のクラスター テストを作成しました。プロセッサ ノード (コンソール アプリ) と API ノード (SignalR) があります。構成は次のとおりです。
プロセッサ ノード:
akka {
actor{
provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
deployment {
/dispatcher/signalR {
router = broadcast-group
routees.paths = ["/user/signalr"]
cluster {
enabled = on
#max-nr-of-instances-per-node = 1
allow-local-routees = false
use-role = api
}
}
}
}
remote {
log-remote-lifecycle-events = DEBUG
helios.tcp {
port = 0
hostname = 127.0.0.1
}
}
cluster {
seed-nodes = ["akka.tcp://stopfinder@127.0.0.1:4545"]
roles = [processor]
}
}
API ノード: (非シード ノードはポート = 0 になります)
akka {
actor{
provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
}
remote {
log-remote-lifecycle-events = DEBUG
helios.tcp {
port = 4545
hostname = 127.0.0.1
}
}
cluster {
seed-nodes = ["akka.tcp://stopfinder@127.0.0.1:4545"]
roles = [api]
}
}
API ノード内に、SignalR という通常のアクターを作成しました。
プロセッサ ノード内で通常のアクターを作成し、Scheduler を使用しTell()
て API ノードの signalR アクターに文字列を渡しました。
これは、1 つのプロセッサと 1 つの API がある場合にうまく機能します。複数のプロセッサ ノードと 1 つの API ノードがある場合にも機能します。残念ながら、複数の API ノードがある場合、どのように構成をセットアップしても、"tell" ですべての API ノードが通知されるわけではありません。メッセージはそのうちの 1 つにのみ送信されます。どのノードがメッセージを受信するかは、API ノードの開始シーケンスに基づきます。すべての API ノードがクラスターに正しく登録されているようですが、間違っている可能性があります。
これは構成または理解の問題だと感じ始めています。誰でも洞察を共有できますか?
追加のテストを行いました。ASP.NET SignalR API ノードを通常のコンソール アプリケーションに置き換えても、動作は変わりません。
更新: Akka.NET チームに連絡しました。この動作は既知のバグです。1.1 リリースで修正される予定です。 更新 2: この問題は、GitHub のプロジェクトで修正済みとしてマークされています。