Как сделать так, чтобы переменная модифицировалась только с одной стороны

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

Это показано в следующих примерах: неверный пример правильный пример

Эту проблему можно решить, сохраняя всю историю изменений переменных, но это огромные накладные расходы, которых я хотел бы избежать.

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

Я ищу любой применимый алгоритм с как можно меньшим объемом данных.


person Denis Sheremet    schedule 03.11.2017    source источник


Ответы (2)


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

Эту проблему можно решить, сохраняя всю историю изменений переменных, но это огромные накладные расходы, которых я хотел бы избежать.

С векторными часами вы храните не всю историю, а счетчик для каждого variable и узла (поэтому каждый variable имеет вектор счетчиков).

person Constantin Galbenu    schedule 04.11.2017

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

Это распространенный подход, например, в ситуациях, когда есть огромная параллельная нагрузка и нельзя синхронизировать доступ только к одному месту с блокировкой.

Позже вы даже сможете масштабировать рабочие процессы, обрабатывающие очередь.

person cassandrad    schedule 03.11.2017