负载均衡
从广义上讲,负载均衡是 Orleans 运行时的支柱之一。 Orleans 运行时会尝试使一切均衡,因为通过均衡可以最大程度地提高资源使用率并避免热点,从而导致性能提升,并有助于保持弹性。 Orleans 中的负载均衡应用于多个位置。 下面是运行时执行均衡的位置的非详尽列表:
- 默认角色放置策略是随机的,新的激活将跨 silo 随机放置。 这会导致均衡的放置,并在大多数情况下防止出现热点。
- 更高级的 ActivationCountBasedPlacement 会尝试使所有 silo 上的激活数都相等,这会导致更均匀地跨 silo 分配激活。 这对于弹性尤其重要。
- grain 目录服务基于分布式哈希表构建,该表在本质上是均衡的。 目录服务将 grain 映射到激活,每个 silo 都拥有全局映射表的一部分,并且此表在所有 silo 之间以均衡的方式进行了全局分区。 为此,我们将一致的哈希与虚拟 bucket 配合使用。
- 客户端连接到所有网关并以均衡的方式将其请求分布于这些网关上。
- 提醒服务是一种分布式分区运行时服务。 有关哪个 silo 负责服务哪个提醒的分配是通过一致的哈希在所有 silo 之间均衡分布的,就像在 grain 目录中一样。
- silo 中的性能关键组件已分区,它们之间的工作已在本地均衡分布。 这样,silo 运行时就可以充分利用所有可用的 CPU 内核,而不会产生 silo 内瓶颈。 这适用于所有本地资源:分配工作(给线程)、套接字、调度责任、队列等。
- QueueBalancerBase 会将从持久性队列拉取事件的责任均衡分布在群集中的各个 silo 上。
均衡不一定意味着失去本地性。 可以既均衡又仍然保持良好的本地性。 例如,均衡意味着分片/分区时,可以对特定逻辑任务的责任进行分区,同时仍在每个分区中保持本地性。 这适用于本地均衡和分布式均衡。