如何在Redis流中使用背压?

4
我有点困惑,Redis流似乎没有生成反压的方式?如果生产者向流中推送数据的速度快于消费者处理的速度,没有明显的方式可以向生产者发出信号,让其停止或减缓推送速度。
我本以为会有XADD的阻塞版本,它会阻塞客户端,直到有空间在有限制的流中可用(类似于XREAD的阻塞版本,允许消费者等待数据变得可用),但事实并非如此。
人们如何处理上述情况 - 向生产者发出信号,让其暂停向流中添加更多项目?
我知道有些数据流系统(例如Kafka)不需要反压,但Redis似乎没有可比较的解决方案,而且这似乎是许多Redis流应用场景中的一个相对常见的问题。

同样的问题在这里,这让使用Redis Streams变得非常困难,因为对于流边界和内存消耗几乎没有任何控制。 - let4be
2个回答

1
如果你开启了持久化(无论是RDB还是AOF),你的流消息将会被持久化,因此不需要背压。
如果你使用副本,你就有了另一个级别的冗余性。
只有当Redis没有足够的内存(或足够的网络带宽到副本)来保存消息时,才需要背压。
而且,说实话,我从未见过这种情况。

0

为什么要这样做?除非你的内存用完了,否则这不是一个问题,每个消费者无论快慢都可以随意阅读。

注意,不使用消费者组,只通过XADD发布,读者通过在键中存储的位置通过XRANGE读取,这更接近于Kafka。每个分区使用一个流。

生产者可以每1K条消息(通过XLEN)检查表格大小是否过大,如果有问题就减缓速度,如果不能解决,那么可以增加硬件,5个节点每个20G很容易实现,流可以分布在整个集群上。我不明白这应该很容易,所以我可能漏掉了什么。

还有一种XADD版本,可以修剪表格的大小,以确保您不会超出上述限制,但这需要一些极端的操作。对于我们来说,频繁发送最新状态的内容可以保存2天,其他内容可以保存9个月。

另外,不要将大型消息存储在流中,而应使用blob或单独的键/存储。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接