2013-08-23 5 views
10

В настоящее время я работаю над сервисом REST, позволяющим контролировать и контролировать некоторые физические устройства.Реализация WebHooks с ServiceStack

Соответствующий REST API в основном основан на принципах и идеях, которые вы можете найти в следующей статье: «Controlling and Monitoring Devices with REST».

Контролируемые и контролируемые устройства могут генерировать некоторые события, на которые клиенты могут подписаться. Моя идея состояла в том, чтобы реализовать эту часть, используя RESTful WebHooks.

Таким образом, всякий раз, когда возникает событие, моя служба делает обратный вызов REST API каждому подписчику, чтобы уведомить об этом.

Мой вопрос теперь:

Что бы надлежащим образом реализовать этот сценарий, используя ServiceStack (версия 3.9.71)?

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

Должен ли я реализовать все с нуля (используя, например, ServiceStack, размещенный RedisMqServer), или есть уже что-то, что идет дальше в моем направлении? Я без проблем обошел гугл.

ответ

5

Я считаю, что вы приближаетесь к решению с неправильного конца. Вы можете определенно использовать ServiceStack для создания вызовов Web Hook - желательно в JSON.

То, что вы действительно должны смотреть на это Очередь сообщений, так как они обладают всеми характеристиками, вам потребуется для реализации Web Hook вызовов (прочностный, сообщение продувки политики, фильтрации сообщений, осуществления политики, политика маршрутизации, очереди критерии)

Read more about the properties of message queues on Wikipedia

Рабочий процесс событие будет следовать до того момента, когда веб-Hook называется:

  1. событие происходит в системе; для обеспечения того, что будет вызываться веб-хук, вам необходимо долгое время выставлять событие для обработки (через служебную шину, такую ​​как RabbitMq, MassTransit, NServiceBus и т. д.). Назовое целевой очередь EventsQueue
  2. Приложение будет затем подключиться к EventsQueue и обрабатывать сообщения от:
    1. Выяснить, кто подписался на данное мероприятие
    2. Для каждого абонента Ставить в новое сообщение, содержащее копию данных о событиях и данных абонента (например, обратный URL-адрес) до WebHookQueue с начальным временем жизни (на какое время это сообщение действительно)
  3. Приложение затем подключится к WebHookQueue и обработает сообщения, выполнив обратные вызовы.

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

Here's a great article detailing how to use TTL (Time To Live) to retry messages at intervals

Я бы несколько иной подход:.

  • Создание различных очередей уровня повторных попыток (бывший WebHookRetryQueue = WebHookQueue мертв письма очереди, WebHookRetryLvl1Queue = TTL 5 минут, WebHookRetryLvl2Queue = TTL 15 минут). Хитрость заключается в том, чтобы установить этот повтор очереди недоставленных очереди уровня к WebHookQueue и в Оставлять сообщения в очереди истечь (то есть, как только сообщение истекает в очереди уровня повторных попыток, он помещён обратно в WebHookQueue).
  • Затем нужно будет следить за текущим уровнем повторных попыток на сообщения в WebHookRetryQueue, а затем поставить в очередь сообщение о соответствующей очереди уровня повторных попыток - после чего TTL истекает Вставляется обратно в WebHookQueue ,

Пример рабочий процесс: WebHookQueue с МАКС.ПОПЫТКОМ: 2, TTL: 1 день

Пример сообщение: { 'event_type': 'Email_Reply', 'callback_url':»... ',' reply_level ': 0,' queued_at ':' 2013-09-25T22: 00: 00Z ', data:' json encoded '}

Сообщение -> WebHookQueue (fail) -> WebHookQueue (fail) -> WebHookRetryQueue (incr. Reply_level = 1 + enqueue) -> WebHookRetryLvl1Queue (5 минут-expire) -> WebHookQueue (fail) -> WebHookQueue (сбой) -> WebHookRetryQueue (incr. reply_level = 2 + Епдиеие) -> WebHookRetryLvl2Queue (15 мин-истекают) -> WebHookQueue (обязательно) -> WebHookQueue (обязательно) -> WebHookRetryQueue (падение сообщений)


Редактировать

Click here to look at simple example using a WebHookQueue and a WebHookRetryQueue using message level TTL's of RabbitMQ. Due к уровню TTL сообщений; нет необходимости создавать разные очереди очередей повторных попыток, которые могут потребоваться для менее популярных очередей сообщений.


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

Here's a great article on CodeProject on building such a high performance queue for MSSQL Server (переносимый на другие базы данных, такие как MySql/Postgresql/MongoDB/Couchbase и т.д. с усилием)

Надеется, что вы нашли эту информацию полезной.

1

ServiceStack.Webhooks - это новая структура для простого добавления веб-узлов в ваши службы, независимо от того, какой архитектурный шаблон вы хотите использовать. Вы можете просто создать свой собственный плагин.