当 k8s 进行 HPA 时,如何避免重新处理 pub/sub 中的重复消息?

How can I avoid reprocess duplicate messages in a pub/sub when the k8s make HPA?

我有以下架构。

我有一个订阅了Redis的微服务pub/sub,有时一天的负载会很高,我需要在K8S中做一个水平的pod autoscaler,以便处理所有pub/sub 消息,同时保持低延迟。

问题是如果我使用 pub/sub 消息将由每个 pod 处理,如果使用队列 pods 将需要轮询到 Redis 以读取所有消息,那么,我如何使用我需要使用或知道的模式或方法来扩展它?

谢谢。

如果您想让微服务的多个实例来处理已发布的不同消息(以便更快地清空队列或保持低延迟),那么 Redis pub/sub 不是正确的选择在这里,因为它有一个 fan-out 设计,这意味着相同的发布消息将被分发给所有订阅者。

这里你需要的是RabbitMQ or Amazon SQS,它允许你有多个消费者连接到同一个队列,每个消费者处理不同的消息。

SQS 中一个非常有用的功能是,当消费者获取消息时,有一个称为 visibility timeout 的可配置时间范围,在此期间其他消费者看不到该消息(因此无法处理它)。如果最初接收消息的消费者未在该时间范围内将其从队列中删除,则该消息将可供其他消费者使用。