2017-05-07 4 views
0

最近の調査と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。私は灯台を使用していません。

答えて

0

クイックルックから、クライアントノードでクラスタシャーディングプロキシを開始し、シャードされたノードがシードロールを使用していることを伝えています。役割を指定していない場合、これはシードノード上のクラスタシャーディング定義と一致しません。

シードノード上のクラスタシャーディングは、クラスタシャーディング(非プロキシ)を持たないクライアントノードを含め、シャードアクターを完全にホストできるように、それについてインスタンス化します。

これが唯一の問題ではないかもしれないが、あなたはあなたのすべてのノード上のホストクラスタシャーディングのいずれかの可能性、またはクラスタ内でのみ(シード役割を持つ)ノードの特定のサブセットにあなたのシャードを制限するClusterShardingSettings.Create(system).WithRole("seed")を使用しています。

0

おかげでHorusiath、それはそれを修正しています:

return sharding.Start(
    typeName: "company-router", 
    entityProps: Props.Create(() => new CompanyDeliveryActor()),      
    settings: ClusterShardingSettings.Create(system).WithRole("Seed"), 
       messageExtractor: new RouteExtractor(100)     
      ); 

クラスタ化された破片は今2つのプロセス間で通信しています。そのおかげで本当にありがとう。

関連する問題