假设我有一个服务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个不同消费者。
所以如果你想按顺序处理它们并且使用多个消费者,你需要自己处理。