我目前正在为基于事件的分布式系统构建参考架构,其中事件使用普通的旧表(没有 SQL Server 服务代理)存储在 SQL Server Azure 数据库中。
事件将使用将轮询队列以获取新事件消息的工作角色进行处理。
在我的研究中,我看到了许多允许多个处理器处理队列外消息的解决方案。我看到的许多模式的问题是当多个进程试图访问单个消息队列时,管理锁定等增加了复杂性。
我知道传统的队列模式是从一个队列中拉出多个处理器。但是,假设可以按任何顺序处理事件消息,是否有任何理由不在队列与其队列处理器之间创建一对一的关系并在不同队列之间进行负载平衡?
队列_1 => 处理器
_1 队列_2 => 处理器_2
此实现避免了管理跨多个处理器对队列的并发访问所需的所有管道。事件发布者可以使用任何负载平衡算法来决定将消息发布到哪个队列。
事实上,我在任何搜索中都没有看到这种实现,这让我觉得我忽略了这个设计中的一个主要缺陷。
编辑
这篇文章引发了关于使用数据库表作为队列与 MSMQ、Azure 队列等的争论。我知道有许多本机队列选项可供我使用,包括 Azure AppFabric 中的持久消息缓冲区。我已经评估了我的选项并确定 SQL Azure 表就足够了。我的问题的目的是讨论对单个队列使用多个处理器与每个队列一个处理器。