负载均衡

从广义上讲,负载均衡是 Orleans 运行时的支柱之一。 Orleans 运行时会尝试使一切均衡,因为通过均衡可以最大程度地提高资源使用率并避免热点,从而导致性能提升,并有助于保持弹性。 Orleans 中的负载均衡应用于多个位置。 下面是运行时执行均衡的位置的非详尽列表:

  1. 默认角色放置策略是随机的,新的激活将跨 silo 随机放置。 这会导致均衡的放置,并在大多数情况下防止出现热点。
  2. 更高级的 ActivationCountBasedPlacement 会尝试使所有 silo 上的激活数都相等,这会导致更均匀地跨 silo 分配激活。 这对于弹性尤其重要。
  3. grain 目录服务基于分布式哈希表构建,该表在本质上是均衡的。 目录服务将 grain 映射到激活,每个 silo 都拥有全局映射表的一部分,并且此表在所有 silo 之间以均衡的方式进行了全局分区。 为此,我们将一致的哈希与虚拟 bucket 配合使用。
  4. 客户端连接到所有网关并以均衡的方式将其请求分布于这些网关上。
  5. 提醒服务是一种分布式分区运行时服务。 有关哪个 silo 负责服务哪个提醒的分配是通过一致的哈希在所有 silo 之间均衡分布的,就像在 grain 目录中一样。
  6. silo 中的性能关键组件已分区,它们之间的工作已在本地均衡分布。 这样,silo 运行时就可以充分利用所有可用的 CPU 内核,而不会产生 silo 内瓶颈。 这适用于所有本地资源:分配工作(给线程)、套接字、调度责任、队列等。
  7. QueueBalancerBase 会将从持久性队列拉取事件的责任均衡分布在群集中的各个 silo 上。

均衡不一定意味着失去本地性。 可以既均衡又仍然保持良好的本地性。 例如,均衡意味着分片/分区时,可以对特定逻辑任务的责任进行分区,同时仍在每个分区中保持本地性。 这适用于本地均衡和分布式均衡。