我们使用RabbitMQ存储我们最终想要存储在SQL Server 数据库中的轻量级消息。有时队列是空的,有时会出现流量高峰 - 30,000 条消息。
我们C# console app
在同一台服务器上运行。
我们是否让控制台应用程序每分钟左右运行一次,并从队列中取出指定数量的项目以插入数据库?(采取可管理的叮咬)
或者
我们是否让控制台应用程序始终“侦听”并在项目进入时将它们敲入数据库?(更激进的方法)
我们使用RabbitMQ存储我们最终想要存储在SQL Server 数据库中的轻量级消息。有时队列是空的,有时会出现流量高峰 - 30,000 条消息。
我们C# console app
在同一台服务器上运行。
我们是否让控制台应用程序每分钟左右运行一次,并从队列中取出指定数量的项目以插入数据库?(采取可管理的叮咬)
或者
我们是否让控制台应用程序始终“侦听”并在项目进入时将它们敲入数据库?(更激进的方法)
我个人会选择第一种方法。在那些“尖峰”时期,您可能会使用 30,000 次插入来锤击数据库。虽然这可能会很快完成(取决于此问题范围之外的许多变量),但我们可以更聪明地做到这一点。
首先,通过定期轮询,您可以从队列中获取“x”消息并一次性将它们批量插入(在性能方面,您可能希望在此处调整 2 个变量...轮询时间和您从中获取的数量队列)。
这种方法的一个问题是,您最终可能会在繁忙时期落后。所以你可以让你的应用程序根据它接收的数量来改变它的轮询时间,同时保持在一些最小/最大阈值之间。例如,如果您突然收到 500 条消息……您可能会减少轮询时间。如果下一次投票,你仍然可以得到一千,再做一次,减少投票时间。随着您能够获得的数量下降,您可以开始在特定阈值下增加轮询时间。
这将为您提供两全其美的恕我直言,并对高峰/平静期做出反应。
这在一定程度上取决于您的要求,但我会创建一个服务,每隔几分钟调用一次 SQLBulkCopy 来进行批量插入。这是迄今为止最快的方法。此外,如果您的 Spike 是 30k 记录,我不会太担心落后。
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 服务,如果服务器重新启动,则可以将服务设置为重新启动。