Вопрос 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 – это прокси-сервис AMQP с открытым исходным кодом, который может повторно использовать соединение AMQP.
AMQProxy позволяет клиенту (например, PHP-клиенту), который обычно может использовать только кратковременные соединения, использовать постоянные соединения. Это уменьшает потребление ресурсов сети и очереди сообщений для ресурсов RabbitMQ.
Если запустить этот прокси-сервер в той же среде, где работает PHP-приложение, он сможет убрать всю эту задержку на создание и закрытие соединения:
Лучше деплоить прокси как можно ближе к самому приложению. Детальнее это показано на изображении. На схеме можно увидеть, что у нас прокси развернут в качестве сайдкара к каждой реплике приложения:
Вот краткая инструкция, если вы также хотите минимизировать задержку и нагрузку на сеть в вашем продукте. Буду рад почитать в комментариях ваши варианты работы с высокой нагрузкой (High Load) и высокой доступностью (High Availability).
В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…
Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…
«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…
Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…
Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…
Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…