Multithreading 消息队列消息之间的依赖关系
以下是我的设想:Multithreading 消息队列消息之间的依赖关系,multithreading,rabbitmq,message-queue,Multithreading,Rabbitmq,Message Queue,以下是我的设想: 我有两台服务器,每个服务器上都有一个多线程消息队列使用者(总共两个使用者) 我有许多消息类型(CreateParent、CreateChild等) 我被错误的遗留代码所困扰(创建子代码将部分创建父代码。我知道这是错误的…但我无法改变这一点。) 无法假定消息顺序(消息队列原则!) RabbitMQ是我的消息队列代理 我的问题是: 当两个线程同时运行时(一个执行CreateParent,另一个执行CreateChild),它们会产生冲突,因为这两个线程试图在数据库中创建父线程
- 我有两台服务器,每个服务器上都有一个多线程消息队列使用者(总共两个使用者)
- 我有许多消息类型(CreateParent、CreateChild等)
- 我被错误的遗留代码所困扰(创建子代码将部分创建父代码。我知道这是错误的…但我无法改变这一点。)
- 无法假定消息顺序(消息队列原则!)
- RabbitMQ是我的消息队列代理
- 当两个线程同时运行时(一个执行CreateParent,另一个执行CreateChild),它们会产生冲突,因为这两个线程试图在数据库中创建父线程(请记住遗留代码!)
- 在消费者内部,我创建了一个“实体锁定”概念。例如,当线程处理CreateChild消息时,它会锁定子消息和父消息(遗留代码!!),以便CreateChild消息处理可以等待。我使用基本的.net监视器和ID列表来实现这个概念。它工作得很好
- 我的“实体锁定”概念在单个服务器上的单个进程中的单个使用者上运行良好。但它不能跨运行多个使用者的多个服务器工作李>
- 我正在考虑使用一个共享数据库来“存储”我的实体锁定概念,这样每个进程(和线程)都可以访问数据库来验证哪些实体被锁定
谢谢 最后,简单的解决方案总是更好的 我没有使用“实体锁定”概念的所有复杂性,而是最终拒绝在执行请求之前预先验证所有必需的数据和实体状态 更准确地说,当CreateChild进程遇到CreateParent创建的现有数据时,我没有让它自己崩溃,而是在执行CreateChild消息之前,完全验证数据库中的一切是否正常 此解决方案的缺点是,CreateChild的实现必须知道CreateParent将生成哪些特定数据,并在开始执行之前验证其存在性。但说真的,这比在跨系统中锁定所有内容要好得多