title: 负载均衡

负载均衡,从广义上讲,是Orleans运行时的支柱之一。Orleans运行时试图让一切都变得均衡,因为均衡可以最大限度地利用资源,避免热点,从而带来更好的性能,同时也有助于弹性的发挥。Orleans的负载均衡适用于多个地方。下面是一个粗略的列表,列出了运行时如何执行负载均衡:

  1. 默认的Actor安置策略是随机安置—新的激活被随机地放置在各个Silo。这使得安置更为均衡,还能防止大多数情况下的热点。
  2. 一个更高级的ActivationCountPlacement试图使所有Silo上的激活数量相等,从而使激活在Silo之间的分布更加均匀。这对弹性特别重要。
  3. Grain目录服务是建立在分布式散列表之上的,它本质上是平衡的。目录服务将Grain映射到激活,每个Silo都拥有全局映射表的一部分,这个表在所有Silo中以平衡的方式进行全局分区。我们为此使用了具有虚拟Bucket的一致哈希。
  4. 客户端连接到所有的网关,并以平衡的方式将他们的请求分散到各个网关。
  5. 提醒器服务是一个分布式的分区运行服务。哪个Silo负责提供哪个提醒器的分配是通过一致散列在所有Silo中平衡的,就像在Grain目录中一样。
  6. Silo内的性能关键组件被分区,它们之间的工作被局部平衡。这样,Silo的运行时可以充分利用所有可用的CPU核心,而不会产生Silo内的瓶颈。这适用于所有本地资源:将工作分配给线程、套接字、调度责任、队列等。
  7. StreamQueueBalance平衡了集群中各Silo从持久化队列中提取事件的责任。

还要注意的是,均衡,从广义上讲,并不一定意味着失去了局部性。在平衡的同时仍然可以保持良好的局部性。例如,当均衡意味着分片/分区时,你可以对某个逻辑任务的责任进行分区,同时在每个分区内仍然保持局部性。这既适用于本地均衡,也适用于分布式均衡。

Refer to this presentation on [Balancing Techniques in Orleans] for more details. 更多细节请参考这个关于Orleans的均衡技术的介绍。