从队列中抓取项目时的数据库插入性能

本文关键字:数据库 插入 性能 项目 队列 抓取 | 更新日期: 2023-09-27 18:25:29

我们使用RabbitMQ来存储轻量级消息,这些消息最终要存储在SQL Server数据库中。有时队列是空的,有时流量会激增——30000条消息。

我们有一个C# console app在同一台服务器上运行。

我们是否每隔一分钟左右运行一次控制台应用程序,并从队列中提取指定数量的项目插入数据库?

我们有控制台应用程序总是"监听"并在项目进入数据库时将其锤入数据库吗?(更激进的方法)

从队列中抓取项目时的数据库插入性能

就我个人而言,我会选择第一种方法。在这些"尖峰"时期,您将用可能30000个插入来敲打数据库。虽然这可能会很快完成(取决于这个问题范围之外的许多变量),但我们可以做得更聪明一点。

首先,通过定期轮询,您可以从队列中获取"x"条消息,并一次性大容量插入它们(从性能角度来看,您可能需要调整这里的2个变量…轮询时间和从队列中提取的数量)。

这种方法的一个问题是,在繁忙时期你可能会落后。因此,您可以根据收到的数量更改应用程序的轮询时间,同时保持在一些最小/最大阈值之间。例如,如果你突然收到一个尖峰并抓取500条信息。。。你可能会减少投票时间。如果下一次投票,你仍然可以得到一千,再做一次,减少投票时间。随着你能得到的数字下降,你可以开始在特定阈值下增加你的轮询时间。

这将给你带来两全其美的imho,并对峰值/间歇期做出反应。

这在一定程度上取决于您的需求,但我会创建一个服务,每隔几分钟调用SQLBulkCopy进行大容量插入。这是迄今为止最禁食的方法。此外,如果你的斯派克是3万的记录,我不会太担心落后。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

我们有一个C#控制台应用程序在同一台服务器上运行。

为什么不提供服务?

我要做的是让控制台应用程序始终侦听rabbitmq.然后在控制台应用程序中构建自己的队列以插入数据库,这样就可以限制数据库插入。通过这样做,你可以在繁忙的时候通过一次只允许这么多任务来控制流量,然后在缓慢的时候,你会得到比每隔一段时间轮询更快的反应。我这样做的方法是引发一个事件,你知道队列中有事情要做,你可以检查队列长度,看看你想处理多少事务。

您可以设置Windows服务,而不是使用控制台应用程序,并在服务上设置计时器,每隔n分钟轮询一次。看看下面的链接:

http://www.codeproject.com/Questions/189250/how-to-use-a-timer-in-windows-service

http://msdn.microsoft.com/en-us/library/zt39148a.aspx

对于Windows服务,如果服务器重新启动,则可以将服务设置为重新启动。