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

Post on 16-Jul-2015

642 views 4 download

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

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

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

Ecwid

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

• ~750.000 клиентов

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

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

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

Как начинали

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

Проблемы

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

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

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

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

Следствия

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

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

Планы

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

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

Как быть?

• Единый RPC

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

Единый RPC

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

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

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

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

sync

async

stream

Единый RPC

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

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

retry with backoff

Единый RPC

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

protobuf vs JAXB

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

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

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

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

XML

protobuf vs JAXB

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

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

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

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

XML

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

Единый RPC

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

Реализация

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

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

Пример

Пример

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

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

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

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

• Copy-Paste Driven Development?

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

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

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

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

• Тупо? Тупо!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итог

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

Вопросы?

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