处理不同Redis Streams消息的顺序



假设我有一个服务p(生产者)和C(消费者),我的p服务需要:

  • 创建对象X
  • 创建对象Y(依赖于X)
  • 创建对象Z(依赖于Y)
  • 通知C关于X, Y和Z(通过Redis流)
  • C需要使用来自Z, Y和X的数据来做一些本地数据持久化
  • 更新到Y和相当普遍,但X是罕见的

从C的角度来看,是否有一种方法可以保证它拥有成功持久化所需的所有信息?

我知道像Kafka和Redis Streams这样的服务通常不是为这些东西而构建的,但是如何克服这一点呢?想法一:

  • 将X、Y、Z按指定顺序发送到同一消费者组。但是,如果我们将工人数量扩展到1以上,我们就会遇到问题

想法二:

  • 不将X和Y分别发送给C,我可以发送一个复合对象Z,其中嵌入了Y和X。但这似乎太过分了,不是吗?

是否有明显的方法来处理对象依赖关系?

我认为IDEA 2是一个更好的解决方案,因为我认为将整个消息保存在一个数据结构中是一个好主意。

也许你可以尝试使用多个键。

例如:

On Service P

def now_timestamp = datetime.currentstamp # let`s say it is 1515151551
redis sadd not_processed_timestamp 1515151551
redis set X_1515151551 INFO_OF_X
redis set Y_1515151551 INFO_OF_Y
redis set Z_1515151551 INFO_OF_Z

在服务C上创建一个新线程

def new_task_timestamp = redis spop not_processed_timestamp # let`s say it is 1515151551
redis blocking-get X_1515151551
redis blocking-get Y_1515151551
redis blocking-get Z_1515151551
# process the rest

这是一个关于Redis Streams的好问题。

我们可以大致地说下面是正确的:

如果你使用1个流->1 .消费者,您正在处理消息中秩序。

如果你使用N个流和N个消费者,那么只有一个给定的消费者命中N个流的一个子集,你可以将上面的模型缩放为1流→1消费者。

如果你使用1个流->N个消费者,负载均衡到N消费者,然而在这种情况下,信息相同的逻辑可能会被乱序消费,因为给定的消费者可能会处理消息3比另一个消费者处理消息4的速度快。

所以基本上Kafka分区更类似于使用N不同Redis关键字,而Redis消费者组是服务器端的负载平衡系统的消息从一个给定的流到N个不同消费者。

所以如果你想按顺序处理它们并且使用多个消费者,你需要自己处理。

相关内容

  • 没有找到相关文章

最新更新