最近の調査とStack over flow questionの後、クラスタシャーディングはクラスタ整合型ハッシュルータよりも優れた選択肢です。しかし、私は、2つのプロセスクラスタを稼働させることに問題があります。クラスタシャーディングクライアントがホストと接続していない
1つのプロセスはシードで、もう1つはクライアントです。 Seedノードは、デッド・レター・メッセージを連続的に投射しているようです(この質問の最後を参照)。
この種HOCONは次のとおりです。
akka {
loglevel = "INFO"
actor {
provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
serializers {
wire = "Akka.Serialization.WireSerializer, Akka.Serialization.Wire"
}
serialization-bindings {
"System.Object" = wire
}
}
remote {
dot-netty.tcp {
hostname = "127.0.0.1"
port = 5000
}
}
persistence {
journal {
plugin = "akka.persistence.journal.sql-server"
sql-server {
class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer"
schema-name = dbo
auto-initialize = on
connection-string = "Data Source=localhost;Integrated Security=True;MultipleActiveResultSets=True;Initial Catalog=ClusterExperiment01"
plugin-dispatcher = "akka.actor.default- dispatcher"
connection-timeout = 30s
table-name = EventJournal
timestamp-provider = "Akka.Persistence.Sql.Common.Journal.DefaultTimestampProvider, Akka.Persistence.Sql.Common"
metadata-table-name = Metadata
}
}
sharding {
connection-string = "Data Source=localhost;Integrated Security=True;MultipleActiveResultSets=True;Initial Catalog=ClusterExperiment01"
auto-initialize = on
plugin-dispatcher = "akka.actor.default-dispatcher"
class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer"
connection-timeout = 30s
schema-name = dbo
table-name = ShardingJournal
timestamp-provider = "Akka.Persistence.Sql.Common.Journal.DefaultTimestampProvider, Akka.Persistence.Sql.Common"
metadata-table-name = ShardingMetadata
}
}
snapshot-store {
sharding {
class = "Akka.Persistence.SqlServer.Snapshot.SqlServerSnapshotStore, Akka.Persistence.SqlServer"
plugin-dispatcher = "akka.actor.default-dispatcher"
connection-string = "Data Source=localhost;Integrated Security=True;MultipleActiveResultSets=True;Initial Catalog=ClusterExperiment01"
connection-timeout = 30s
schema-name = dbo
table-name = ShardingSnapshotStore
auto-initialize = on
}
}
cluster {
seed-nodes = ["akka.tcp://[email protected]:5000"]
roles = ["Seed"]
sharding {
journal-plugin-id = "akka.persistence.sharding"
snapshot-plugin-id = "akka.snapshot-store.sharding"
}
}}
を、私は基本的にそうようなコンフィグレーションに上記なりの方法があります:「WithFallback」私はnull参照の例外を取得せずに
var config = NodeConfig.Create(/* HOCON above */).WithFallback(ClusterSingletonManager.DefaultConfig());
を設定の生成の。
そしてそうのようなシステムを生成する:
var system = ActorSystem.Create("my-cluster-system", config);
クライアントは同様に、そのシステムを作成しHOCONはさておき、ほぼ同じであるから:
{
remote {
dot-netty.tcp {
hostname = "127.0.0.1"
port = 5001
}
}
cluster {
seed-nodes = ["akka.tcp://[email protected]:5000"]
roles = ["Client"]
role.["Seed"].min-nr-of-members = 1
sharding {
journal-plugin-id = "akka.persistence.sharding"
snapshot-plugin-id = "akka.snapshot-store.sharding"
}
}}
シードノードは、シャーディングを作成しますそうですね:
クライアントは次のようにシャーディングプロキシを作成します。
ClusterSharding.Get(system).StartProxy(
typeName: "company-router",
role: "Seed",
messageExtractor: new RouteExtractor(100));
RouteExtractorである:このシナリオで
public class RouteExtractor : HashCodeMessageExtractor
{
public RouteExtractor(int maxNumberOfShards) : base(maxNumberOfShards)
{
}
public override string EntityId(object message) => (message as IHasRouting)?.Company?.VolumeId.ToString();
public override object EntityMessage(object message) => message;
}
ボリュームIDは、(単に実験のために)常に同じです。
両方のプロセスは生命に来るが、種子がログにこのエラーを投げ続ける:
[INFO] [2017年7月5日午前9時00分58秒AM] [スレッド0003] [アッカ://私の/ cluster/system/user/sharding /company-routerCoordinator/singleton/coordinator]メッセージ登録者:akka.tcp ://[email protected]:5000/user/sharding/company-routerからakka: // my-cl uster-system/user/sharding/company-routerCoordinator/singleton/coordinatorには が配信されました。 4つのデッドレターが発生しました。
ps。私は灯台を使用していません。