我正在一个使用Push Sharp发送多个推送通知的系统上。
我当前的设计有两个Service Bus Queue和两个Cloud Worker角色。
当用户想要广播通知时,ASP.Net Web App会将一条消息插入到消息队列中,然后由工作人员#1读取。工人#1确定通知所针对的设备(以1000s为单位)。对于每个设备,工作人员1将一条消息放入Notification-Queue,这是使用Batching完成的,因此它的速度非常快。
2号工作人员在Notification-Queue上读取消息,并使用Push Sharp发送实际的通知。
如果工作者#2出了问题,消息将被放弃并最终被重新处理,因此我很高兴这部分是可靠且持久的。
我关心的是工人#1。如果在将消息放入Notification-Queue时失败,它将放弃该消息并重试。这可能导致同一条通知多次进入Notification-Queue,导致人们在其设备收到多个警报时感到烦恼。
我正在考虑使用数据库来跟踪哪些设备已排队等待哪些通知,因此如果工作人员#1不会将通知排队。显然,这将给1号工人增加瓶颈。理想的解决方案是将写入到Notification-Queue的写入包装在一个事务中,但是Service Bus在单个事务中仅允许100条消息。
我发现了很多有关使消息成为幂等的建议,但是找不到将其应用于我的情况的方法。
我想确保无论发生什么情况,特定消息仅发送到特定设备一次。任何建议或设计模式建议都将受到欢迎!
最佳答案
如果发件人可以始终为该消息生成相同的消息ID,则Service Bus为您提供一项功能:重复检测。
它由RequiresDuplicateDetection标志启用,并由DuplicateDetectionHistoryTimeWindow进一步控制
如果在给定的时间窗口中再次看到相同的MessageId,我们将丢弃第二条消息。
关于c# - 防止在松散耦合的系统中多次执行操作的策略(使用Azure Service Bus和Cloud Workers),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33011710/