我正在研究我们分布式系统中的 Azure 服务总线主题和订阅。我想控制在任何给定时间可以处理的消息数量。比如说,我们说生产中有 5 个节点,我知道我可以在创建订阅者时指定最大并发调用数。所以如果我给它一个值 1,我将被限制在环境中的活动节点的数量。
想知道是否有办法进一步限制它。例如,一次只处理来自订阅的一条消息,即使有活动的空闲侦听器在等待工作。
TIA
我正在研究我们分布式系统中的 Azure 服务总线主题和订阅。我想控制在任何给定时间可以处理的消息数量。比如说,我们说生产中有 5 个节点,我知道我可以在创建订阅者时指定最大并发调用数。所以如果我给它一个值 1,我将被限制在环境中的活动节点的数量。
想知道是否有办法进一步限制它。例如,一次只处理来自订阅的一条消息,即使有活动的空闲侦听器在等待工作。
TIA
根据您的描述,这听起来更像是服务总线队列的用例(如果您还没有探索过它)。这里有一个相关的问题https://stackoverflow.com/a/53277505/5344880
但只是一个想法,即使在队列中,当正在处理消息(获取锁)时,其他侦听器将能够选择下一条消息。因此,为了限制这一点,您可能有另一个队列,在任何时间点都只有一条消息,并且所有侦听器都在收听此消息。一旦你的任何一个听众锁定了这个,其他听众,即使是免费的,也没有任何事情要处理。
有关服务总线队列的更多信息,https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-queues-topics-subscriptions
我对此进行了更多试验,最终使用了 sessionIds。我正在为 sessionId 设置硬编码值。因此,即使有多个符合条件的订阅者可以处理此消息,也只有一个会获得会话锁并处理它。一旦完成处理,我通过关闭会话来释放锁定,以便任何处理器都可以接收新消息。我唯一关心的是,在消息处理完成后关闭会话有什么缺点吗?