ru:https://highload.today/blogs/migratsiya-s-http-api-na-grpc-moi-za-i-protiv-na-sobstvennom-opyte-raboty-nad-proektom/ ua:https://highload.today/uk/blogs/migratsiya-z-http-api-na-grpc-moyi-za-ta-proti-na-vlasnomu-dosvidi-roboti-nad-proyektom/
logo
Опыт      24/08/2022

Миграция с HTTP API на GRPC: мои «за» и «против» на собственном опыте работы над проектом

Ігор Закутинський BLOG

Head of Engineering GetProspect

Привет! Меня зовут Игорь Закутинский, я Head of Engineering GetProspect — украинского инструмента лидогенерации, позволяющего находить тысячи имейлов в LinkedIn за несколько кликов.

В этой статье я хочу поделиться собственным опытом миграции одного из сервисов проекта с HTTP API на GRPC, что позволило компании оптимизировать ресурсы и значительно увеличить ее производительность.

Краткий обзор платформы для лидогенерации GetProspect

Главная задача нашего сервиса — поиск электронного адреса определенного профиля в LinkedIn. Это происходит благодаря алгоритму, анализирующему данные, которые указывает пользователь в соцсети. После того, как все имейлы найдены, благодаря GetProspect можно легко управлять своими контактами в нашей CRM-системе. Для того, чтобы база электронных почт была максимально полной, пользователь дополнительно может загружать в нее данные из следующих источников:

  • Google Chrome extension;
  • CSV-файл;
  • через API;
  • интеграции со сторонними сервисами (например, Zapier);
  • Google-таблицы. 

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

Почему мы используем микросервисы?

Нагрузка динамическая и труднопрогнозируемая, поэтому основные требования к архитектуре сервиса — доступность и масштабируемость.

Бізнес англійська від Englishdom.
Тут навчають за методикою Кембриджу, завдяки якій англійську вивчили понад 1 мільярд людей. Саме вона використовується в найкращих навчальних закладах світу, і саме за нею створені курси.
Інформація про курс

GetProspect реализован по классической микросервисной архитектуре, где каждый микросервис отвечает следующим критериям:

  • фокус на конкретные бизнес-задачи;
  • независимость от языка программирования и фреймворков;
  • простота тестирования;
  • развертывание и деплоймент конкретного сервиса не зависит от других сервисов.

Микросервисная коммуникация

Большинство сервисов должны взаимодействовать как с внутренними, так и внешними ресурсами. Поэтому одна из главных составляющих, влияющей на производительность системы — микросервисная коммуникация. 

Наши микросервисы используют HTTP RESTfull API в качестве базового протокола обмена данными. 

REST (Representational State Transfer) — это архитектурный стиль взаимодействия распределенных компонентов в сети.

Основные преимущества REST API и почему мы его используем:

Онлайн-курс Frontend-разробник від Powercode academy.
Курс на якому ти напишеш свій чистий код на JavaScript, попрацюєш із різними видами верстки, а також адаптаціями проектів під будь-які екрани. .
Зарееструватися
  • интуитивно понятный;
  • прост в масштабировании;
  • прост в поддержке и отладке;
  • структура API не зависит от технологии и языка программирования.

HTTP REST API удовлетворяет основные потребности обмена данными между микросервисами, но из-за конструктивных особенностей не может использоваться во всех случаях.

Одна из основных задач нашего инструмента лидогенерации — поиск имейла пользователя. Поиск электронной почты основан на SMTP-диалоге с email-сервером и может занять от нескольких секунд до 10 минут. 

SMTP (Simple Mail Transfer Pro tocol) — это коммуникационный протокол для передачи электронной почты.

Процесс поиска и валидации email-адресов реализован на отдельном микросервисе — Mail verification service, а логика сохранения и управления данными — на API service

На первом этапе реализация выглядела следующим образом:

Онлайн-курс "Директор з продажу" від Laba.
Як стратегічно впливати на дохід компанії, мотивувати сейлзів перевиконувати KPI та впроваджувати аналітику — навчить комерційний директор Laba з 12-річним досвідом у продажах.
Приєднатись до курсу
Начальная схема реализации (нажмите, чтобы рассмотреть)

