我們使用RabbitMQ的用於存儲,我們最終希望在我們的SQL Server數據庫存儲的輕量消息。有些時候隊列是空的,有時候會出現流量飆升 - 30,000條消息。數據庫插入性能當一抓項目從隊列
我們有一個C# console app
運行在同一臺服務器上。
我們是否每分鐘都有控制檯應用程序運行並從隊列中抓取指定數量的項目以插入數據庫? (以可管理的叮咬)
OR
我們有控制檯應用程序總是「聽」和錘子物品進入數據庫,因爲他們進來嗎? (更積極的做法)
我們使用RabbitMQ的用於存儲,我們最終希望在我們的SQL Server數據庫存儲的輕量消息。有些時候隊列是空的,有時候會出現流量飆升 - 30,000條消息。數據庫插入性能當一抓項目從隊列
我們有一個C# console app
運行在同一臺服務器上。
我們是否每分鐘都有控制檯應用程序運行並從隊列中抓取指定數量的項目以插入數據庫? (以可管理的叮咬)
OR
我們有控制檯應用程序總是「聽」和錘子物品進入數據庫,因爲他們進來嗎? (更積極的做法)
就我個人而言,我會採取第一種方法。在那些「秒殺」時期,你將會用30,000個插入數據庫來錘擊數據庫。雖然這可能會很快完成(取決於這個問題範圍之外的許多變量),但我們可以做得更聰明一點。首先,通過定期輪詢,您可以從隊列中抓取「x」個消息並批量插入它們(在性能方面,您可能需要在這裏調整2個變量......輪詢時間以及如何許多你從隊列中取出)。
這種方法的一個問題是,在忙碌的時候你可能會落後。所以你可以讓你的應用根據它接收的數量來改變它的輪詢時間,同時保持一些最小/最大閾值。例如。如果你突然得到一個尖峯並抓取500條消息......你可能會減少你的投票時間。如果下一次民意測驗,你仍然可以得到數千人,再次進行,減少投票時間。隨着您能夠獲得的號碼下降,您可以開始在特定的閾值下增加輪詢時間。
這會給你最好的兩個世界imho和反應的尖峯/平靜期。
這取決於您的需求,但我會創建一個調用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服務,如果服務器被重新啓動,該服務可以被設置爲重新啓動。
我還將檢查SQLBulkCopy和Windows服務選項。謝謝! – user1536341