UA RU
logo
Highload      01/06/2023

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

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

Head of IT Infrastructure Department в одній з продуктових компаній від venture builder SKELAR

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

Онлайн-курс "Data Engineering" від robot_dreams.
Пориньте у процес обробки даних та опануйте ключові інструменти, щоб навчитися проєктувати архітектуру під завдання бізнесу та оперативно обробляти до 1 Пбайта даних. .
Детальніше про курс

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

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

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

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

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

Онлайн-курс "Data Engineering" від robot_dreams.
Пориньте у процес обробки даних та опануйте ключові інструменти, щоб навчитися проєктувати архітектуру під завдання бізнесу та оперативно обробляти до 1 Пбайта даних. .
Детальніше про курс

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

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

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

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

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

Онлайн-курс "Системний геймдизайнер" від Skvot.
Створювати ігрові механіки, розробляти складні левели, формувати ігровий досвід, який занурює в сюжет і не відпускає, — вчимося за 4 місяці з нуля, на досвіді геймдизайнера з 8-річним досвідом. .
Про курс

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

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

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

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

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

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

  • Когда установлено соединение с прокси-сервером, прокси-сервер открывает соединение с сервером rabbit, используя учетные данные, предоставленные клиентом.
  • Затем трафик AMQP пересылается между клиентом и сервером. Но когда клиент отключается, прокси-сервер перехватывает команду закрытия канала и сохраняет его открытым на исходном сервере (если это считается безопасным). 
  • В следующий раз, когда клиент подключается (с теми же учетными данными), соединение с высшим сервером используется повторно, поэтому не нужно создавать пакеты TCP для открытия и согласования соединения AMQP или открытия и ожидания открытия канала.
  • Онлайн-курс "Англійська для юристів: Legal Writing" від Vocabulaba.
    Перекладіть юридичний досвід на площину англійської, прокачайте навички професійного письма та підготуйтесь до міжнародної практики.
    Детальніше про курс

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

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

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

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

Онлайн-курс “Комерційний директор” від Laba.
Поглибте знання в управлінні фінансами, логістиці, звітності та роботі з ринком, аби збільшити частку компанії на ньому. Досвід та фідбек від генерального директора Miele в Україні. .
Детальніше про курс

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров сентября

Всего просмотровВсего просмотров
36
#1
Всего просмотровВсего просмотров
36
Всего просмотровВсего просмотров
29
#2
Всего просмотровВсего просмотров
29
Всего просмотровВсего просмотров
23
#3
Всего просмотровВсего просмотров
23
Career Consultant в GoIT
Всего просмотровВсего просмотров
21
#4
Всего просмотровВсего просмотров
21
Всего просмотровВсего просмотров
18
#5
Всего просмотровВсего просмотров
18
Рейтинг блогеров
Онлайн-курс "Communicative Business English" від Vocabulaba.
Прокачайте професійну англійську для роботи в бізнесі та заговоріть впевнено — на співбесіді, презентації чи перемовинах.
Детальніше про курс

Самые обсуждаемые статьи

Топ текстов

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: