MassTransit:排队消费相关数据的不同消息

MassTransit: Queing consumption of different messages for related data

设置

我正在将 ASPNET Core 与 EFCore 结合使用。

我设置了 MassTransit 以帮助在服务之间复制 UsersTokens

每个 User 有多个 Tokens 并且它们通过 Token.UserId 外键连接。

问题

创建新的 User 时,会发生两件事:

实际上,Token(因为它更小)在 User 之前处理,并且会弹出一个错误提示 User of given Id defined in Token.UserId doesn't exist in table Users - 这是正确的,因为 User 已创建与 Token.

异步

我找到了一些解决方案,例如删除外键约束或在 Consume 方法中实施延迟 - 这两个似乎都是懒惰的解决方案,最终会回到我身边。

有没有办法将两个事件放在同一个队列中并按顺序执行它们,或者我应该只在 UserCreated 中包含初始令牌?

当涉及到消息契约设计时,尤其是在生成事件时...

事件应该是独立的

每个事件都应该是特定事件的完整表示。这意味着事件不应引用其他数据源,不应包含外键,并且不应要求回调到支持服务才能响应事件。

在您的方案中,您可能希望在 TokenCreated 事件中包含足够的用户信息,以便可以根据该事件中的数据添加新用户,或者创建第三个事件,同时包含这两个事件数据集——可能是 UserTokenCreated。当同时创建新用户和新令牌时,将产生第三个事件。

另一种选择是使用传奇来组合这两个事件,但这似乎比您需要的更复杂。

您还可以使用代理的延迟消息功能通过一些延迟重新安排将来的消息传递,而不是像您现在所做的那样简单地使用 Task.Delay() 来阻止消费者槽。