繁体   English   中英

Cassandra与多个客户端进行限制

[英]Cassandra write throttling with multiple clients

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

第一种是写入实时数据,该数据以群集可以处理的速率进行摄取,尽管备用容量很小。 这被视为高优先级数据,我们不想放弃任何数据。 摄入率因分钟而异。 有时,数据会在客户端读取的队列中备份,有时客户端会清除队列并(短暂地)等待更多数据。

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

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

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

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

结果是,没有实时数据消息在队列中可以有超过5个批量数据消息。 如果消息开始在队列上备份,则批量数据生成器停止排队更多数据,直到队列长度低于阈值。

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

这种方法有三个缺点:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM