防止在松散耦合系统中执行多次操作的策略(使用Azure服务总线和Cloud Workers)

本文关键字:服务 Azure 使用 总线 Workers Cloud 策略 松散耦合系统 执行 操作 | 更新日期: 2023-09-27 18:16:32

我正在开发一个使用push Sharp发送多个推送通知的系统。

我目前的设计有两个服务总线队列和两个云工作者角色。

当用户想要广播通知时,ASP。Net Web应用程序将一条消息插入消息队列,由Worker #1读取。工作者#1确定通知所针对的设备(考虑1000个)。对于每个设备,Worker #1将一条消息放入通知队列,这是使用批处理完成的,所以它非常快。

Worker #2读取notification - queue上的消息并使用Push Sharp发送实际的通知。

如果在Worker #2中出现问题,消息将被放弃并最终重新处理,所以我很高兴这部分是可靠和持久的。

我关心的是工人1号。如果在将消息放入Notification-Queue时失败,它将放弃该消息并再次尝试。这可能会导致相同的通知多次进入通知队列,导致人们在他们的设备收到多个警报时感到恼火。

我正在考虑使用一个数据库来跟踪哪些通知已经为哪个设备排队,所以Worker #1不会排队通知,如果它已经这样做了。这显然会给工人1增加一个瓶颈。理想的解决方案是在事务中包装对通知队列的写操作,但是服务总线在单个事务中只允许100条消息。

我发现了很多关于使消息幂等的建议,但找不到一种方法将其应用于我的情况。

我想确保无论发生什么,一个特定的消息只发送到一个特定的设备一次。欢迎提出任何建议或设计模式建议!

防止在松散耦合系统中执行多次操作的策略(使用Azure服务总线和Cloud Workers)

如果发送方能够始终如一地为消息生成相同的消息id,那么Service Bus为您提供了一个功能:重复检测。

它由RequiresDuplicateDetection标志启用,并由DuplicateDetectionHistoryTimeWindow进一步控制

如果在给定的时间窗口中再次看到相同的MessageId,则丢弃第二条消息。