使用分布式缓存的速率限制负载平衡环境

问题描述

我的问题是关于分布式缓存的基本功能,我的用例是负载平衡环境中的速率限制器实现,来自同一端点的每个请求都应该增加该端点的请求计数器,我正在尝试当每个请求被定向到不同的(负载平衡的)集群节点时,了解分布式缓存在这种情况下如何工作,端点请求计数是否存储在集群的单个节点上?在这种情况下,网络负载效率低下,不是吗?,我可以配置集群以复制数据以进行读取吗?当在计数器上执行增量时,这不会导致一致性问题并在缓存集群上写入惩罚吗?分布式缓存是否使用任何基于仲裁的机制?

谢谢。

解决方法

这是一个关于分布式系统的基本问题。它基本上涵盖在 CAP 定理下:

https://en.wikipedia.org/wiki/CAP_theorem

C = 一致,A = 可用,P = 分区(分布式)

您只能拥有 3 个中的 2 个 - 您必须根据您的用例进行权衡。

我的经验是 Hazelcast (www.hazelcast.org),默认情况下它是使用数据分区方案的 AP 系统。 Hazelcast 还拥有一个 CP 子系统,以提供有保证的可用性一致性。

https://hazelcast.com/blog/riding-the-cp-subsystem/

巧合的是,大约一年前,我对使用 Hazelcast 的速率限制系统提出了一些建议。它正是你所说的。您只需要自己动手构建一个满足您需求的系统。

,

集群法定人数、复制的地图 - 它们都在 Hazelcast 中,但如果我正确理解您的要求,您就不需要它们中的任何一个。我认为您的要求可以有一个非常简单的答案:

  • 使用分布式地图
  • 为每个端点分配一个唯一标识符,并在从该端点生成请求时将此标识符用作“密钥”。
  • 至于值,您有多种选择来保持计数。例如 - 一个简单的 AtomicInteger(Java SDK,而不是 Hazelcast IAtomicInteger)。