воскресенье, 17 мая 2009 г.

Очередь сообщений - что это и зачем?

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



Что же такое очередь сообщений? Как именно она позволяет решать все перечисленные задачи? Как организовать очередь сообщений? Какие достоинства, недостатки и сложности такого решения? О всем этом далее:



Старый подход


Для начала, давайте посмотрим на пример того, как обычно реализуется весь цикл по обработке запроса от клиента. Рассмотрим пример. Пусть у нас есть страница, которая содержит простую форму с текстовым полем и одной кнопкой:


Простая форма с кнопкой и полем

После нажатия на кнопку, система отправляет почтовое сообщение на 5 email адресов, после чего показывает человеку сообщение “Сообщения отправлены”. Давайте посмотрим, как же определяется время ответа системы, и насколько быстро человек получит сообщение об успешном завершении:


запрос-ответ


Из этого следует, что клиент будет ждать выполнения всех операций на сервере и только после этого получит ответ.

А теперь подумайте, что будет если email отправляется не на 5, а на 5000 адресов?

Отправка даже одного email’a - это сравнительно длительная операция. Отправка email’ов рассмотрена в данном случае лишь как пример ресурсоемкой операции на сервере. В реальных условиях это может быть что угодно - вставка или обновление большого количества данных в таблицу, ресайзинг фотографий, сложные вычисления, и т.д. Идея в том, что человеку приходится ждать окончания всех этих процессов до получения ответа от сервера.



А теперь подумайте, волнует ли пользователя, смог ли Ваш сервер вставить данные, отправить почту или сделать еще что-то? Нет, ему важно знать только то, что сервер принял запрос и начал над ним работать. Этого достаточно в 99.9% всех запросов от клиента к серверу.



Представте себе, что было бы, если бы пункты ремонта обуви заставляли каждого клиента ждать возле двери, пока его обувь отремонтируют. Или если в банке клиента заставляли бы ждать, пока деньги, которыми он оплатил счет, придут на счет компании-получателя. Звучит смешно, а ведь именно так работает большинство Web систем. Причем это касается не только крупномасштабных решений. В приложениях любого уровня есть затратные операции, которые заставляют человека ждать.


Новый подход - асинхронная обработка


Проблема понятна. Каково решение?..


Исполнять синхронно только необходимые для формирования ответа операции, всё остальное выполнять асинхронно.

Давайте рассмотрим, как мы можем применить этот подход для описанной выше задачи:


req-resp-as

Что изменилось? После приема запроса от клиента, сервер разделил задачу на два “потока”. В первом потоке он сразу генерирует и посылает ответ пользователю - это синхронная часть. Во втором потоке он выполняет отправку email’ов (независимо от первого потока) - это асинхронная часть. В итоге мы получаем огромный прирост в скорости ответа системы - не заставляем человека ждать, пока сервер сделает всё. Кроме этого, подобный подход позволит нам балансировать нагрузку, т.е. решать задачи разного типа на разных узлах (и даже на разных платформах). Например, мы можем выделить отдельный сервер, который будет выполнять отправку email сообщений.


Проблема и принцип решения ясен, теперь о методах и технологиях.


Очереди сообщений



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


Системы очередей сообщений

Как все работает? Фронтенды получают запросы от пользователей. Передают обработку на бекенды. Бекенды выполняют только необходимые для формирования ответа операции. Остальные задачи бекенды передают на сервера сообщений, которые управляют очередью. Паралельно с этими процессами, обработчики очереди постоянно проверяют наличие новых сообщений. Если таковы найдены, они принимают сообщения, обрабатывают их и удаляют из очереди (или помечают как обработанные, или перемещают в другую очередь - что-то делают).


Преимущества систем организации очередей сообщений:



  1. Ускорение интерфейса путем понижения времени ответа от системы

  2. Возможность выполнения затратных операций паралельно путем разбиения их на более мелкие задачи

  3. Временное балансирование нагрузки - избавление от проблем пиковых нагрузок

  4. Архитектурное балансирование нагрузки на различные узлы

  5. Простое применение различных технологий для обработки задач разного типа (т.к. системы обмена сообщений имеют интерфейсы для различных платформ)

  6. Устранение единых точек отказов - системы обмена сообщениями являются распределенными системами, не имеющими одного центра


Некоторые существующие решения



  1. Gearman - базовая платформа для построения систем очередей сообщений с развитым функционалом и наличием интерфейсов на многих языказ

  2. Minimalist Queue Services - легковесное и простое решение для огранизации системы обмена сообщениями между компонентами системы

  3. Dropr - система очереди сообщений на PHP


Читайте также статью с примером реализации очереди сообщения на основе PHP и системы Dropr (скоро).



Google Bookmarks Digg I.ua Ru-marks Ruspace Zakladok.net Reddit delicious Technorati Yahoo My Web News2.ru БобрДобр.ru Memori.ru rucity.com


Комментариев нет:

Отправить комментарий