我有两个客户端(单独的docker容器)都在向cassandra集群写入数据。
第一种是写入实时数据,以集群可以处理的速率接收数据,尽管只有很少的空闲容量。这被视为高优先级数据,我们不想丢弃任何数据。每分钟的摄取率变化很大。有时数据会备份到客户机从中读取的队列中,有时客户机已清除队列并(短暂地)等待更多数据。
第二种是在线商店的批量数据转储。我们希望以尽可能快的速度将数据写入cassandra,写入实时数据后会占用所有空闲容量,但不会导致集群开始发出超时。
使用datastax python驱动程序并将两个客户机分开(即,它们不必相互了解或交互),如何限制来自第二个客户机的写操作,从而在不影响第一个客户机的写吞吐量的约束下使写吞吐量最大化?
1条答案
按热度按时间djp7away1#
我提出的解决方案是让两个数据生产者写入同一个队列。
为了满足低优先级批量数据不干扰高优先级实时数据的要求,我让低优先级数据的生产者检查队列长度,然后仅当队列长度低于合适的阈值(在我的例子中是5条消息)时才向队列添加记录。
结果是,在队列中,任何实时数据消息前面的批量数据消息都不能超过5条。如果消息开始在队列上备份,则大容量数据生成器将停止对更多数据进行排队,直到队列长度降至阈值以下。
我还将大量数据拆分为许多小消息,以便消费者能够相对快速地处理它们。
这种方法有三个缺点:
无法看到队列中有多少消息是低优先级的,有多少是高优先级的。但是我们知道低优先级消息不能超过5条。
低优先级消息的生产者必须轮询队列以获得当前长度,这会在队列服务器上产生一个小的额外负载。
没有严格应用阈值,因为从检查队列长度到排队消息,两个生产者之间存在竞争。这并不严重,因为当低优先级生产者在竞争中失败时,它只将一条消息排队,下次它将知道队列太长并等待。