0

我们目前使用 ConsistentHashingPool 为特定类型的参与者提供粘性路由和节流:

        var hashRouter = new ConsistentHashingPool(_hashPoolSize).WithHashMapping(o =>
        {
            var command = o as IMyCommand;
            if (command == null)
            {
                return null;
            }

            return command.Id;
        });

我们正在添加集群,并希望将此参与者的工作分布在多个节点上。我正在使用 ClusterRouterPool 并提供我现有的路由器作为本地 Pool 构造函数参数:

    var clusterRouterPool = new ClusterRouterPool(hashRouter, 
         new ClusterRouterPoolSettings(1000, _hashPoolSize, true));

我不完全清楚 ClusterRouterPoolSettings 的构造函数参数是什么意思。文档说:

nr-of-instances:这是此路由器将首先部署的总路由的最大数量,然后路由到。

max-nr-of-instances-per-node:池路由器将部署到给定集群节点上的最大路由数。

请注意,nr-of-instances 定义了路由的总数,但不会超过每个节点的路由数,即如果您定义 nr-of-instances = 50 和 max-nr-of-instances-per-node = 2,路由器将为集群中的每个新节点部署 2 个路由,最多 25 个节点。

因此,如果我将实例数设置为 1000(如上所示),我会假设部署和路由到的数量不会超过集群中的实际节点数,对吗?

此外,每个节点的最大实例数似乎与 ConsistentHashingPool 的第一个构造函数参数冲突(或重叠)。在上面的代码中,我将两个值设置为相同。它会取两个值中的较小者吗?

编辑 我的印象是上面的代码有效,只是想了解它是否按照我的意图进行路由。

事实证明,上面的代码根本不起作用(部署了错误的分支)。

4

1 回答 1

2

nr-of-instances为您的 routee actor 数量定义一个全局限制,在整个集群范围内,跨所有节点调节它们的数量。max-nr-of-instances-per-node在单个节点的范围内定义本地限制。

因此,如果我将实例数设置为 1000(如上所示),我会假设部署和路由到的数量不会超过集群中的实际节点数,对吗?

这意味着您的路由总数永远不会超过 1000 个,分布在所有集群节点上。此时,节点的数量在这里并不重要,路由器将检测您的集群有多少节点,并尝试将路由均匀地分布在所有节点上。

此外,每个节点的最大实例数似乎与 ConsistentHashingPool 的第一个构造函数参数冲突(或重叠)。

这是一种双重限制。如果由于该限制,您将无法将整个路由器池安装在单个节点上,那么您需要为集群提供足够的节点以在其上传播散列环。

于 2017-08-14T07:58:56.817 回答