View
2.566
Download
13
Category
Preview:
DESCRIPTION
РИТ-2013: Доклад о решениях по асинхронной обработке данных, внедреннных в Мамбе. 1) собственный Comet-сервер, 2) Неудачное внедрение Gearman, 3) RabbitMQ: основы работы, тонкости и особенности внедрения.
Citation preview
Асинхронная обработка данных: RabbitMQ, Comet
Андрей Федоровский
Задачи для асинхронной работы
• Интерактивный интерфейс, подписка на события
• Взаимодействие со внешними, неподконтрольными сервисами
• Медленный процессинг заданий
Comet• Браузер открывает соединение к серверу*
• Для клиента создается личный канал
• Клиент подписывается на него и на общие каналы, например, счетчик количества людей онлайн
• Пользователю приходит сообщение – PHP через Comet сервер отправляет его в сокет клиента.
* Единое для всех вкладок и окон. Подробности здесь:
Highload++ 2012, Г.Арестов. «Использование Comet для создания интерактивных интерфейсов»
Comet сервер
• 4 http-front
• 1 брокер
• 1 хаб
Gearman
• Деградировала производительность с ростом длины очереди
• Клиент странно работал с резервирующими серверами
• Очередь в памяти + внешний сторадж: Mysql или Tokyo Cabinet*
• Ну и просто медленно работал
* Highload++ 2012, Д. Ананьев. «Практические вопросы использования NoSQL в высоконагруженном проекте»
И снова Comet• 50.000 сообщений в секунду на ядро (тест, 200 байт/сообщение)
• 600.000 очередей (прямо сейчас в продакшне)
• Собственная разработка – проще развивать
• Превосходный параллелизм
И снова Comet• 50.000 сообщений в секунду на ядро (тест, 200 байт/сообщение)
• 600.000 очередей (прямо сейчас в продакшне)
• Собственная разработка – проще развивать
• Превосходный параллелизм
НО
• Нет гарантии доставки
• Нет надежного хранилища очередей
• Нет защиты от падений
• Не тестировали на длинных очередях
Требования
• Гарантия доставки сообщения
• Сохранность сообщений при авариях разного вида
• Распределенность: параллелизуемость, устойчивость
• Клиентские библиотеки для php, c++
• Скорость работы: 1-10 тысяч сообщений на 1 ядро
Что есть на рынке
• ActiveMQ – Java, JMS
• Kafka – спроектирована под логи, держит малое число очередей
• RabbitMQ – Erlang, AMPQ 0.9
• ZeroMQ – голая платформа
RabbitMQ
• Publisher
• Exchange
• Queue
• Consumer
• Binding
RabbitMQ: гарантии доставки • Confirm: брокер сообщает отправителю, что сообщение успешно
поставлено в очередь
• Ack[nowledge]: получатель сообщает брокеру, что сообщение обработано логикой приложения. Приложение также может явно отправить NACK.
• Durable queue / persistent messages: произошел fsync очереди / сообщения на диск. По умолчанию – периодически.
• Транзакции: fsync происходит гарантированно, но это сильно замедляет.
• AMQP heartbeat.
RabbitMQ: несколько серверов
• Clustering – единый виртуальный брокер. На серверах одинаковое ПО, находиться должны рядом. Сообщения передаются средствами Erlang.– Зеркалирование очередей по всем нодам кластера.
Если падает мастер – из слейвов выбирается новый.
• Federation – форвардинг сообщений между разными exchange средствами AMQP. ПО может быть различным, сервера могут быть разнесены.
RabbitMQ в Мамбе• Кластер из 2 нод с полным зеркалированием очередей (haall)
• Durable queues
• Вместо AMQP heartbeat сделали TCP keepalive
• Слейв в 3.0.4 слегка течет. Ждем фикса.
• Prefetch 1 сообщения
• Отдельная очередь для NACK, иначе во время аварии все тормозит.
• 3 consumer сервера для разбора сообщений в 32 потока.
RabbitMQ в Мамбе
Процессинг сообщения• Сабмит сообщения на сайте, оно приходит на фронтенд
• Проверки пользовательских настроек запрета доставки сообщений
• Проверка на спам
• Сохранение сообщения в шарде отправителя
• Сохранение сообщения в шарде получателя
• Генерация уведомлений: email, sms, comet и т.п.
Процессинг с RabbitMQ• Сабмит сообщения на сайте, оно приходит на фронтенд
• Проверки пользовательских настроек запрета доставки сообщений
• Проверка на спам
• Сохранение сообщения в шарде отправителя
• Сохранение сообщения в шарде получателя
• Генерация уведомлений: email, sms, comet и т.п.
Итого, асинхронные решенияМежду клиентом и сервером
• Realtime уведомления клиента о событиях для него
• Очень большое число клиентских соединений
• Малая длина очередей
• Ненадежное хранилище
Comet сервер
Между сервисами
• Отложенная обработка событий
• Фиксированное малое число коннектов
• Очень длинные очереди
• Гарантии доставки, надежный сторадж
RabbitMQ
Спасибо за внимание!
Андрей Федоровский
fedorovsky@mamba.ru
Recommended