当前位置:  开发笔记 > 数据库 > 正文

数据库队列和队列处理

如何解决《数据库队列和队列处理》经验,为你挑选了1个好方法。

我目前正在为基于分布式事件的系统组建一个参考体系结构,其中事件使用普通旧表(没有SQL Server Service Broker)存储在SQL Server Azure数据库中.

将使用工作者角色处理事件,工作者角色将轮询队列以获取新的事件消息.

在我的研究中,我看到许多解决方案允许多个处理器处理队列中的消息.我遇到的很多模式的问题是当多个进程试图访问单个消息队列时管理锁定等的复杂性.

我知道传统的队列模式是从一​​个队列中拉出多个处理器.但是,假设可以按任何顺序处理事件消息,是否有任何理由不在队列与其队列处理器之间创建一对一关系,只是在不同队列之间进行负载平衡?

queue_1 => processor_1
queue_2 => processor_2

此实现避免了管理跨多个处理器的队列并发访问所需的所有管道.事件发布者可以使用任何负载平衡算法来决定将消息发布到哪个队列.

事实上,我在任何搜索中都没有看到这种实现,这让我觉得我忽略了这个设计中的一个主要缺陷.

编辑

这篇文章引发了关于使用数据库表作为队列与MSMQ,Azure队列等的争论.我理解我可以使用许多本机排队选项,包括Azure AppFabric中的持久消息缓冲区.我已经评估了我的选项,并确定SQL Azure表就足够了.我的问题是讨论针对单个队列使用多个处理器而不是每个队列使用一个处理器.



1> Remus Rusanu..:

有关此主题的更详细讨论,请参阅将表用作队列.问题不仅在于您如何访问"队列",还在于如何对其进行索引,聚集索引必须允许直接搜索下一行才能出列,否则您将不断陷入僵局.

您希望您的处理器竞争到同一队列,通过扩展到不同的队列来实现负载平衡是一种反模式.它导致了车队和人工延迟,你有一些项目排在后期处理器后面,但其他处理器是空闲的,因为他们的队列是空的.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有