Entity framework core MassTransit:为相关数据查询不同消息的消耗

Entity framework core MassTransit:为相关数据查询不同消息的消耗,entity-framework-core,masstransit,Entity Framework Core,Masstransit,设置 我正在使用ASPNET核心和EFCore 我已设置MassTransit,以帮助在服务之间复制用户和令牌 每个用户都有多个令牌,它们通过令牌.UserId外键连接 问题 创建新的用户时,会发生两件事: User和freshToken存储在数据库中 UserCreated和TokenCreated被同时发送到消息总线 实际上,Token(因为它比较小)在User之前处理,并弹出一个错误,指出Token.UserId中定义的给定Id的用户在表Users中不存在,这是正确的,因为User是与

设置

我正在使用ASPNET核心和EFCore

我已设置MassTransit,以帮助在服务之间复制
用户
令牌

每个
用户
都有多个
令牌
,它们通过
令牌.UserId
外键连接

问题

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

  • User
    和fresh
    Token
    存储在数据库中
  • UserCreated
    TokenCreated
    被同时发送到消息总线
实际上,
Token
(因为它比较小)在
User
之前处理,并弹出一个错误,指出Token.UserId中定义的给定Id的
用户在表Users
中不存在,这是正确的,因为
User
是与
Token
一起异步创建的

我已经找到了一些解决方案,比如删除外键约束或在
Consume
方法中实现延迟,这两种方法似乎都是懒惰的解决方案,最终我会想到它们


是否有一种方法可以将两个事件放在同一个队列上,并按添加顺序执行它们,或者我应该只在
UserCreated
中包含初始标记?

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

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

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

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


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

Hmm,我正在考虑将令牌信息放入
UserCreated
事件中,但这似乎不可避免地将这些资源绑定在一起——然而,就像CAP定理和一般的微服务一样——为了更大的利益,我可能不得不进行这种权衡。这是一种合理的权衡。老实说,删除FK也是如此(我几乎从来没有使用过FK)。然而,我将重点放在不必在边缘/缓存层进行连接,并将使用平面模型来避免查询复杂性。谢谢你花时间来帮助我。