我目前正在实现一个基于消息传递的系统(也可以根据情况使用DDD、CQRS、事件源等)。所使用的一般模式是至少一次与去重消费者/幂等接收器的消息传递。
其中一个关键点是信息不正常。Vaughn Vernon在其著作《实现领域驱动设计》(Implementing Domain Driven Design)(第13章,大约从第475页开始)中提倡的一种方法是使用MemberChangeTracker,它检查消息的日期并相应地采取行动(给出的例子是禁用消息在启用消息之后到达,尽管是第一个生成的。更改跟踪器检查发生的日期,如果发生的日期在最后一个接收到的事件之后,则仅应用第二条消息(禁用消息)。
这太乱了。补偿行为很困难,组合可能会很快爆炸。沃恩的回答很"简单":不要对外部系统中的数据负责,这是有道理的。然而,如果你确实需要这样做,有更好的方法吗?
我的问题是:每个消费者是否可以订阅给定聚合中的每一个事件,跟踪消息顺序(因此每个事件上都有一个消息顺序号:Creation=1;UpdateToAggregate=2;Cancel=3),并只筛选它感兴趣的事件?这样做会让消费者看到它收到的Enable消息有问题,然后等待,直到它收到"丢失"的消息(在这种情况下,Disable,或者它可能只是一个它甚至不感兴趣的消息)?这将允许使用者按顺序应用消息,并显著简化其处理程序逻辑。
这是一种有效的方法吗这里的权衡是什么(例如,延迟消息处理等待有序消息到达)?这似乎是一种合乎逻辑的方法,尽管有点不舒服,因为每个消费者都必须订阅每条消息,这不是一种好方法。这实用吗?
当您使用聚合时,每个消费者都必须从消息流或从快照+快照后的消息流构建聚合。因此,如果消息太多,则不必遍历特定聚合的所有消息。除此之外,我不知道在跳过其他部分的同时,你还能如何理解消息的某些部分。