Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 消息队列消息之间的依赖关系_Multithreading_Rabbitmq_Message Queue - Fatal编程技术网

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

Multithreading 消息队列消息之间的依赖关系,multithreading,rabbitmq,message-queue,Multithreading,Rabbitmq,Message Queue,以下是我的设想: 我有两台服务器,每个服务器上都有一个多线程消息队列使用者(总共两个使用者) 我有许多消息类型(CreateParent、CreateChild等) 我被错误的遗留代码所困扰(创建子代码将部分创建父代码。我知道这是错误的…但我无法改变这一点。) 无法假定消息顺序(消息队列原则!) RabbitMQ是我的消息队列代理 我的问题是: 当两个线程同时运行时(一个执行CreateParent,另一个执行CreateChild),它们会产生冲突,因为这两个线程试图在数据库中创建父线程

以下是我的设想:

  • 我有两台服务器,每个服务器上都有一个多线程消息队列使用者(总共两个使用者)
  • 我有许多消息类型(CreateParent、CreateChild等)
  • 我被错误的遗留代码所困扰(创建子代码将部分创建父代码。我知道这是错误的…但我无法改变这一点。)
  • 无法假定消息顺序(消息队列原则!)
  • RabbitMQ是我的消息队列代理
我的问题是:

  • 当两个线程同时运行时(一个执行CreateParent,另一个执行CreateChild),它们会产生冲突,因为这两个线程试图在数据库中创建父线程(请记住遗留代码!)
我最初的解决办法是:

  • 在消费者内部,我创建了一个“实体锁定”概念。例如,当线程处理CreateChild消息时,它会锁定子消息和父消息(遗留代码!!),以便CreateChild消息处理可以等待。我使用基本的.net监视器和ID列表来实现这个概念。它工作得很好
我的初始解决方案限制:

  • 我的“实体锁定”概念在单个服务器上的单个进程中的单个使用者上运行良好。但它不能跨运行多个使用者的多个服务器工作
  • 我正在考虑使用一个共享数据库来“存储”我的实体锁定概念,这样每个进程(和线程)都可以访问数据库来验证哪些实体被锁定
我的问题(最后!):

所有这些都变得非常复杂,增加了bug风险和代码维护问题。我真的不喜欢它! 有没有人已经面临过这样的问题?它们是否可接受的解决方法? 有没有人能为我的场景提供一个干净的解决方案


谢谢

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

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

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

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