Начальная схема реализации (нажмите, чтобы рассмотреть)

Вышеприведенная схема достаточно упрощена, в ней не показаны многие элементы, такие как очереди, балансировка, кэш и т.д. Но его вполне достаточно для общего понимания процесса. 

Как видно из схемы, API service инициирует поиск имейл-адреса на Mail verification service с помощью HTTP-запроса, и через некоторое время, когда будет завершен процесс поиска, Mail verification service возвращает результат также через HTTP-запрос на API Service.

То есть для того, чтобы найти email-адрес, выполнялось как минимум два HTTP-запроса (на самом деле их было немного больше 😉), что порождало несколько проблем:

  • Во-первых, влияние на скорость и производительность. Каждый HTTP-запрос инициирует новое клиент-сервер-соединение, создающее большую нагрузку.    
  • Во-вторых, это то, что запросы не имели общего контекста, поскольку в REST-архитектуре отсутствует сохранение состояния запроса (stateless), то есть сервер выполняет каждый запрос клиента независимо от предыдущих.

В качестве оптимизации мы рассмотрели использование GRPC для коммуникации этих двух микросервисов, поскольку в нем архитектурно устранены недостатки, о которых я писал выше.  

Что такое GRPC? Почему мы выбрали его для микросервисной коммуникации?

GRPC — это современный протокол RPC, реализуемый поверх HTTP/2.

HTTP/2 — это протокол уровня 7 (уровень приложений), работающий поверх TCP (уровень 4 — транспортный уровень), который работает поверх протокола IP (уровень 3 — сетевой уровень). 

Курс Python розробки від Mate academy.
Python — найпопулярніша мова 2024 року. Наш курс допоможе вам стати професіоналом, готовим до викликів сучасного IT ринку. Ви навчитеся створювати вебсайти, аналізувати дані, розробляти алгоритми, та навіть створювати штучний інтелект. .
Отримати деталі про курс

У GRPC есть множество преимуществ перед традиционным HTTP/REST/JSON, например:

  • двоичный протокол (HTTP/2);
  • мультиплексирование многих запросов на одном соединении (HTTP/2);
  • сжатие заголовка (HTTP/2);
  • строго типизированный сервис и сообщение (Protobuf);
  • сериализация/десериализация данных.

Сообщения GRPC сериализируются с помощью Protobuf — эффективного двоичного формата сообщений. Protobuf быстро выполняет сериализацию на сервере и клиенте. 

Protobuf быстро выполняет сериализацию на сервере и клиенте

Protobuf быстро выполняет сериализацию на сервере и клиенте

С помощью Protobufсериализации нам удалось значительно снизить объем полезных данных, а значит увеличить пропускную способность между API-сервисом и сервисом, который процессит поиск email-адресов.

Также значительно упростилась логика поиска. На стороне API service процесс поиска имейла выглядит как вызов асинхронной функции (удаленной процедуры в случае gRPC 😉).

Курс-професія "Motion Designer" від Skvot.
Навчіться створювати 2D- та 3D-анімації у софтах After Effects, Cinema 4D та Octane Render. Протягом курсу ви створите 14 моушн-роликів, 2 з яких — для реального клієнта.
Детальніше про курс

Тест производительности: GRPC vs HTTP Restful API

Я решил провести тест, для которого использовался два AWS EC2 c5.2xLarge instance, на которых были запущены Node.js application — клиент и сервер.

В этом тесте клиент делает простой запрос на сервер или вызывает процедуру, а сервер просто возвращает значение без какой-либо сложной логики, поскольку цель — определить производительность протокола. В тесте определяется количество возможных запросов за единицу времени (1 секунду, а также время на выполнение 100к запросов или вызовов процедур).

gRPC server, который использовался для теста:

Нажмите для просмотра

Нажмите для просмотра

gRPC client, который использовался для теста:

Нажмите для просмотра

Нажмите для просмотра

Для теста HTTP Rest API реализована аналогичная логика на Fastify и Axios.  

Результаты теста:

HTTP Post request gRPC procedure call
100k async requests, sec 32.342 4.370
Requests per second 2147 26102
CPU usage – ms/req 491 ms / per request 211 ms / per request

