Your AI powered learning assistant

Филипп Вагнер "Распределенные транзакции в условиях микросервисной архитектуры"/M2_TECH Scala Meetup

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

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

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

Разрешение конфликтов при одновременных бронированиях Одновременные сценарии бронирования могут привести к аномалиям результатов, когда несколько служб пытаются выполнить конфликтующие операции. Система различает ложноотрицательные и ложноположительные результаты, настраивая правила в пользу одного приемлемого сценария. Такая схема гарантирует, что подтверждаются только предполагаемые бронирования, при этом автоматически блокируются конфликтующие запросы.

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

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

Обеспечение надежной Доставки Благодаря Идемпотентности Система включает в себя механизмы бесконечного повторения в сочетании с логикой дедупликации, что позволяет обрабатывать доставку сообщений без строгой изоляции. Каждое событие обрабатывается с учетом идемпотентности, что предотвращает повторение, даже если одно и то же сообщение получено несколько раз. Хотя мгновенная доставка не гарантируется, в конечном итоге обеспечивается согласованность во всех распределенных службах.

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