本页介绍如何使用 Azure 服务总线中的会话将来自同一源的消息分组到相同的接收器中。
在无会话队列处理器中,我可以控制可以并行获取的消息数量:
new OnMessageOptions { MaxConcurrentCalls = 10 };
Run Code Online (Sandbox Code Playgroud)
如果我传递这些选项,则同时处理的消息不会超过 10 条。
现在,对于会话式处理器,选项被替换为
new SessionHandlerOptions { MaxConcurrentSessions = 10 };
Run Code Online (Sandbox Code Playgroud)
其含义不同,即同时进行的会话不超过 10 个。
我的会话寿命相对较长,而且大部分都是空闲的,因此我必须将此参数设置为较高的值。但是,我仍然想限制并行消息的数量。
这可以开箱即用吗?
MaxConcurrentSessions
如果我设置为,并行化的实际限制是什么int.MaxValue
?
小智 7
我相信您可能误解了会话的概念。
将会话视为子队列,例如,如果您有一个名为Q1的队列,您的发布者将新的100 条消息写入每个不同的会话标识符(例如 - s1、s2、s3、s4、s5、s6、s7 、s8、s9、10(为了简单起见),您在Q1中总共有1000 条消息,但每个会话仅保存100 条消息。
从上面的场景来看,您的客户端将运行MaxConcurrentSessions = 10,这意味着它将为所有会话 s1->s10有一个专用接收器,它将按顺序处理每个会话中的消息,直到会话没有更多消息要处理,之后它将处于空闲状态,等待新消息到达或SessionIdleTimeout过去,此时它将删除会话。
配置基于会话的客户端时,确定SessionIdleTimeout非常重要,因为这将决定客户端删除没有消息的会话并可用于拾取新会话的速度。在下面的示例中,我尝试表示在MaxConcurrentSessions=5和更加分布式的消息计数下运行的系统的起点是什么
当s3耗尽 14 条消息时,假设我们的 SessionIdleTimeout为10s ,您的函数的s3会话处理器将闲置等待10 秒,如果s4没有新消息到达,它将丢弃s3会话处理器并获取新的会话处理器s6->s10中的任何一个。
冲洗并重复,直到所有疗程都排空!;-)
从文档中:
单个接收进程可以轻松处理大量并发会话,特别是当它们是用严格异步代码编写时;使用回调模型自动有效地处理数十个并发会话。
如果您有多个长期会话:
处理大量并发会话(每个会话仅偶尔接收消息)的策略是,处理程序在一段空闲时间后删除会话,并在下一个会话到达时接受会话时再次开始处理。
归档时间: |
|
查看次数: |
5640 次 |
最近记录: |