ru:https://highload.today/blogs/kak-realizovat-sistemy-s-vysokoj-nagruzkoj-na-php-lichnyj-opyt/ ua:https://highload.today/uk/blogs/yak-realizuvati-sistemi-z-visokim-navantazhennyam-na-php-osobistij-dosvid/
logo
Highload      01/06/2023

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Онлайн-курс "Business English for Marketers" від Laba.
Опануйте професійну англійську для маркетингу.Розширте карʼєрні можливості для роботи з іноземними колегами: від розробки нових продуктів до презентації стратегії бренду.
Детальніше про курс

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

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

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

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

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

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

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

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

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

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

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

Онлайн-курс "QA Automation" від robot_dreams.
Це 70% практики, 30% теорії та проєкт у портфоліо.Навчіться запускати перевірку сотень опцій одночасно, натиснувши лише одну кнопку.
Детальніше про курс

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

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

PHP Developer в ScrumLaunch
Всего просмотровВсего просмотров
2434
#1
Всего просмотровВсего просмотров
2434
Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсего просмотров
113
#2
Всего просмотровВсего просмотров
113
Career Consultant в GoIT
Всего просмотровВсего просмотров
95
#3
Всего просмотровВсего просмотров
95
CEO & Founder в Trustee
Всего просмотровВсего просмотров
94
#4
Всего просмотровВсего просмотров
94
Рейтинг блогеров

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

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

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