Вы можете использовать system()
, как в:
system("ls song > song.txt");
, где ls
- это имя команды для перечисления содержимого песни в папке, а song
- это папка в текущем каталоге. Результирующий файл song.txt
будет создан в текущем каталоге.
Основная причина отказа от двухфазной фиксации заключается в том, что координатор транзакций является своего рода диктатором, поскольку он сообщает всем остальным узлам, что делать. Обычно координатор транзакции встроен в сервер приложений. Проблема возникает, когда после 1-й фазы или фазы подготовки координатор транзакций или сервер приложений выходит из строя. Теперь участвующие узлы не знают, что делать. Они не могут выполнить обязательство, потому что они не знают, ответили ли другие координатору с «нет», и они не могут выполнить откат, потому что другие могли сказать «да» координатору. Таким образом, до тех пор, пока координатор не вернется через 15 минут (скажем) и не завершит 2-й этап, участвующие хранилища данных будут оставаться в заблокированном состоянии. Это препятствует масштабируемости и производительности . Хуже всего случается, когда журнал транзакций координатора повреждается после 1-й фазы. В этом случае хранилища данных остаются в заблокированном состоянии навсегда. Даже перезапуск процессов не поможет. Единственное решение состоит в том, чтобы вручную проверить данные для обеспечения согласованности, а затем снять блокировки. Эти вещи обычно происходят в ситуации высокого давления, и, следовательно, это определенно огромные накладные расходы на эксплуатацию . Следовательно, традиционная двухфазная фиксация не является хорошим решением.
Однако следует отметить, что некоторые современные системы, такие как Kafka, также реализовали двухэтапную фиксацию. Но это отличается от традиционного решения тем, что здесь каждый брокер может быть координатором, и, таким образом, алгоритм выбора лидера Kafka и модель репликации облегчают проблемы, упомянутые в традиционной модели.
«Мы не можем» здесь на самом деле означает «Это плохая идея, и я не хочу, и, если я допускаю такую возможность, я не смогу убедить вас не настаивать».
Конечно, вы можете внедрить 2-фазную фиксацию через микросервисы, но:
Этими проблемами достаточно сложно управлять среди нескольких тесно связанных служб на совместно расположенных серверах с выделенными сетями. В более разнородных средах с большим количеством серверов и более высокими задержками, которые характеризуют развертывание микросервисов, это становится намного сложнее.
Общая идея микросервисов - это слабосвязанные и независимые сервисы. Поскольку 2pc означает, что у нас есть 2 фазы для фиксации транзакции. управляющий узел будет управлять транзакцией, и все остальные узлы сначала отвечают, что они готовы, и на втором этапе все они фиксируют или откатываются в зависимости от первого этапа.
Что произойдет, если управляющий узел не работает? Что происходит, когда любой из других узлов не работает? из-за этого ограничения вся ваша транзакция не может пройти. В распределенных транзакциях ваши узлы могут находиться в разных дата-центрах или регионах. самый медленный узел для ответа будет держать другие узлы в состоянии ожидания, пока они могут двигаться дальше. так атомарность мешает работе.
Вы не можете масштабировать систему, и в целом сервисы должны быть независимыми и масштабируемыми.
2pc не является неправильным ответом, но в большинстве случаев мы рассматриваем возможную последовательность. если у вас есть система, которая требует строгой согласованности, то 2pc может быть вариантом.
Некоторые вещи, на которые следует обратить внимание, а также дать некоторые предпосылки: