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

#multithreading #design-patterns #concurrency #multiprocessing #race-condition

Вопрос:

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

Сценарий:

В моей системе существует два типа сущностей (хранятся отдельно в базах данных):

  1. Документы (может быть большое количество документов)
  2. Шаблоны для классификации этих документов. Шаблоны содержат атрибуты, и документы, соответствующие этим атрибутам, становятся членами шаблонов.

В шаблонах и документах отсутствует последовательность действий. Действие на обоих может происходить параллельно в любой момент времени.

В шаблонах выполняются следующие действия

  • Создание нового шаблона приводит к созданию первой версии шаблона
  • Любое обновление шаблона приводит к созданию более новой версии шаблона
  • Создание и обновление шаблона приводит к запросу на сопоставление документов, соответствующих шаблону, и список идентификаторов документов сопоставляется и сохраняется вместе с шаблоном.

Следующие действия могут произойти с документами в любое время:

  • Могут быть добавлены новые документы
  • Существующие свойства документа могут быть изменены
  • Существующие документы могут быть удалены

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

Проблема параллелизма возникает в основном в документе шаблона и в его списке хранилища идентификаторов документов-членов. Поскольку обновление списка документов-членов для шаблона может происходить параллельно между созданием / обновлением шаблона и созданием / обновлением различных документов, это может привести к неправильным данным, если они не обрабатываются правильно.

Прямо сейчас это решается с помощью блокировки, при которой создание / обновление шаблона и создание / обновление документов являются взаимоисключающими.

Существуют ли какие — либо механизмы, с помощью которых параллелизм может обрабатываться без блокировок?