gpt4 book ai didi

multithreading - 消息队列消息之间的依赖

转载 作者:行者123 更新时间:2023-12-04 06:49:43 26 4
gpt4 key购买 nike

这是我的场景:

  • 我有两台服务器,每台服务器上都有一个多线程消息队列消费者(总共两个消费者)。
  • 我有很多消息类型(CreateParent、CreateChild 等)
  • 我被糟糕的遗留代码困住了(创建一个 child 会部分地创建一个 parent 。我知道这很糟糕......但我无法改变这一点。)
  • 无法假设消息排序(消息排队原理!)
  • RabbitMQ 是我的消息队列代理。

  • 我的问题:
  • 当两个线程同时运行时(一个执行 CreateParent,另一个执行 CreateChild),它们会产生冲突,因为这两个线程试图在数据库中创建 Parent(记住旧代码!)

  • 我最初的解决方案:
  • 在消费者内部,我创建了一个“实体锁定”概念。因此,例如,当线程处理 CreateChild 消息时,它会锁定 Child 和 Parent(遗留代码!!),因此 CreateParent 消息处理可以等待。我使用基本的 .net Monitor 和 Id 列表来实现这个概念。它运作良好。

  • 我最初的解决方案限制:
  • 我的“实体锁定”概念适用于单个服务器上单个进程中的单个使用者。但它不适用于运行多个消费者的多台服务器。
  • 我正在考虑使用共享数据库来“存储”我的实体锁定概念,因此每个进程(和线程)都可以访问数据库以验证哪些实体被锁定。

  • 我的问题(终于!):

    所有这些都变得非常复杂,并且增加了错误风险和代码维护问题。我真的不喜欢!
    有没有人已经遇到过这种问题?他们是可以接受的解决方法吗?
    有没有人对我的场景有一个干净的解决方案?

    谢谢!

    最佳答案

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

    我没有使用我的“实体锁定”概念的所有复杂性,而是最终拒绝在执行请求之前预先验证所有必需的数据和实体状态。

    更准确地说,我没有让 CreateChild 进程在遇到 CreateParent 创建的现有数据时自行崩溃,而是在执行 CreateChild 消息之前完全验证数据库中的一切正常。

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

    关于multithreading - 消息队列消息之间的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15524481/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com