Как вызвать микросервис, не замедляя отклик?

Я хочу интегрировать новую функциональность с решением для электронной коммерции на основе Laravel. На данный момент для запуска основных сценариев требуется около 2,7 с. Весь сайт загружается быстрее 6 секунд, и мы только начали его отслеживать. Цель состоит в том, чтобы получить менее 2 секунд со сценарием и 4 секунды со всем.

Микросервис и функциональность доступны через gRPC.

Существует аутентификация клиент-сервер на основе TLS (экземпляры электронной коммерции и мой сервис могут подтвердить, кто они). Это съедает несколько миллисекунд.

При тестировании Go-клиента и Go-сервера с пулом из 20 подключений было достигнуто менее 35 мс на запрос. В PHP каждый запрос занимает более 200 мс.

Это возможно:

  1. кэшировать подключение к сервису между запросами?
  2. вызывать методы RPC асинхронно?

Среди других решений, которые я рассматриваю:

  1. Настройка локального прокси-сервера gRPC, который будет принимать только запросы GET локального хоста, сделанные скриптом PHP, и делать их безопасными вызовами gRPC.
  2. Настройка прокси перед приложением PHP для вызова микросервиса.
  3. Вызов службы непосредственно с веб-сайта с помощью JavaScript (нагружает браузер пользователя, необходимо поддерживать JavaScript).

Какие-либо предложения?


person Paweł Szczur    schedule 21.12.2016    source источник
comment
да, один из подходов заключается в том, чтобы заставить пользователей чувствовать, что он загружается быстрее, но на самом деле ничего не ускоряется. Просто разделите нагрузку. Быстро загрузите что-нибудь, а затем заполните его содержимым.   -  person Sergio Tulentsev    schedule 21.12.2016
comment
Сайт раздут с некоторыми сторонними улучшающими решениями. Долгий путь, чтобы заставить его работать быстро. Теоретически есть части, загружаемые быстро, на практике я, как пользователь, чувствую, что это медленно.   -  person Paweł Szczur    schedule 21.12.2016
comment
Вы можете настроить Varnish в качестве уровня кэширования и отработки отказа между магазином и дополнительными API. В качестве дополнительного бонуса вы можете использовать Varnish для балансировки нагрузки запросов API и действовать в качестве диспетчера/маршрутизатора трафика. В общем (и немного не по теме, извините): - Для магазина на основе PHP почти ничего нельзя сделать на уровне PHP, кроме (очевидно) использования opcache, удаления ненужных модулей .so, сокращения логирования до минимума и использования возможна последняя версия. - По моему опыту работы с Magento, например, легкого выигрыша в производительности удалось достичь с помощью FPC с пробивкой отверстий +, doh, тонкой настройкой MySQL.   -  person oharlem    schedule 21.12.2016
comment
для асинхронного вызова методов RPC вы можете просто создать горутину с go method()   -  person Yandry Pozo    schedule 22.12.2016


Ответы (1)


  • Соединение следует использовать повторно, если вы используете тот же клиент. С другой стороны, есть возможность сначала предварительно создать объект Grpc\Channel, а затем передать его клиенту службы в качестве необязательного третьего параметра: https://github.com/grpc/grpc/blob/master/src/php/lib/Grpc/BaseStub.php#L58. Таким образом, вы сможете повторно использовать одно и то же соединение для разных служб.

  • В настоящее время мы не предоставляем асинхронный API для PHP. У нас была проблема с отслеживанием https://github.com/grpc/grpc/issues/6654 которые мы можем рассмотреть в будущем

person Stanley Cheung    schedule 26.01.2017
comment
Спасибо. Я знал об этом, мне было интересно, нашел ли кто-нибудь обходные пути. - person Paweł Szczur; 26.01.2017