我是否缺少某些东西,还是没有办法通过Redis流生成背压?如果生产者将数据推送到流中,更快的消费者可以使用它,则没有明显的方法向生产者发出信号,它应该停止或放慢速度。
我希望会有XADD
的阻止版本,它将阻止客户端,直到有上限的流中有可用空间为止(类似于XREAD
的阻止版本,它允许消费者等待直到数据可用),但事实并非如此。
人们如何应对上述情况-向生产者发出信号,要求其推迟向流中添加更多项目?
我了解到某些数据流系统(例如Kafka)不需要背压,但是Redis似乎没有类似的解决方案,对于许多Redis流用例来说,这似乎是一个相对普遍的问题。
答案 0 :(得分:1)
如果你开启了持久化(RDB 或 AOF),你的流消息将被持久化,因此不需要背压。
如果你使用副本,你还有另一个层次的冗余。
仅当 Redis 没有足够的内存(或副本的足够网络带宽)来保存消息时,才需要背压。
而且,老实说,我从未见过这种情况。
答案 1 :(得分:0)
您为什么要?除非您的内存不足,否则这不是问题,每个速度快和慢的消费者都可以在闲暇时阅读。
请注意,不要仅通过XADD进行发布来使用消费群体,而要通过XRANGE通过存储在距离Kafka更近的密钥中的位置来阅读读者。每个分区使用一个流。
如果这是一个问题,生产者可以检查每1K消息的表大小是否过大(通过XLEN)以使其变慢,并且不能将HW扔到5个节点(每个节点20 Gig)上,这很容易,因为流分散集群..不明白这应该很容易,所以我可能会丢失一些东西。
还有一个XADD版本可以调整表格的大小,以确保您不会过多地填充上面的内容,但是这个世界需要一些非常极端的东西。对我们来说,这是发送最新状态的2天内频繁发送的东西的价值,而对其他人则是9个月的价值。
另一件事是不将大量消息存储在流中,请使用Blob或单独的密钥/存储。