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