Как видно из графика, пропускная способность GRPC более чем в восемь раз выше HTTP API, что значительно повышает производительность на больших объемах запросов. Также следует отметить то, что CPU-время на 1 gRPC-процедуру более чем в два раза меньше, чем на аналогичный HTTP-запрос. 

Балансировка нагрузки

Поскольку общая нагрузка на сервис постоянно меняется, возникает необходимость масштабирования каждого отдельного микросервиса, и, соответственно, балансировка нагрузки между ними. Балансировка GRPC-сервисов несколько сложнее балансировки сервисов с HTTP-сервером. 

Существует два основных подхода к GRPC-балансировке: 

Онлайн-курс "Корпоративна культура" від Laba.
Як з нуля побудувати стабільну корпоративну культуру, систему внутрішньої комунікації та бренд роботодавця, з якими ви підвищите продуктивність команди, — пояснить HR-директор Work.ua.
Детальніше про курс
  • на стороне клиента;
  • балансировка через proxy-сервер.  

Преимущество клиентской балансировки — прямое соединение клиент-сервер, обеспечивающее минимальное время обмена сообщениями. Тем не менее при таком подходе есть много минусов, из-за которых мы отказались от такой реализации, а именно:

  • сложность реализации клиента;
  • клиент отслеживает нагрузку и доступность сервера;
  • необходимость реализации и поддержания алгоритма балансировки.

Эти проблемы значительно усложняются при росте числа клиентов.

В нашем случае балансировка реализована через Haproxy, что значительно упрощает реализацию и полностью удовлетворяет нашим требованиям по производительности. 

Балансировка через Haproxy / Нажмите, чтобы посмотреть

Балансировка через Haproxy / Нажмите, чтобы рассмотреть

Безопасность в GRPC-микросервисах

GRPC поддерживает SSL/TLS encryption, что позволяет шифровать данные, которыми обменивается клиент и сервер. Также GRPC предоставляет простой Auth API, позволяющий предоставить авторизационные данные при создании канала или вызове функции.

Пример авторизации через SSL/TLS-сертификаты:

Курс-професія "Дизайнер інтер'єрів" від Skvot.
Велика практична програма для всіх, хто хоче засвоїти професію дизайнера інтер'єрів і заробляти на реальних проєктах відразу після курсу. Досвідом та інсайтами діляться одразу три лектори.
Програма курсу
const cert = fs.readFileSync('path/to/cert');
const ssl = grpc.credentials.createSsl(cert);
const stub = new service.Verification('grpc.service.com', ssl);

Слабые стороны GRPC

Браузерная поддержка

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

Недоступно для чтения человеком

Запросы HTTP Rest API отправляются в текстовом виде (JSON), что позволяет разработчикам их легко читать и редактировать. gRPC использует двоичный протокол Protobuf, что значительно эффективнее, но не читаемо человеком, что затрудняет и замедляет процесс отладки и разработки.

Выводы

На сегодня GRPC — перспективное решение для микросервисов, где необходима высокая пропускная способность. Его использование позволило нам оптимизировать bottleneck нашей системы, значительно сократить расходы на трафик и увеличить производительность. 

Тем не менее из-за сложности в реализации, а также отсутствия полноценной браузерной поддержки мы не можем рассматривать GRPC как полноценного конкурента HTTP REST API. 

Делитесь вашими мыслями, мигрировали ли вы с HTTP API на GRPC, и каковы результаты?

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Курс English For IT: Communication від Enlgish4IT.
Почни легко працювати та спілкуватися з мультикультурними командами та міжнародними клієнтами. Отримайте знижку 10% за промокодом ITCENG.
Інформація про курс

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров марта

PHP Developer в ScrumLaunch
Всего просмотровВсего просмотров
2434
#1
Всего просмотровВсего просмотров
2434
Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсего просмотров
113
#2
Всего просмотровВсего просмотров
113
Career Consultant в GoIT
Всего просмотровВсего просмотров
95
#3
Всего просмотровВсего просмотров
95
CEO & Founder в Trustee
Всего просмотровВсего просмотров
94
#4
Всего просмотровВсего просмотров
94
Рейтинг блогеров

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: