Фон:
Мы пытаемся перенести наш API-шлюз с REST на gRPC. API-шлюз будет использоваться серверной командой с помощью REST, а обмен данными между API-шлюзом и микросервисом будет осуществляться с помощью gRPC. Наш API-шлюз построен с использованием Tornado Python Framework, Gunicorn и использует tornado.curl_httpclient.CurlAsyncHTTPClient
для включения Async / Future для каждой конечной точки. Каждая конечная точка будет вызывать микросервисы с использованием Unary RPC, а заглушка gRPC вернет Future.
Поэтому, прежде чем полностью перейти на gRPC, мы пытаемся сравнить производительность gRPC и REST. Вот что вам может понадобиться:
- У нас есть 3 конечные точки для тестирования.
/0
,/1
и/2
с однострочными данными. Размер полезной нагрузки составляет 100 КБ, 1 МБ и 4 МБ. Эти сообщения уже созданы при запуске экземпляра, поэтому конечной точке нужно только его получить. - Параллелизм = 1, 4, 10 для каждой конечной точки.
- Максимальное количество работников пула потоков gRPC = 1, а работник Gunicorn = 16.
- Мы используем APIB для нагрузочного тестирования.
- Все нагрузочные тесты выполняются с использованием экземпляра виртуальной машины GCP. Технические характеристики машины: Intel Broadwell, n1-standard-1 (1 виртуальный ЦП, 3,75 ГБ памяти), ОС: Debian 9
- Код имеет схожую структуру и бизнес-логику.
Вывод: чем выше Concurrency и размер полезной нагрузки, тем медленнее становится gRPC и, в конечном итоге, медленнее, чем REST.
Вопрос:
- Может ли gRPC обрабатывать большой размер полезной нагрузки и большой параллелизм с помощью Unary Call по сравнению с REST?
- Есть ли способ сделать так, чтобы gRPC стал быстрее, чем REST?
- Есть ли какая-то фундаментальная причина, которую я упустил?
Вот несколько способов, которые я пробовал:
- GZIP Сжатие из grpcio. В результате он стал медленнее, чем раньше.
- Использование параметров
GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS
иGRPC_ARG_KEEPALIVE_TIMEOUT_MS
в конфигурации заглушки и сервера. По производительности изменений нет. - Измените максимальное количество рабочих серверов gRPC на
10000
. Результат: без изменений производительности. - Измените Gunicorn Worker на
1
. Результат: без изменений производительности.
Как я не пробовал:
- Использование Stream RPC
Любая помощь объявляется. Спасибо.