我正在一个使用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/

10-13 09:00