卡桑德拉(Cassandra)与多个客户进行限制

时间:2019-06-06 09:28:12

标签: python cassandra datastax-python-driver

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

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

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

使用DataStax Python驱动程序并将两个客户端分开(即,他们不必了解彼此或与之交互),我如何限制第二个客户端的写入,从而在受到约束的情况下最大化写入吞吐量不影响第一个客户端的写吞吐量?

1 个答案:

答案 0 :(得分:0)

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

为了满足低优先级批量数据不干扰高优先级实时数据的要求,我让低优先级数据的生产者检查队列长度,然后仅在以下情况下将记录添加到队列中:队列长度低于合适的阈值(在我的情况下为5条消息)。

结果是,在队列中,没有实时数据消息在其前面最多可以包含5个批量数据消息。如果消息开始在队列上备份,则批量数据生产者将停止排队更多数据,直到队列长度降至阈值以下。

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

此方法有三个缺点:

  1. 没有多少可见的队列邮件为低优先级,多少为高优先级。但是我们知道,低优先级消息不能超过5条。
  2. 低优先级消息的产生者必须轮询队列以获取当前长度,这会在队列服务器上产生少量额外负载。
  3. 严格地应用阈值是因为两个生产者之间存在从检查队列长度到对消息进行排队的竞赛。这不是很严重,因为低优先级生产者在失去竞争时仅将一条消息排队,而下次它将知道队列太长并等待。