如何实现监听Azure Service Bus的后台服务支持定时调度触发
可行方案汇总
根本不需要额外部署独立服务,也不存在过度设计的问题,两个完全轻量的方案可以直接用:
方案1:利用Service Bus原生计划消息实现零额外资源调度
这是成本最低、完全不需要新增任何Azure资源的方案,全靠你现有工作程序+Service Bus原生能力就能实现:
- Service Bus原生支持定时投递消息,发送消息时只要给消息设置
ScheduledEnqueueTimeUtc属性,消息就会在你指定的时间才会投递到队列被监听到,不需要任何额外调度组件 - 实现逻辑非常简单:
- 服务启动时,先检查当前监听的队列/主题里,是否存在标记为「每日定时触发」、且计划投递时间在未来24小时内的消息,如果没有就发送一条该类型的消息,投递时间设为你需要的每日执行时间点
- 当工作程序监听到这条定时触发消息时,先执行你预设的每日自动任务,任务执行完成后,立刻再发送一条下一日同时间投递的同类型定时消息,形成自循环
- 多实例部署的场景下,只要给这类定时消息设置唯一的消息标识,每次发送前先查询队列中是否已存在未投递的同标识消息,存在就跳过发送,完全不会出现重复触发的问题
- 这个方案没有任何额外资源开销,调度可靠性和你现有Service Bus消息的可靠性完全一致,不需要维护任何额外逻辑。
方案2:消耗层Logic Apps零代码实现调度
如果你不想在现有工作程序里加自循环调度的逻辑,也完全没必要写Function或者独立服务:
- 直接创建消耗计费模式的Logic App,用内置的「重复」触发器,可视化配置每日固定时间触发即可,不需要写任何代码
- 触发器后续直接绑定内置的「向Service Bus发送消息」操作,配置好你现有队列/主题的连接信息,定时发送触发消息就行
- 这个方案的成本几乎可以忽略,单每日一次的触发频率,每月产生的费用不到1毛钱,不需要你维护任何计算资源,可用性由Azure平台保障,比自己写调度服务可靠得多。
不推荐在后台工作程序里直接开内置定时器实现定时触发:多实例部署时会出现重复执行的问题,一旦服务实例异常重启、宕机,定时器就会失效漏触发,可靠性没有保障。
内容的提问来源于stack exchange,提问作者David Mason
相关产品推荐
相关产品推荐

