使用JMS作为分布式锁管理器?

时间:2010-02-17 16:03:49

标签: concurrency locking jms distributed

我有一个系统,其中一些松散耦合的组件通过JMS交换消息进行通信。我现在正在研究一个新的需求,它导致一些共享资源需要保护,以防止两个或多个组件同时访问(或多或少是读/写问题的实例)。我正在寻找一种方法来协调对共享资源的访问,而不会给系统增加太多额外的复杂性。 (例如,如果我不需要,我不想在混合中添加专用的分布式锁管理器。)

我脑子里有一个部分解决方案,它将使用JMS基础设施作为基础。基本上,将锁定消息发送到队列。如果编写器队列中有消息,则在发送消息的组件再次将其删除之前,没有人可以发布到该队列。类似地,当读者开始阅读资源时,他们会向读者队列发送一条消息,并在完成后将其删除。一个作者在看到读者和作者队列都排空之前就不会开始写作。读者在看到空写入队列之前不会启动。

当然,我需要找到一种方法来同步对两个队列的访问,这样当读者发布到已经看到空写入器队列的读取器队列时,编写器不会发布到编写器队列...

这样的事情可以用合理的工作量来拉动吗?在JMS之上是否可能存在锁管理器的现有实现?你会推荐哪些关于这个主题的论文?

2 个答案:

答案 0 :(得分:2)

这听起来很成问题。边缘情况太多。太多的陷阱。(例如,如果组件崩溃并且无法移除锁定会发生什么?)不要使用锁定过多,当然也不要使用分布式锁定。使用JMS服务器的功能来实现您使用事务所需的功能而忘记它。

答案 1 :(得分:1)

没有。您可能需要查看Hazelcast distributed locks

Hazelcast是Java的地图,多图,队列,主题,锁和执行服务的开源(Apache许可证),事务性,分布式实现。