TGViewer
1.C. Enterprise 1.C. Enterprise @ship1centerprise · 1.06K subscribers
Post #87 1.7K
Дневник капитана, дата 06.05.2025
🪓Сага о распределенных транзакциях🪓

В прошлом посте я кратко сказал про атомарность транзакций. Теперь хочу поговорить, как ее можно добиться в распределенных системах. В 1С мы привыкли, что все операции по какому-либо бизнес-событию происходят в одной системе – монолите. Но в современном ИТ очень много работает на микросервисной архитектуре: совокупности разрозненных систем, между которыми идет обмен данными.

Рассмотрим классическую ситуацию, когда человек оформляет заказ на сайте. После нажатия кнопки ✅Заказать на той стороне должно произойти множество действий: складской сервис зарезервировать товар, другой – списать или начислить бонусы, третий – записать заказ в историю заказов и т.д. Что делать, если один из сервисов сообщил об отказе, в то время как другие уже выполнили операцию? Например, бонусы списались, заказ в историю попал, но на складе вдруг товара не оказалось?

Дальше пойдет много поэтических терминов. Для решения этой проблемы обычно используется паттерн Сага (Saga) ⚔️. Идея его в том, что последовательность разрозненных транзакций в каждом микросервисе как рассказы об отдельных подвигах складываются в единую сагу о приключениях нашего бизнес-события. Если в каком-то из сервисов произошел откат транзакции, должны быть вызваны компенсирующие операции (откат, сторнирование) во всех уже пройденных сервисах.
Но как обеспечить эту согласованность? Тут есть два основных подхода:

🎻 Оркестрация (Orchestration). В данном случае выделяется специальный сервис оркестратор-дирижер, который следит за полным выполнением большой транзакции. С него начинается выполнение операции, он знает все шаги ее выполнения, следит за статусами, отправляет команды отмены нужным точкам при необходимости.

💃 Хореография (Choreography). Здесь нет начальника, каждый сам отвечает за свои действия, танцует свою партию. Сервисы общаются сообщениями между собой через какое-то общее пространство (шина, Kafka, RabbitMQ). Один сервис выполнил, написал БонусыСписаны, другой написал – Ахтунг:ТоварНеЗарезвирован, все другие сервисы получат это сообщение и обработают как необходимо.

Вот такие подходы есть в микросервисах, но вернемся к 1С. Можно привести пример распределенной транзакции, когда надо записать документ в базе и одновременно выполнить операцию в другой системе по REST API. Тривиальным решением может служить следующий кусок кода:

НачатьТранзакцию();
Попытка
ДокументОбъект.Записать();
Ошибки = ВыполнитьОперациюПоAPI(ДокументОбъект.Ссылка);
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение Ошибки;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
КонецПопытки;


Главное в этом коде, что выполнение операции по API стоит после записи документа в нашей БД. Ведь отменить событие в другой системе при ошибке нашей записи будет намного сложнее, нежели запись у нас. Конечно, здесь есть проблема, что мы открываем транзакцию и начинаем длительную операцию обращения к внешним ресурсам. Из-за этого транзакция может надолго зависнуть, что приведет к потере производительности.

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

А сталкивались ли вы с такими распределёнными транзакциями? Какие решения использовали?
  • 👍 16
More from @ship1centerprise
  1. May 13, 2025Дневник капитана, дата '20250513' 🔷 Изолента для транзакций 🔷 Перейдем букве 🔤 нашего A…
  2. May 5, 2025Дневник капитана, красивая дата 05*05=25 ➖Кислотные транзакции➖ Захотелось рассказать про…
  3. Jul 28, 2023​​Дневник капитана, дата ‘2023-07-28’. Мой корабль улетел в совсем удаленные части Вселенн…
  4. Dec 21, 2022Всем привет! Уже завтра, 22 декабря встречаемся онлайн: INFOSTART AWARDS 2022 и новогодняя…
  5. Jun 24, 2022Вот так вот уходишь из 1С, а там такое: https://infostart.ru/job/vacancy/1676535/ Update:…
  6. Jun 22, 2022Дневник помощника капитана, желтая Дата(2022, 6, 22). Слышали о таком инструменте на основ…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →