消息队列消息之间的依赖关系

5
这是我的场景:
  • 我有两台服务器,每个服务器上都有一个多线程消息队列消费者(总共两个消费者)。
  • 我有很多种消息类型(CreateParent,CreateChild等)
  • 我被困在糟糕的遗留代码中(创建子项将部分创建父项。我知道这很糟糕...但我不能改变它。)
  • 不能假设消息顺序(消息队列原则!)
  • RabbitMQ是我的消息队列代理。
我的问题:
  • 当两个线程同时运行时(一个执行CreateParent,另一个执行CreateChild),它们会生成冲突,因为两个线程都尝试在数据库中创建父项(请记住遗留代码!)
我的初始解决方案:
  • 在消费者内部,我创建了一个“实体锁定”概念。因此,当线程处理CreateChild消息时,它会锁定Child和Parent(遗留代码!!),以便CreateParent消息处理可以等待。我使用基本的.NET Monitor和Id列表来实现此概念。它工作得很好。
我的初始解决方案局限性:
  • 我的“实体锁定”概念在单个进程中的单个消费者上运行良好。但它在运行多个消费者的多个服务器上将无法工作。
  • 我考虑使用共享数据库来“存储”我的实体锁定概念,以便每个进程(和线程)都可以访问数据库以验证哪些实体已被锁定。
我的问题(终于!):
这一切变得非常复杂,增加了错误风险和代码维护问题。我真的不喜欢它! 有人遇到过这种问题吗?是否有可接受的解决方案? 是否有清晰的解决方案适用于我的情景?
谢谢!
1个回答

1

最后,简单的解决方案总是更好的!

与其使用我“实体锁定”概念的所有复杂性,我最终转向预先验证执行请求之前所需的所有数据和实体状态。

更准确地说,我在执行CreateChild消息之前完全验证数据库中的一切是否正常,而不是让CreateChild处理程序在遇到CreateParent创建的已存在数据时自行崩溃。

这种解决方案的缺点是,CreateChild的实现必须知道CreateParent将产生哪些特定数据,并在开始执行之前验证其存在。但是,说真的,这比在跨系统中锁定所有东西要好得多!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接