ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)


Published on

  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • http://en.wikipedia.org/wiki/FIFO http://en.wikipedia.org/wiki/Message_queue Message queues provide an  asynchronous   communications protocol , meaning that the sender and receiver of the message do not need to interact with the message queue at the same time. Messages placed onto the queue are stored until the recipient retrieves them. These message queueing systems typically provide enhanced  resilience  functionality to ensure that messages do not get "lost" in the event of a system failure. Очередь в программировании используется, как и в реальной жизни, когда нужно совершить какие-то действия в порядке их поступления, выполнив их последовательно. Примером может служить организация событий в Windows. Когда пользователь оказывает какое-то действие на приложение, то в приложении не вызывается соответствующая процедура (ведь в этот момент приложение может совершать другие действия), а ему присылается сообщение, содержащее информацию о совершенном действии, это сообщение ставится в очередь, и только когда будут обработаны сообщения, пришедшие ранее, приложение выполнит необходимое действие. Many of the more widely-known  communications protocols  in use operate  synchronously . The  HTTP  protocol – used in the  World Wide Web  and in  web services  – offers an obvious example. In many situations this makes perfect sense; for example, a user sends a request for a web page and then waits for a reply. However, other scenarios exist in which such behaviour is not appropriate. For example, an application may need to notify another that an event has occurred, but does not need to wait for a response. Another example occurs in  publish/subscribe  systems, where an application "publishes" information for any number of clients to read. In both these examples it would not make sense for the sender of the information to have to wait if, for example, one of the recipients had crashed. Alternatively, an interactive application may need to respond to certain parts of a request immediately (such as telling a customer that a sales request has been accepted, and handling the promise to draw on inventory), but may queue other parts (such as completing calculation of billing, forwarding data to the central accounting system, and calling on all sorts of other services) to be done some time later. In all these sorts of situations, having a subsystem which does asynchronous message-queuing (or alternatively, a broadcast messaging system) can help improve the behaviour of the overall system.
  • http://docs.amazonwebservices.com/AWSSimpleQueueService/2008-01-01/SQSDeveloperGuide/index.html?AboutVT.html When a consuming component in your system receives and processes a message from the queue, the message remains in the queue. Why doesn't SQS automatically delete it? Because your system is distributed, there's no guarantee that the component will actually receive the message (it's possible the connection could break or the component could fail before receiving the message). Therefore, SQS does not delete the message, and instead, your consuming component must delete the message from the queue after receiving and processing it. Immediately after the component receives the message, the message is still in the queue. However, you don't want other components in the system receiving and processing the message again. Therefore, SQS blocks them with a  visibility timeout , which is a period of time during which SQS prevents other consuming components from receiving and processing that message. The following figure and discussion illustrate the concept. The visibility timeout clock starts ticking once SQS returns the message. During that time, the component processes and deletes the message. But what happens if the component fails before deleting the message? If your system doesn't call  DeleteMessage  for that message before the visibility timeout expires, the message again becomes visible to the  ReceiveMessage calls placed by the components in your system and it will be received again. If a message should only be received once, your system should delete it within the duration of the visibility timeout. Each queue starts with a default setting of 30 seconds for the visibility timeout. You can change that setting for the entire queue. Typically, you'll set the visibility timeout to the average time it takes to process and delete a message from the queue. When receiving messages, you can also set a special visibility timeout for the returned messages without changing the overall queue timeout. We recommend that if you have a system that produces messages that require varying amounts of time to process and delete, you create multiple queues, each with a different visibility timeout setting. Your system can then send all messages to a single queue that forwards each message to another queue with the appropriate visibility timeout based on the expected processing and deletion time for that message. The following table lists the API actions to use to manipulate the visibility timeout.
  • http://en.wikipedia.org/wiki/Publish/subscribe Publish/subscribe  (or pub/sub) is a  messaging   paradigm  where senders (publishers) of messages are not programmed to send their messages to specific receivers (subscribers). Rather, published messages are characterized into classes, without knowledge of what (if any) subscribers there may be. Subscribers express interest in one or more classes, and only receive messages that are of interest, without knowledge of what (if any) publishers there are. This  decoupling  of publishers and subscribers can allow for greater  scalability  and a more dynamic  network topology . Pub/sub is a sibling of the  message queue  paradigm, and is typically one part of a larger  message-oriented middleware  system. Most messaging systems support both the pub/sub and message queue models in their  application programming interface  (API) (e.g.  Java Message Service  (JMS)). In the  point-to-point or queuing model , a  sender  posts messages to a particular queue and a  receiver  reads messages from the queue. Here, the sender knows the destination of the message and posts the message directly to the receiver's queue. It is characterized by the following: Only one consumer gets the message The producer does not have to be running at the time the consumer consumes the message, nor does the consumer need to be running at the time the message is sent Every message successfully processed is acknowledged by the consumer The  publish/subscribe model  supports publishing messages to a particular message topic.  Subscribers  may register interest in receiving messages on a particular message topic. In this model, neither the publisher  nor the subscriber know about each other. A good analogy for this is an anonymous bulletin board. The following are characteristics of this model: Multiple consumers can get the message There is a timing dependency between publishers and subscribers. The publisher has to create a subscription in order for clients to be able to subscribe. The subscriber has to remain continuously active to receive messages, unless it has established a durable subscription. In that case, messages published while the subscriber is not connected will be redistributed whenever it reconnects. Using Java, JMS provides a way of separating the application from the transport layer of providing data. The same Java  classes  can be used to communicate with different JMS providers by using the  JNDI  information for the desired provider. The classes first use a  connection factory  to connect to the queue or topic, and then use populate and send or publish the messages. On the receiving side, the clients then receive or subscribe to the messages.
  • Тут красиво будет разместить картинки + фичи каждого адаптера Также рассказать про фичи каждого и когда какой удобнее использовать MemcacheQ - So we have a limit on the message body size with a max of a bit less than  64K . Redis – 110K SETs/second, 81K GETs/second in an entry level Linux box
  • http://framework.zend.com/wiki/display/ZFPROP/Zend_Queue+-+Justin+Plock
  • Стратегия ,  Strategy  — поведенческий  шаблон проектирования , предназначенный для определения семейства  алгоритмов ,  инкапсуляции  каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путем определения соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм независимо от  объектов -клиентов, которые его используют. Мотивы Программа должна обеспечивать различные варианты алгоритма или поведения Нужно изменять поведение каждого экземпляра класса Необходимо изменять поведение объектов на стадии выполнения Введение интерфейса позволяет классам-клиентам ничего не знать о классах, реализующих этот интерфейс и инкапсулирующих в себе конкретные алгоритмы
  • http://framework.zend.com/manual/en/zend.queue.adapters.html http://rediska.geometria-lab.net/ Любые адаптеры на все случаи жизни  Можно легко переключаться между ними, изменяем только конфиг Apache ActiveMQ – быстрый, расширяемый, удобный, много API (Ajax API, REST) База данных – с использованием Zend_Db – простой вариант с неограниченным местом MemcacheQ - Очередь задач Zend Platform Массив – удобен для тестирования Redis – говорят что очень быстрый
  • Примеры – Прозрачная архивация данных Конвертация JSON данных Снятие огранчения не отправку только текстовых сообщений (возможность отправлять объекты)
  • http://framework.zend.com/manual/en/zend.queue.custom.html
  • Описание системы мониторинга пользователя на сайте И системы подсчёта кликов
  • Напримере турстанка – кеширование блоков Как говорил Илья Lifetime – неделя, но актуальный lifetime – 1day Никаких блокировок, обновление кэша из внешних программ
  • ZFConf 2010: Using Message Queues in Day-to-Day Projects (Zend_Queue)

    1. 1. Использование очередей сообщений в повседневных проектах , Zend_Queue Денис Баклыков , web- разработчик 27 марта 2010 г. Санкт-Петербург
    2. 2. Что такое очереди сообщений ? <ul><li>FIFO   </li></ul><ul><ul><li>Первым пришёл  — Первым ушёл </li></ul></ul><ul><li>Асинхронные сообщения </li></ul><ul><li>Распределённые системы </li></ul><ul><li>Время невидимости ( Visibility timeout ) </li></ul>
    3. 3. Время невидимости
    4. 4. Парадигмы программирования с использование очередей сообщений <ul><li>Плюсы </li></ul><ul><ul><li>Отправитель и получатель не связаны между собой </li></ul></ul><ul><ul><li>расширяемость </li></ul></ul><ul><li>Минусы </li></ul><ul><ul><li>Нет гарантии доставки для отправителя </li></ul></ul><ul><li>point-to-point </li></ul><ul><li>publish/subscribe </li></ul>
    5. 5. MQ серверы <ul><li>MemcacheQ </li></ul><ul><li>Apache ActiveMq </li></ul><ul><li>RabbitMq </li></ul><ul><li>Redis </li></ul><ul><li>Amazon SQS </li></ul><ul><li>PgQ, Oracle Advanced Queuing, </li></ul>
    6. 6. Zend_Queue – История развития <ul><li>Два разработчика: Justin Plock и Daniel Lo </li></ul><ul><li>Как это было: </li></ul><ul><li>3 марта 2008 – Создание Proposal’a в ZF wiki </li></ul><ul><li>27 февраля 2009 – Код отправлен на одобрение сообществу </li></ul><ul><li>9 апреля 2009 – Код готов к добавлению в репозиторий </li></ul><ul><li>31 июля 2009 - Появление в ZF 1.9.0 </li></ul><ul><li>На разработку ушло больше года! </li></ul>
    7. 7. Интерфейс Zend_Queue <ul><li>Использован Паттерн «Стратегия» </li></ul><ul><li>Работа с очередями </li></ul><ul><ul><li>createQueue(), deleteQueue(), isExists() </li></ul></ul><ul><li>Работа с сообщениями </li></ul><ul><ul><li>send(), receive(), deleteMessage() , count() </li></ul></ul>
    8. 8. Адаптеры Zend_Queue <ul><li>Apache ActiveMQ </li></ul><ul><li>База данных – с использованием Zend_Db </li></ul><ul><li>MemcacheQ </li></ul><ul><li>Очередь задач Zend Platform </li></ul><ul><li>PHP Массив </li></ul><ul><li>Amazon MQ </li></ul><ul><li>Redis – библиотека Rediska  </li></ul>
    9. 9. Модифицирование Zend_Queue <ul><li>Что можно модифицировать? </li></ul><ul><li>Почти всё  </li></ul><ul><li>Адаптер </li></ul><ul><li>Класс-итератор для сообщений </li></ul><ul><li>Класс очереди – ( extends Zend_Queue ) </li></ul><ul><li>Класс-обёртка сообщения </li></ul>
    10. 10. Создание собственных адаптеров <ul><li>Реализовать Zend_Queue_Adapter_AdapterAbstract </li></ul><ul><li>receive($n) – получение n сообщений </li></ul><ul><li>send() – отправка сообщения </li></ul><ul><li>isSupported(< имя_функции >)  </li></ul><ul><li>getCapabilities() </li></ul><ul><ul><li>список допустимых операций </li></ul></ul>
    11. 11. Примеры использования очередей сообщений
    12. 12. Многожество последовательных действий <ul><li>Социальные сети - Загрузка фото (видео) </li></ul><ul><ul><li>Сохранение файла </li></ul></ul><ul><ul><li>Запись информации в БД </li></ul></ul><ul><ul><li>Уменьшение размера и создание < превьюшек > </li></ul></ul><ul><ul><li>Обновление новостей </li></ul></ul><ul><ul><li>Рассылка email уведомлений </li></ul></ul>
    13. 13. Классический пример Отправка emails Без использования очередей сообщений
    14. 14. Классический пример Отправка emails С использованием очередей сообщений
    15. 15. Мониторинг активности <ul><li>Поисковые запросы </li></ul><ul><li>Показы товара </li></ul><ul><li>Просмотр детальной информации </li></ul><ul><li>Архитектура: </li></ul><ul><ul><li>8 серверов и 1 база данных </li></ul></ul><ul><ul><li>Real-time подсчёт статистики (почти real-time : ) </li></ul></ul>
    16. 16. Кэширование <ul><li>Стандартное кэширование </li></ul><ul><li>Параметры: </li></ul><ul><li>Время жизни </li></ul><ul><li>if (!($data = $cache->load($id))) { </li></ul><ul><li>// [...] заполнение $ data </li></ul><ul><li>$cache->save($data); </li></ul><ul><li>} </li></ul><ul><li>«Умное» кэширование </li></ul><ul><li>Параметры: </li></ul><ul><li>Реальное время жизни </li></ul><ul><li>Актуальное время жизни </li></ul><ul><li>if (!($data = $cache->load($id))) { </li></ul><ul><li>// [...] заполнение $ data </li></ul><ul><li>$cache->save($data); </li></ul><ul><li>} elseif ($data[‘alifetime’] < time()) { </li></ul><ul><li>$queue->send($name, $params); </li></ul><ul><li>} </li></ul>
    17. 17. Полезные ресурсы <ul><li>Книга Enterprise-Integration-Patterns </li></ul><ul><li>http://memcachedb.org/ memcacheq / </li></ul><ul><li>http://www.rabbitmq.com </li></ul><ul><li>http://activemq.apache.org </li></ul><ul><li>http://code.google.com/p/ redis / </li></ul><ul><li>http:// rediska .geometria-lab.net/ </li></ul><ul><li>http://aws.amazon.com/sqs/ </li></ul>
    18. 18. Спасибо за внимание! Ваши вопросы! Контакты: Email/Jabber: [email_address] Skype: dbaklikov