Дорога к микросервисной архитектуре

34
Дорога к микро-сервисам Василий Васильков, Ecwid

Transcript of Дорога к микросервисной архитектуре

Page 1: Дорога к микросервисной архитектуре

Дорога к микро-сервисам

Василий Васильков, Ecwid

Page 2: Дорога к микросервисной архитектуре

Ecwid

• SaaS-платформа для создания интернет-магазинов

• ~750.000 клиентов

• ~100.000.000 посетителей в месяц

• 80 человек в команде

• Ульяновск, Казань, Самара и San Diego

Page 3: Дорога к микросервисной архитектуре

Как начинали

• Начали с трех сервисов• Через три года их стало десять• Это не так много, но…

Page 4: Дорога к микросервисной архитектуре

Проблемы

• Четыре разных протокола меж-сервисного “общения”

• Три разных “каркаса” для создания сервисов

• Три разных стратегии обновления• Три разных формата пакетов и способов старта на production

Всей команде приходится знать и помнить про эти отличия

Page 5: Дорога к микросервисной архитектуре

Следствия

• Время создания нового сервиса очень большое (дни)• Подготовка к деплою очень долгая (дни)

• Время разработки и поддержки увеличивается

Page 6: Дорога к микросервисной архитектуре

Планы

• За первые годы мы сделали 10 сервисов

• За следующий год мы хотим +25

Page 7: Дорога к микросервисной архитектуре

Как быть?

• Единый RPC

• Единая инфраструктура

Page 8: Дорога к микросервисной архитектуре

Единый RPC

• Сервисам нужны разные способы “общаться” друг с другом:

• SYNC (обычный вызов точка-точка)

• ASYNC (отложенный вызов через очередь сообщений)

• STREAM (broadcast, pub-sub, один сервис сразу всем)

Page 9: Дорога к микросервисной архитектуре

sync

Page 10: Дорога к микросервисной архитектуре

async

Page 11: Дорога к микросервисной архитектуре

stream

Page 12: Дорога к микросервисной архитектуре

Единый RPC

• Повтор неудачного запроса N раз к разным серверам.

Это должен делать сам протокол.

Page 13: Дорога к микросервисной архитектуре

retry with backoff

Page 14: Дорога к микросервисной архитектуре

Единый RPC

• Быстрая сериализация• Forward/backward совместимая

Page 15: Дорога к микросервисной архитектуре

protobuf vs JAXB

• Быстрее, но не очень (в 2-5 раз)

• Меньше, но не очень (в полтора раза)

• Проще• Внутри это обычный объект• Есть куча кода, готового для

JAXB-сериализации

XML

Page 16: Дорога к микросервисной архитектуре

protobuf vs JAXB

• Быстрее, но не очень (в 2-5 раз)

• Меньше, но не очень (в полтора раза)

• Проще• Внутри это обычный объект• Есть куча кода, готового для

JAXB-сериализации

XML

Хорошо, дайте два

Page 17: Дорога к микросервисной архитектуре

Единый RPC

• Простая реализация• …и использование

Page 18: Дорога к микросервисной архитектуре

Реализация

• Или слишком просто или АДЪ

• Наша реализация: ~60 классов, 3k loc

Page 19: Дорога к микросервисной архитектуре

Пример

Page 20: Дорога к микросервисной архитектуре

Пример

• Асинхронный вызов с аргументами будет сериализован и отправлен в очередь• Будет ждать пока один из серверов-адресатов не пойдет разбирать эту очередь и выполнять отложенные вызовы

Page 21: Дорога к микросервисной архитектуре

Единая инфраструктура

• У любого сервиса есть общие части. Это НЕ бизнес-логика!

• Писать в каждом сервисе с нуля?

• Copy-Paste Driven Development?

Page 22: Дорога к микросервисной архитектуре

Единая инфраструктура

Page 23: Дорога к микросервисной архитектуре
Page 24: Дорога к микросервисной архитектуре

Единая инфраструктура

• Все вместе занимает примерно 1.000 строк кода

• 30 сервисов - 30.000 строк одинакового кода?

• Тупо? Тупо!

Page 25: Дорога к микросервисной архитектуре
Page 26: Дорога к микросервисной архитектуре

Единая инфраструктура

Page 27: Дорога к микросервисной архитектуре

Единая инфраструктура

• Разработчики довольны• А админы?

Page 28: Дорога к микросервисной архитектуре

Единая инфраструктура

• Пакеты всех сервисов идентичны service.propertiesstartup.shlib/*.jar

• Запуск любого сервиса выполняется одними и теми же скриптами (уже написанными :)

• Логи в известном месте в известном формате

• Требования к любой машине понятны: linux, jdk, consul

Page 29: Дорога к микросервисной архитектуре

Единая инфраструктура

• Базовые метрики (HTTP, PostgreSQL) всегда идут в graphite

• У всех сервисов единые служебные endpoint’ы:/self-test/warmup/version

• Сервисы сами регистрируют себя в consul и поддерживают

состояние живой/нет, не надо писать отдельных скриптов

Page 30: Дорога к микросервисной архитектуре

• В проекте 30+ сервисов, как с ними работать?

Локальная разработка

Page 31: Дорога к микросервисной архитектуре

Локальная разработка

Page 32: Дорога к микросервисной архитектуре

Итог

• Беспощадная стандартизация• На всех уровнях, не только для разработки• Огромный простор для дальнейших оптимизаций

Page 33: Дорога к микросервисной архитектуре
Page 34: Дорога к микросервисной архитектуре

Вопросы?

Василий Васильков, @2vgv