在SQL Server中使用多个写入程序和一个读取器对消息进行排队的最佳方法

在SQL Server中使用多个写入程序和一个读取器对消息进行排队的最佳方法,sql,message-queue,service-broker,Sql,Message Queue,Service Broker,我希望创建一个队列,在这个队列中,许多计算机都在写入,但每台计算机一生中只写入一次。你认为实现这一目标的最佳方式是什么 我读过有关SQL Server队列、用作队列或ServiceBroker基础结构的SQL Server表的内容 SQL Server表:非常容易创建,但我担心性能 ServiceBroker:更复杂的基础架构。看起来你必须在发送者身上运行一个服务,并且有一个发送队列,这在我的例子中是没有用的,因为所有的发送者在他们的一生中只发送一条消息 在我的情况下,哪种解决方案是最好的?

我希望创建一个队列,在这个队列中,许多计算机都在写入,但每台计算机一生中只写入一次。你认为实现这一目标的最佳方式是什么

我读过有关SQL Server队列、用作队列或ServiceBroker基础结构的SQL Server表的内容

  • SQL Server表:非常容易创建,但我担心性能
  • ServiceBroker:更复杂的基础架构。看起来你必须在发送者身上运行一个服务,并且有一个发送队列,这在我的例子中是没有用的,因为所有的发送者在他们的一生中只发送一条消息

在我的情况下,哪种解决方案是最好的?

您不必在每台计算机上创建服务。ServiceBroker对象可以限制在一台DB服务器上。例如,如果您有100台计算机需要删除一条消息,它们将需要一个到数据库服务器的连接字符串,并执行一个存储过程,将所述消息排入队列。

这就是说,服务代理队列似乎是一种过激的手段。一个简单的表可能就足够了,甚至更好的是一个MSMSQ(这将消除连接到DB的需要)。

我们的生产代码使用表作为队列。我们并不真的需要ServiceBroker的健壮性,而且我们所有的代码都已经连接到数据库,用于其他用途

我们的代码每秒不需要超过几百个事务,而且我已经证明我们的队列每秒可以实现超过10k个事务,所以我对性能相当满意

下面是一篇介绍如何设计用作队列的表的精彩文章:

如果不先看一下,我不会设计你的桌子


我们公司也在考虑一种替代队列策略,该策略涉及Redis,不需要磁盘访问,因为我们正在考虑一种设计,该设计每秒需要数十或几十万次插入,但不必担心在发生故障时丢失数据。如果您需要吞吐量,我也会考虑这些方法。

也许更好的方法是将整个系统从“几个编写器和一个读卡器”转换为“一个编写器和一个读卡器”?我的意思是,你可能会提供一些服务(网络或任何其他服务),这些服务将接收写入请求,并且是数据库中唯一的写入者。这是一般情况,有许多标准解决方案