使用ServiceStack实现WebHooks

时间:2013-08-23 13:41:55

标签: rest servicestack webhooks redismqserver

我目前正在开发一项REST服务,允许控制和监控一些物理设备。

相应的REST API主要基于您可以在以下文章中找到的原则和想法:“Controlling and Monitoring Devices with REST”。

受监控和受控设备可以生成客户端必须能够订阅的一些事件。我的想法是使用RESTful WebHooks实现该部分。

因此,每当发生事件时,我的服务都会向每个订阅者发出REST API回调,以便通知它。

我的问题,现在:

使用ServiceStack(版本3.9.71 )实现此方案的正确方法是什么?

我的服务必须能够将订阅排队并将事件分派给订阅者。它还必须处理客户端关闭或无法访问的情况,并可能重试发送通知。

我是否必须从头开始实现所有内容(例如,使用托管的RedisMqServer ServiceStack)或者是否已经在我的方向上进一步发展?我在Google上搜索得不太成功。

2 个答案:

答案 0 :(得分:5)

我相信你正在从错误的一端接近解决方案。您绝对可以使用ServiceStack进行Web Hook调用 - 最好是使用JSON。

你应该关注的是Message Queues,因为它们展示了实现Web Hook调用所需的所有特性(持久性,消息清除策略,消息过滤,交付策略,路由策略,排队标准)

Read more about the properties of message queues on Wikipedia

事件的工作流程将跟随调用Web Hook的点:

  1. 系统中发生事件;为了确保调用Web Hook,您必须持久地将事件排入队列(通过服务总线,如RabbitMq,MassTransit,NServiceBus等)。让我们调用目标队列 EventsQueue
  2. 然后,应用程序将连接到 EventsQueue 并通过以下方式处理消息:
    1. 找出谁订阅了这个特定的活动
    2. 对于每个订阅者将包含事件数据副本和订阅者详细信息(例如回调网址)的新邮件排入 WebHookQueue ,并带有初始生存时间(消息有效期多长时间)
  3. 然后,应用程序将连接到 WebHookQueue 并通过回调处理消息。
  4. 所以现在你有了一个基本的通知系统,可以确保消息至少传递一次。

    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',数据:'json encoded'}

    消息 - > WebHookQueue(失败) - > WebHookQueue(失败) - > WebHookRetryQueue(incr.responment_level = 1 + enqueue) - > WebHookRetryLvl1Queue(5分钟到期) - > WebHookQueue(失败) - > WebHookQueue(失败) - > WebHookRetryQueue(incr.responment_level = 2 + enqueue) - > 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.由于消息级别为TTL;没有必要创建不同的重试级别队列 - 这可能是功能较少的消息队列所必需的。


    如果你必须实现这样一个能够使单个消息过期(不是通过清除策略)或者提前安排消息并重新安排/过期的队列 - 你很可能不得不选择基于数据库的排队。

    Here's a great article on CodeProject on building such a high performance queue for MSSQL Server(可轻松移植到其他数据库,如MySql / Postgresql / Mongodb / Couchbase等)

    希望您发现此信息有用。

答案 1 :(得分:2)

ServiceStack.Webhooks是一个新的框架,可以轻松地将webhook添加到您的服务中,无论您想要使用哪种架构模式。 你可以建立自己的插件。