Hazelcast DurableExecutorService возможное состояние гонки при выполнении двух задач для одного и того же ключа - PullRequest
0 голосов
/ 22 апреля 2020

Я использую DurableExecutorService для запуска задач с различными объектами в сетке данных. Я использую TransactionalMap для данных, а затем использую синхронизации JTA для отправки задач в DurableExecutorService для других ключей / разделов в конце транзакции.

Моя проблема заключается в том, что я не гарантирую, что отправка двух задач для тот же ключ будет выполнен в порядке. Блокировка происходит во время Runnable.run (), когда я вызываю TransactionalMap.getForUpdate (). Если размер пула моей службы долговременного исполнителя> 1, вторая отправленная задача может обогнать первую и выиграть гонку за блокировку. Поэтому я могу отправить задачу A, затем отправить задачу B, они запускаются параллельно, но B сначала вызывает getForUpdate ().

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

Я думал об использовании одной очереди на объект и присвоении каждой очереди каждой записи на карте. ключ («processing-queue @»), но теперь мне нужно иметь очередь и локальный прослушиватель очереди для каждой записи карты, для которой могут быть заданы задачи обработки.

Я также подумал об использовании отдельного IMap для задач (сопоставление ключа со списком задач) и запуск EntryProcessor для добавления задачи в список задач записи. Тогда у меня был бы локальный слушатель в этом отдельном IMap, отвечающий за извлечение задач и их обработку. Многие из этих задач включают запись в базу данных или отправку дополнительных задач обработки для других записей на других картах, поэтому использование самого EntryProcessor кажется невозможным.

Поэтому я в основном ищу очереди задач, которые будут выполняться задачи по одному и тому же ключу по порядку, позволяя мне выполнять задачи по отдельным ключам не по порядку, без (понятных) ограничений EntryProcessor (данные одного раздела) и, надеюсь, с возможностью транзакций.

...