Вопрос 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).
Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: