TGViewer
Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter @phpproglib · 10.5K subscribers
Post #6035 2.11K
🚀 Как построить надёжную шину событий с Redis Streams в PHP

Redis Streams давно перестали быть экзотикой и стали нормальным способом передачи событий между сервисами. В PHP есть два популярных подхода для работы с ними: Amp с неблокирующим I/O и Swoole с корутинами. Оба подхода позволяют реализовать устойчивые consumer-группы, ручной ack, автоматическое перенаправление зависших сообщений, backpressure, экспоненциальные ретраи и дед-лейтер.

🛠️ Что строим
Задача — создать шину событий заказов. Продюсер записывает события в orders:events с помощью команды XADD с триммингом. Несколько воркеров читают из consumer-группы orders:cg с использованием XREADGROUP в блокирующем режиме, подтверждают обработку через XACK, а зависшие записи перенаправляются на активного потребителя через XAUTOCLAIM. Если событие стабильно не обрабатывается, оно отправляется в orders:events:dlq и больше не участвует в основном потоке. Мониторинг задержки группы осуществляется через XINFO GROUPS, а хвосты периодически очищаются.

⚙️ Варианты реализации
Amp: Неблокирующее чтение с использованием XREADGROUP, ограничение параллельной обработки с помощью LocalSemaphore, подтверждение XACK пачками. Для подбора зависших сообщений параллельно запускается цикл XAUTOCLAIM.
Swoole: Использование корутин с каналом как семафором, Redis из ext-phpredis. Параллельная обработка ограничивается размером канала.

🔁 Экспоненциальные ретраи
Redis Streams не поддерживают отложенные сообщения, но можно реализовать экспоненциальные ретраи с использованием ZSET. При ошибке вы подтверждаете задачу и кладёте её в ZSET orders:retry со значением score = now + backoffMs. Отдельная корутина периодически извлекает задачи из ZSET и повторно добавляет их в основной стрим с увеличенным счётчиком попыток.

📊 Мониторинг и масштабирование
Для мониторинга используйте команду XINFO GROUPS, чтобы отслеживать количество записей, которые ещё не доставлены группе. Если лаг стабильно растёт, добавляйте консьюмеров. Если лаг «пилит» около нуля, можно уменьшить число воркеров.

🔗 Хабр

Библиотека пхпшника
  • 👍 6
More from @phpproglib
  1. Sep 24, 2026👍 5 способов встроить AI в Laravel Laravel AI SDK позволяет добавлять AI-функции прямо в…
  2. Sep 23, 2026🛠 Symfony 8.2 научился автоматически генерировать JSON Schema для конфигурации приложения…
  3. Sep 23, 2026🚀 Свежий релиз Laravel 13 с набором улучшений и исправлений ✅ добавлена поддержка valkey:…
  4. Sep 21, 2026⚡️ PHP 8.6 выйдет 19 ноября 2026 года. Сейчас версия находится в beta. Самые заметные изме…
  5. Sep 20, 2026❓ Какие существуют проблемы в многопоточной среде? Основные проблемы многопоточности: 1️⃣…
  6. Sep 19, 2026🌞 В Symfony 8.2 появилось 29 новых Bundle — теперь компоненты вроде Mailer, Messenger и C…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →