Использование JMS в качестве распределенного менеджера блокировок? - PullRequest
1 голос
/ 17 февраля 2010

У меня есть система, в которой некоторые слабосвязанные компоненты обмениваются сообщениями через JMS. Сейчас я смотрю на новое требование, которое приводит к тому, что некоторому общему ресурсу требуется защита от доступа двух или более компонентов одновременно (более или менее пример проблемы чтения / записи). Я ищу способ координировать доступ к общему ресурсу, не добавляя слишком много дополнительной сложности к системе. (Например, я бы не хотел добавлять выделенный диспетчер распределенных блокировок в микс, если мне не нужно).

У меня в голове есть частичное решение, которое будет использовать инфраструктуру JMS в качестве основы. По сути, отправка сообщений блокировки в очереди. Если в очереди записи есть сообщение, никто не может публиковать в этой очереди, пока компонент, отправивший сообщение, не удалит его снова. Точно так же, когда читатель начинает читать ресурс, он отправляет сообщение в очередь читателей и удаляет его по завершении. Автор не начнет писать, пока не увидит, что очередь читателей и авторов пуста. Читатель не запустится, пока не увидит пустую очередь писателей.

Конечно, мне нужно будет найти способ синхронизировать доступ к обеим очередям, чтобы писатель не отправлял сообщения в очередь писателя, пока читатель отправляет сообщение в очередь читателя, который уже видел пустую очередь писателя ...

Можно ли с этим справиться с разумным количеством работы? Возможно, существуют существующие реализации менеджера блокировок поверх JMS? Какие документы по этой теме вы бы порекомендовали?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

Это звучит очень проблематично. Слишком много крайних случаев. Слишком много подводных камней (например, что произойдет, если компонент выйдет из строя и не сможет снять блокировку?) Не слишком связывайтесь с блокировками, и уж точно не с распределенными блокировками. Используйте возможности сервера JMS для достижения того, что вам нужно, с помощью транзакций и забудьте об этом.

1 голос
/ 04 мая 2010

Нет.Вы можете вместо этого проверить распределенные блокировки Hazelcast .

Hazelcast - это сервис с открытым исходным кодом (лицензия Apache), транзакционная, распределенная реализация карт, мультикарты, очереди, раздела, службы блокировки и выполнения для Java.

...