Я считаю, что вы подходите к решению не с того конца. Вы определенно можете использовать ServiceStack для выполнения вызовов Web Hook — предпочтительно в JSON.
Что вам действительно следует изучить, так это очереди сообщений, поскольку они демонстрируют все характеристики, которые вам потребуются для реализации вызовов веб-перехватчиков (долговечность, политики очистки сообщений, фильтрация сообщений, политики доставки, политики маршрутизации, критерии постановки в очередь).
Подробнее о свойствах очередей сообщений в Википедии
Рабочий процесс, после которого событие будет выполняться до момента вызова веб-хука:
- В системе происходит событие; чтобы обеспечить вызов веб-перехватчика, вы должны поставить событие в очередь для обработки (через служебную шину, такую как RabbitMq, MassTransit, NServiceBus и т. д.). Назовем целевую очередь EventsQueue.
- The application would then connect to the EventsQueue and process the messages by:
- Finding out who has subscribed to this particular event
- Для каждого подписчика поставьте в очередь новое сообщение, содержащее копию данных о событии и сведения о подписчике (например, URL-адрес обратного вызова), в WebHookQueue с начальным временем жизни (как долго сообщение действительно для)
- Затем приложение подключалось к WebHookQueue и обрабатывало сообщения, выполняя обратные вызовы.
Итак, теперь у вас есть базовая система уведомлений, которая должна гарантировать, что сообщение будет доставлено хотя бы один раз.
Вот отличная статья, в которой подробно рассказывается, как использовать TTL (время жизни) для повторной отправки сообщений через определенные промежутки времени
Я бы выбрал несколько иной подход:
- Создайте разные очереди повторных попыток (например, WebHookRetryQueue = WebHookQueue очередь недоставленных сообщений, WebHookRetryLvl1Queue = TTL 5 минут, WebHookRetryLvl2Queue< /em> = TTL 15 минут). Хитрость заключается в том, чтобы установить для очереди недоставленных сообщений этих очередей уровня повтора значение WebHookQueue и оставить сообщения в очереди на истечение срока действия (это означает, что после истечения срока действия сообщения в очереди уровня повтора, он ставится в очередь обратно в WebHookQueue).
- Затем вам нужно будет отслеживать текущий уровень повторной попытки для сообщений в WebHookRetryQueue, а затем поставить сообщение в очередь соответствующего уровня повторной попытки — после истечения срока жизни TTL получает вставлен обратно в WebHookQueue.
Пример рабочего процесса: WebHookQueue с максимальным числом повторных попыток: 2, срок жизни: 1 день
Пример сообщения: {'event_type': 'Email_Reply', 'callback_url': '...', 'reply_level': 0, 'queued_at': '2013-09-25T22:00:00Z' , данные: 'закодировано json'}
Сообщение -> WebHookQueue (сбой) -> WebHookQueue (сбой) -> WebHookRetryQueue (вкл. response_level = 1 + enqueue) -> WebHookRetryLvl1Queue (срок действия 5 минут) -> WebHookQueue (сбой) -> WebHookQueue (сбой) -> WebHookRetryQueue ( incr.reply_level=2 + enqueue) -> WebHookRetryLvl2Queue (срок действия 15 минут) -> WebHookQueue (сбой) -> WebHookQueue (сбой) -> WebHookRetryQueue (удалить сообщение)
Изменить
Нажмите здесь, чтобы просмотреть простой пример использования WebHookQueue и WebHookRetryQueue с использованием сообщения TTL уровня RabbitMQ. Из-за TTL уровня сообщения; нет необходимости создавать разные очереди повторных попыток, что может быть необходимо для менее популярных очередей сообщений.
Если бы вам пришлось реализовать такую очередь с возможностью истечения срока действия отдельных сообщений (не с помощью политик очистки) или заранее запланировать сообщения с возможностью перепланирования/истечения срока действия, вам, скорее всего, пришлось бы выбрать очередь на основе базы данных.
Вот отличная статья на CodeProject о создании таких высокопроизводительная очередь для MSSQL Server (с усилием переносимая на другие базы данных, такие как MySql/Postgresql/Mongodb/Couchbase и т. д.)
Надеюсь, вы нашли эту информацию полезной.
person
Shelakel
schedule
25.09.2013