分布式系统中的内存限速器 - ajin


在多台服务器分布在世界各地不同地区的情况下,为每台服务器实施速率限制器将导致两个主要问题:

  • 不一致
  • 竞争条件

在本文中,我们将探讨这两个主要问题,以及我们如何实施更好的策略来解决分布式系统的这些问题。

不一致
根据定义,当一组指令、规则或过程在呈现几个迭代的最终结果时彼此不一致时,就会发生计算系统中的不一致。对于计算机科学的不同领域,可以以不同的方式定义不一致。

速率限制器的不一致是当服务器端在很短的时间内收到大量来自客户端的不间断请求时出现的问题。如果服务器端要接收来自多个客户端的多个请求,服务器端的速率限制器仍然会超过其限制。

竞争条件
根据定义,当系统试图在一个时钟周期内处理两个或多个操作时,计算系统中的竞争条件就会发生,这实际上必须按顺序完成。
速率限制器中的竞争条件是当来自客户端的多个请求尝试访问服务器端的速率限制器并增加其计数时出现的问题。通常,速率限制器上的计数器的递增发生在两步过程中,实际上必须按顺序完成。
首先,请求读取当前计数器值。其次,它增加计数器值,然后将其写入速率限制器的计数器。
在单个请求的读取和写入操作之间,多个同时写入操作会导致其他传入请求的读取操作不正确。

分布式内存限速器
到目前为止,我们看到的速率限制器都存在于服务器端。我们能想出一种方法将它分布在不同的客户端上,这样整体的全局速率仍然由服务器控制吗?
我们可以!
这是我们引入分布式内存速率限制器的地方。这里的想法是在服务器端获取速率限制器的总速率限制,并将限制平均分配到所有客户端节点。这样,所有客户端节点都将在自己的部分限制下对传出请求进行控制。每个客户的部分限制的总和将等于总限制。

内存中分布式速率限制器的系统图如下所示:

然而,在现实生活中,分布式系统永远不会永久设计为具有固定数量的节点,也不是冗余容错的。如果其中一个客户端节点发生故障,或者如果要通过添加其他节点来扩展系统,则必须在发生故障或扩展事件后重新分配部分限制。
为了解决这个问题,我们将在系统中引入另一个实体,称为配置服务器。配置服务器位于客户端节点的对面,充当管理客户端节点之间的速率限制分布的实体。它为每个服务器端系统提供了一个总速率限制和一个全局速率限制,操作员可以在不重新启动系统的情况下对其进行管理。

结论
在本文中,我们探讨了如何在分布式系统中实现速率限制,从单服务器服务器系统扩展。我们看到速率限制算法不足以控制不同客户端节点之间的速率限制,并且会导致诸如不一致和竞争条件等问题。为了缓解这些问题,我们看到了一种通过将总速率限制部分分布在不同节点上来实现不同客户端的总速率限制的方法。
最后,为了避免在发生故障或扩展操作时在不同节点之间分配限制的差异,我们引入了一个配置服务器来处理系统中的总速率限制和客户端节点的数量。