我目前正在开发一项REST服务,允许控制和监控一些物理设备。
相应的REST API主要基于您可以在以下文章中找到的原则和想法:“Controlling and Monitoring Devices with REST”。
受监控和受控设备可以生成客户端必须能够订阅的一些事件。我的想法是使用RESTful WebHooks实现该部分。
因此,每当发生事件时,我的服务都会向每个订阅者发出REST API回调,以便通知它。
我的问题,现在:
使用ServiceStack(版本3.9.71 )实现此方案的正确方法是什么?
我的服务必须能够将订阅排队并将事件分派给订阅者。它还必须处理客户端关闭或无法访问的情况,并可能重试发送通知。
我是否必须从头开始实现所有内容(例如,使用托管的RedisMqServer ServiceStack)或者是否已经在我的方向上进一步发展?我在Google上搜索得不太成功。
答案 0 :(得分:5)
我相信你正在从错误的一端接近解决方案。您绝对可以使用ServiceStack进行Web Hook调用 - 最好是使用JSON。
你应该关注的是Message Queues,因为它们展示了实现Web Hook调用所需的所有特性(持久性,消息清除策略,消息过滤,交付策略,路由策略,排队标准)
Read more about the properties of message queues on Wikipedia
事件的工作流程将跟随调用Web Hook的点:
所以现在你有了一个基本的通知系统,可以确保消息至少传递一次。
Here's a great article detailing how to use TTL (Time To Live) to retry messages at intervals
我会采取一种不同的方法:
示例工作流程: 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添加到您的服务中,无论您想要使用哪种架构模式。 你可以建立自己的插件。