[英]Throttling Redis Message Queue execution with service stack
我希望能夠限制執行消息的級別,以限制我的數據庫上的負載(如果我的網站上的流量很大),那么隊列將協奏起來,而當流量較小時,隊列將被處理。
這是用例。
用戶對我們網站中的某些數據進行了更改,從而將新的一行數據保存到更大的對象中。 然后,我想向隊列添加一條消息,說需要在我們的搜索數據庫中更新較大的對象。
另一台計算機上的Windows服務以受限制的方式從隊列中讀取消息。 然后,它將全部對象從SQL數據庫中提取出來,將它們轉換為搜索策略,然后在搜索數據庫中更新該對象。
我想我可以運行一個計划的作業,該作業每x秒運行一次,它將從隊列中讀取一個並進行處理,或者可以使用其他某種限制機制。
我將未經測試的第一種嘗試(包括明天的嘗試)包括在下面,
我正在用c#編程,並使用服務堆棧庫和由石英網調度庫執行的作業。
也許有更好的方法可以做到這一點?
public class UpdateJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var redisFactory = new PooledRedisClientManager("localhost:6379");
var mqHost = new RedisMqServer(redisFactory, retryCount: 2);
mqHost.RegisterHandler<UpdateMessage>(m =>
{
// do the proper logic here.
Console.WriteLine("Received: UpdateId [" + m.GetBody().Id + "]");
return;
});
mqHost.Start();
}
}
如果消息一遍又一遍丟失,我也不會感到煩惱,因此,如果redis崩潰,則消息的持久性不是問題。 如果發生這種情況,對我來說足夠快就可以從頭開始重建整個Search數據庫。
實際上,在這種情況下,您不需要Quartz.net。 您可以使用noOfThreads
-parameter輕松調整RegisterHandler
方法調用中的線程數:
var redisFactory = new PooledRedisClientManager("localhost:6379");
var mqHost = new RedisMqServer(redisFactory, retryCount: 2);
mqHost.RegisterHandler<UpdateMessage>(m =>
{
// TODO processing happens here
}, 2);
mqHost.Start();
這會將您的並行度限制為2,這可以作為一種理想的節流方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.