我在服务总线主题上有一个启用会话的订阅,并且有四个订阅客户端针对此订阅运行。
我在100000个随机会话中向主题发布了10000条消息,查看输出,我可以看到多个订阅客户端在几秒钟内处理同一个会话ID的消息,即
| 会话标识|客户端A|客户端B|
| - -|- -|- -|
| 小行星一千二百三十四|处理时间10:30:04||
| 小行星一千二百三十四||在10:30:29处理|
| 小行星一千二百三十四|在10:31:00处理||
这是在会话空闲超时默认值为60秒的情况下完成的。
然后,我将会话空闲超时设置为2秒的时间跨度。每个SessionProcessor
有100个MaxConcurrentSessions
,并将AutoCompleteMessages
设置为false。
我还观察到很多“会话锁定丢失”的错误。
当我收到会话锁定异常时,该会话将在另一个客户端上启动,并在第二个客户端上处理已在发生会话锁定异常的客户端上处理过的同一消息。
我的问题是,在尝试在ProcessSessionMessageEventArgs
上调用CompleteMessageAsync
之前,我是否需要记录已处理的消息ID,以便我可以检查正在使用的每条消息,以避免再次处理它,或者是否有我不知道的原因导致我的会话丢失会话锁-当在调用CompleteMessageAsync
之前已经超过会话空闲时间时,是否会发生这种情况?
这都是在测试代码,所以我的处理器只是写控制台和做非长期运行的任务。
1条答案
按热度按时间ulmd4ohb1#
使用主题时,消息将被复制并转发到所有订阅,在这些订阅中,接收方可以看到会话。
如果您不希望所有接收者都处理每个会话,那么您应该只使用一个队列,让所有接收者都监听它。这样每个会话及其消息集只会被其中一个接收者处理一次。