Рубріки: HighloadРешения

Как реализовать системы с высокой нагрузкой на PHP: личный опыт

Павло Калінін

Вопрос High Availability – как увеличивать производительность и работать с высокой нагрузкой – в любом продукте стоит остро. В этом материале рассмотрим подход, который предназначен для ускорения работы PHP с брокером сообщений, на примере стека PHP + RabbitMQ + AMQProxy. 

Терминология

Сначала пройдемся по терминам.

AMQP (Advanced Message Queuing Protocol) – открытый протокол для передачи сообщений между компонентами системы.

Основная идея состоит в том, что отдельные подсистемы (или независимые приложения) могут обмениваться произвольным образом сообщениями через AMQP-брокер, осуществляющий маршрутизацию, доставку, распределение потоков данных, подписку на нужные типы сообщений.

RabbitMQ – это брокер сообщений с открытым исходным кодом.

RabbitMQ реализует и дополняет протокол AMQP. Он маршрутизирует сообщения по всем базовым принципам протокола AMQP, описанным в спецификации. Отправитель передает сообщение брокеру, а тот доставляет его получателю.

В чем проблема скорости публикации сообщений

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

Помним,  что PHP-FPM каждый раз создает сетевое соединение при обращении к внешним данным и не переиспользует его. Это приводит к высокой нагрузке на сетевую подсистему серверов, задержкам на создание новых соединений и закрытию использованных портов.

В протоколе AMQP, если вы открываете соединение, клиент и сервер должны обменяться семью пакетами TCP. Если вы хотите опубликовать сообщение, вам нужно открыть канал, для которого нужны еще два. Затем для публикации вам нужен еще один. А затем, чтобы элегантно закрыть соединение, вам понадобятся еще четыре пакета.

То есть в общей сложности требуется 15 пакетов TCP или 18, если вы используете AMQPS (TLS). Для клиентов, которые по какой-либо причине не могут поддерживать долгосрочные соединения с сервером, это оказывает значительное влияние на задержку.

Решение этой проблемы рассмотрим на примере AMQProxy.

Зачем нужен и как использовать AMQProxy?

AMQProxy – это прокси-сервис AMQP с открытым исходным кодом, который может повторно использовать соединение AMQP.

AMQProxy позволяет клиенту (например, PHP-клиенту), который обычно может использовать только кратковременные соединения, использовать постоянные соединения. Это уменьшает потребление ресурсов сети и очереди сообщений для ресурсов RabbitMQ.

Если запустить этот прокси-сервер в той же среде, где работает PHP-приложение, он сможет убрать всю эту задержку на создание и закрытие соединения:

  • Когда установлено соединение с прокси-сервером, прокси-сервер открывает соединение с сервером rabbit, используя учетные данные, предоставленные клиентом.
  • Затем трафик AMQP пересылается между клиентом и сервером. Но когда клиент отключается, прокси-сервер перехватывает команду закрытия канала и сохраняет его открытым на исходном сервере (если это считается безопасным).
  • В следующий раз, когда клиент подключается (с теми же учетными данными), соединение с высшим сервером используется повторно, поэтому не нужно создавать пакеты TCP для открытия и согласования соединения AMQP или открытия и ожидания открытия канала.

Как лучше развернуть прокси?

Лучше деплоить прокси как можно ближе к самому приложению. Детальнее это показано на изображении. На схеме можно увидеть, что у нас прокси развернут в качестве сайдкара к каждой реплике приложения:

Вот краткая инструкция, если вы также хотите минимизировать задержку и нагрузку на сеть в вашем продукте. Буду рад почитать в комментариях ваши варианты работы с высокой нагрузкой (High Load) и высокой доступностью (High Availability).

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

Останні статті

Токсичные коллеги. Как не стать одним из них и прекратить ныть

В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…

07.12.2023

Делать что-то впервые всегда очень трудно. Две истории о начале карьеры PM

Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…

04.12.2023

«Тыжпрограммист». Как люди не из ІТ-отрасли обесценивают профессию

«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…

15.11.2023

Почему чат GitHub Copilot лучше для разработчиков, чем ChatGPT

Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…

13.11.2023

Как мы используем ИИ и Low-Code технологии для разработки IT-продукта

Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…

07.11.2023

Университет или курсы. Что лучше для получения IT-образования

Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…

19.10.2023