我们使用RabbitMQ来存储轻量级消息,我们最终希望将这些消息存储在 Server数据库中。有时队列是空的,有时是流量激增-- 30,000条消息。
我们有一个C# console app运行在同一台服务器上。
我们是否每分钟运行一次控制台应用程序,并从队列中抓取指定数量的项目以插入数据库?(咬一口)
或
我们是否有控制台应用程序总是“监听”和锤子进入数据库的项目,当他们进来?(更具侵略性的方法)
发布于 2013-07-30 18:00:41
就我个人而言,我会选择第一种方法。在那些“尖峰”时期,您将使用潜在的30000个插入来敲击数据库。虽然这可能会很快完成(取决于这个问题范围之外的许多变量),但我们可以做得更聪明一些。
首先,通过定期轮询,您可以从队列中获取"x“消息,并将它们大容量插入到一个go中(就性能而言,您可能需要在这里调整这两个变量.轮询时间和从队列中取出多少)。
这种方法的一个问题是,在繁忙时期,您可能会落在后面。因此,您可以使您的应用程序更改它的轮询时间,根据它正在接收的数量,同时保持在一些min/最大值阈值之间。例如,如果你突然得到一个尖峰,并抓住500条信息..。你可能会缩短投票时间。如果下一次投票,你仍然可以得到千次,再做一次,缩短投票时间。当您能够得到的数字下降,然后您可以开始增加您的轮询时间在一个特定的阈值。
这将给你最好的两个世界伊夫俗子,并对尖峰/平静期作出反应。
发布于 2013-07-30 18:01:05
这在一定程度上取决于您的需求,但我将创建一个服务,该服务将每隔几分钟对该批量插入一次SQLBulkCopy。到目前为止,这是最轻率的做法。此外,如果你的斯派克是30k纪录,我不会太担心落在后面。
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
我们在同一台服务器上运行了一个C#控制台应用程序。
为什么不服务呢?
发布于 2013-07-30 18:09:31
我要做的是让控制台应用程序始终监听rabbitmq,然后在控制台应用程序中构建自己的队列,以便插入数据库,这样就可以控制数据库的插入。通过这样做,您可以在繁忙的时间内控制流程,方法是一次只允许这么多任务,然后在慢时间,您得到更快的反应,然后轮询频繁。我这样做的方式是引发一个事件,并且您知道队列中有一些事情要做,您可以检查队列长度,看看您想要处理多少事务。
https://stackoverflow.com/questions/17954035
复制相似问题