На десятом митапе Software Craftsmanship мы рассмотрим такую сложную тему, как распределенные транзакции. Мы увидим, почему возникает необходимость в распределенных транзакциях и какие бывают протоколы для реализации распределенных транзакций.
Микросервисная архитектура часто влечет за собой распределенные транзакции, и поэтому мы поговорим о том, как можно делать отдельные микросервисы максимально независимыми между собой.
Распределенные транзакции сложны эксплуатации, поэтому мы рассмотрим также и подходы, которые позволяют минимизировать или обойти необходимость в них, в то же время сохраняя необходимые бизнесу свойства приложения.
2. Мы снова новом месте
Зарегистрировались 88 человек
Фаталисты?
Наш первый митап в Digital Unicorn
При поддержке Sam Solutions
3. План митапов
6. Как Software Craftsmanship фиксит проблемы Agile
7. БД: проектирование, масштабирование,
шардирование, реплицирование…
8. Процессы и инструменты для CI/CD
9. Логирование и мониторинг
10. Распределенные транзакции
4. Что интересует вас
ACID в dtx
Dtx – car
Шаблоны для dtx
Dtx – логгирование, сбои,
согласованность
Dtx scaling
Целостность tx
Опыт с dtx
Надо ли мне dtx?
Выбор между хорошими
решениями
Хаос в процессах
Нет видения
Нет свободного времени
5. Что интересует вас
Dtx Saga
Баланс техники и бизнеса
Целостность данных
Поиск проблем в распред
среде
Много джуниоров
Вызов API изнутри tx
Нечеткие требования
Непрозрачные решения
Нет возможности учиться
Legacy
Сроки
6. Что интересует вас
Accidental complexity
Отладка интеграций
Целостность данных
Scaling
Transactions
Лень
Как мотивировать
разработчиков делать well-
crafted решения
Необходимость отвечать на
обязательные вопросы
7. План этого митапа
1. Какие бывают транзакции
2. Проблема dtx
3. Уровни изоляции dtx
4. Подходы и шаблоны
28. Избегаем dtx. Вариант 2
Пишем в бд job и регулярно пробегаем по
нему
Как будто свой tx log и свой tx manager
29. Избегаем dtx. Вариант 3
Pessimistic time-base locking
Добавляем в качестве lock поля id транзакции
в состояние объекта, который хотим изменить
Обнуляем поле при commit/rollback
Обнуляем поле по timeout
30. Избегаем dtx. Вариант 4
Optimistic locking
Служит для обнаружения, а не для избежания
ошибок
Сначала обновляем локальную запись
Потом пытаемся обновить remote
Откатываем локальную при ошибке
31. Избегаем dtx. Вариант 4
Optimistic locking
Можно откатывать локальное изменения в
batch job, или с помощью лога транзакций
34. Idempotence - повторяемость
Нужно уметь распознавать повторные запросы
и делать сервисы repeatable
Возвращать уже существующий ответ на
повторный запрос
Очень сильно снижает сложность системы
микросервисов
35. Idempotence - повторяемость
Можно использовать tx id для определения
повторного запроса
Но как шарить tx id в кластере одинаковых
микросервисов?
Получается shared state, и требуются доп
усилия
36. Избегаем dtx. Вариант 5
Вручную своим кодом
Нет tx manager
Каждая tx рассматривается отдельно
Проблема с нетранзакционными сервисами,
которые нельзя откатить
43. Saga
Вспоминаем митап 4 «Интеграция систем и
очереди сообщений»
Дает eventual consistency
Микросервисы общаются через event bus
Хореография или оркестрация