使用ServiceStack实现WebHooks

Dav*_*ant 10 rest webhooks servicestack redismqserver

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

相应的REST API主要基于您可以在以下文章中找到的原则和想法:" 使用REST控制和监视设备 ".

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

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

我的问题,现在:

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

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

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

She*_*kel 5

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

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

阅读有关Wikipedia上消息队列属性的更多信息

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

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

所以现在你有一个基本的通知系统,应该确保消息至少传递一次.

这是一篇很好的文章,详细介绍了如何使用TTL(生存时间)间隔重试消息

我会采取一种不同的方法:

  • 创建不同的重试级别队列(例如,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编码' }

消息 - > WebHookQueue(失败) - > WebHookQueue(失败) - > WebHookRetryQueue(增量reply_level = 1 +排队.) - > WebHookRetryLvl1Queue(5分钟-到期) - > WebHookQueue(失败) - > WebHookQueue(失败) - > WebHookRetryQueue( INCR reply_level = 2 +排队) - > WebHookRetryLvl2Queue(15分钟-到期) - > WebHookQueue(失败) - > WebHookQueue(失败) - > WebHookRetryQueue(降消息)


编辑

点击这里使用简单,在例子来看看WebHookQueueWebHookRetryQueue使用RabbitMQ的消息TTL电平的.由于消息级别TTL; 没有必要创建不同的重试级别队列 - 这对于功能较少的消息队列可能是必需的.


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

这是关于CodeProject的一篇很棒的文章,关于为MSSQL Server构建这样一个高性能队列(可以轻松地移植到其他数据库,如MySql/Postgresql/Mongodb/Couchbase等)

希望您发现此信息有用.