0

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

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

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

使用 DataStax Python 驱动程序并保持两个客户端分开(即它们不应该相互了解或交互),我如何限制来自第二个客户端的写入,以便在不影响的约束下最大化写入吞吐量第一个客户端的写入吞吐量?

4

1 回答 1

0

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

为了满足低优先级批量数据不干扰高优先级直播数据的要求,我让低优先级数据的生产者检查队列长度,只有在队列长度达到时才向队列添加记录低于合适的阈值(在我的情况下为 5 条消息)。

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

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

这种方法有三个缺点:

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