Cassandra 对多个客户端进行写入节流

Cassandra write throttling with multiple clients

我有两个客户端(单独的 docker 容器)都写入 Cassandra 集群。

首先是写入实时数据,这些数据以集群可以处理的速度摄取,尽管备用容量很少。这被视为高优先级数据,我们不想丢弃任何数据。摄入率每分钟变化很大。有时数据备份在客户端从中读取的队列中,有时客户端已清除队列并(短暂地)等待更多数据。

第二个是来自在线商店的批量数据转储。我们希望以尽可能快的速度将其写入 Cassandra,以吸收实时数据写入后的任何备用容量,但又不会导致集群开始发出超时。

使用 DataStax Python 驱动程序并将两个客户端分开(即它们不必了解彼此或相互交互),我如何限制来自第二个客户端的写入以使其最大化写吞吐量受制于不影响第一个客户端写吞吐量的约束?

我想出的解决方案是让两个数据生产者写入相同的队列。

为了满足low-priority批量数据不干扰high-priority直播数据的要求,我让low-priority数据的生产者检查队列长度,然后仅当队列长度低于合适的阈值(在我的例子中是 5 条消息)时才将记录添加到队列中。

结果是,在队列中,任何实时数据消息的前面都不能有超过 5 条批量数据消息。如果消息开始在队列中备份,那么批量数据生产者将停止排队更多数据,直到队列长度低于阈值。

我还将大量数据拆分为许多小消息,以便消费者能够相对快速地处理它们。

这种方法存在三个缺点:

  1. 无法了解有多少排队的消息是低优先级的,有多少是高优先级的。但是我们知道不能超过 5 个低优先级消息。
  2. low-priority 消息的生产者必须轮询队列以获取当前长度,这会在队列服务器上产生少量额外负载。
  3. 没有严格应用阈值,因为两个生产者之间存在从检查队列长度到排队消息的竞争。这并不严重,因为 low-priority 生产者在输掉比赛时只排队一条消息,下次它会知道队列太长并等待。