Помогите мне понять, как работает очередь сообщений - PullRequest
6 голосов
/ 12 февраля 2010

Давным-давно пользуюсь PHP, и мне было интересно, что же такое вся эта «очередь сообщений». Давайте возьмем Facebook для примера. Я могу обновить свой статус, но затем я должен показать, что статус обновляется всем моим друзьям (скажем, у меня есть 3000 подписчиков). Еще больше работы, если есть комментарии, и они должны быть уведомлены всем друзьям, которые оставили комментарий по электронной почте. В примере, который я видел, похоже, что очередь сообщений - это «сообщение» (обновление моего статуса) и помещение его во временное пространство (файловую систему или таблицу БД). Затем у меня есть работа cron, которая вытягивает ее и обновляет мой стол.

С учетом сказанного, как мне манипулировать этими данными? Я думаю, что я запутался в том, как это действительно поможет мне. Как перевести следующую функцию в очередь сообщений, а затем запланировать запуск функции в более позднее время?

1 - обновить мой статус 2 - Теперь опубликуйте это через мою страницу и всех моих друзей. 3 - Если комментарий оставлен, отправьте этот последний комментарий по электронной почте тем, кто «подписался» на этот комментарий.

У меня вопрос, как мне манипулировать этими данными? Должен ли я просто вставить «комментарий», а затем «задание», которое извлекает этот комментарий и подключает его к функции, которая его обрабатывает?

Вот пример, который я планирую изучить.

http://www.freeopenbook.com/php-hacks/phphks-CHP-5-SECT-18.html

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

У меня вопрос, как мне манипулировать этими данными? Я просто вставляю «комментарий», то есть «работа» что вытаскивает этот комментарий и подключи это в функцию, которая обрабатывает его?

Точно.

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

В отличие от этого, отправка уведомлений об обновлениях по электронной почте является отличным кандидатом в очередь сообщений.

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

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

1 Оказывается, вы можете найти много полезной информации об архитектуре Facebook в Почему Facebook, Digg и Twitter так трудно масштабировать? при высокой масштабируемости.

2 голосов
/ 12 февраля 2010

Должен ли я просто вставить «комментарий», а затем «задание», которое извлекает этот комментарий и подключает его к функции, которая его обрабатывает?

Одной из точек с очередями сообщений является разделение служб и асинхронная обработка.

У вас будет запущена служба очереди сообщений, когда кто-то изменит свой статус, вы отправите сообщение в определенную очередь. Вы можете сделать это из кода php, который запускается, когда пользователь меняет свой статус.

Тогда у вас где-нибудь будет выполняться сервисное / фоновое задание, которое извлекает сообщения из этой очереди. Конечно, это было бы нечто внешнее для процесса PHP, который отправлял сообщение на основе HTTP-вызова. Это задание извлекает сообщения из очереди, выполняет обработку сообщений, например, выясняет, кому отправлять почту, а затем отправляет почту.

Теперь у вас есть гибкий способ обрабатывать такие почтовые обновления.

  • Служба обновления почты будет довольно легко работать на другом компьютере, чем веб-сервер.
  • Проще масштабировать, если вам нужно больше энергии.
  • Вы могли бы легче реализовать отложенную отправку - например, вы можете подождать минуту или две с отправкой письма, и если пользователь снова обновляет свой статус, вы отправляете только 1 письмо, а не 2
  • Если бы вы сделали все это в запросе http пользователя, который изменил его статус, ему пришлось бы ждать, пока вся эта обработка не будет завершена.
...