我在Azure的服务总线上有一个主题订阅,锁定持续时间为30秒并启用了会话。
我正在使用逻辑应用程序使用峰值锁定来获取有关主题的消息,因为我关心消息的处理顺序。我想确保所有具有相同会话ID的消息均按照添加到总线(即FIFO)的顺序进行处理。
下面是一个简单的逻辑应用程序的屏幕截图,该应用程序在消息到达时(五秒钟的轮询锁定)被触发,然后等待15秒,然后再完成消息。
当我在该主题上加载10条消息时,逻辑应用程序的第一个实例将按您期望的方式触发,并在大约15秒内完成,但是第二个逻辑应用程序在另外15秒(即30秒内)内不会启动第一个逻辑应用程序启动后的总数(锁定持续时间的长度)。
我读过的所有内容都表明,完成一条消息应立即释放锁,但事实并非如此。我是在做错什么,还是工作的方式?
答案 0 :(得分:1)
我读过的所有内容都建议完成一条信息 立即释放锁,但事实并非如此。 我是在做错什么,还是工作的方式?
LockDuration指示一个队列(毕竟订阅是一个队列),使竞争的使用者看不到消息,以确保当前的处理节点可以在LockDuration定义的时间范围内处理它。更新锁定机制可确保扩展对当前正在处理的消息的锁定,以便在需要时允许比LockDuration处理时间更长的时间。要记住的重要一件事,不能保证锁更新成功。
场景1 :
但是,我尝试复制您的工作流,但主题订阅锁定持续时间有2分钟的细微变化(以查看LockDuration属性是否影响LA触发器),并手动提供了SessionID。以下是我的测试结果。
从上面的图像中,您可以看到在完成第一个实例后立即启动的Logic App触发器的第二个实例。
方案2: 在这种情况下,我保持了相同的配置,但是将SessionId更改为“ NextAvailable ”。现在,Logic App触发器将等待整个锁定持续时间(2分钟,有时甚至更长)并触发下一个实例。
最后,如果您的消息具有相同的会话ID,并且在LA UI中将会话ID配置为“下一个可用”,则它将在整个LockDuration时间范围内锁定消息。如果要避免这种情况,则需要在客户端“关闭队列中的会话”。这将立即释放锁并立即处理下一个实例。