Моделировать атомную работу в независимых системах

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

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

  1. Установить объект в системе 1 в предварительном режиме для удаления
  2. Установите объект в системе 2 в предварительном режиме для добавления
  3. Переместить объект из системы 1 в систему 2
  4. Удалить предварительность от системы 2
  5. Удалить предварительность от системы 1

Отсутствие атомарной операции может привести к тому, что объект в обеих системах будет отсутствовать в зависимости от порядка шагов 4 и 5 и сбоя между ними.

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

1 ответ

Вполне возможно (хотя и не идеально). Базы данных делают это постоянно. См. https://en.wikipedia.org/wiki/Distributed_transaction и https://en.wikipedia.org/wiki/Two-phase_commit_protocol для ознакомления.

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

Ваш подход имеет некоторые достоинства. Вам нужно больше общения между двумя системами.

Другие вопросы по тегам