簡體   English   中英

使用服務堆棧限制Redis Message Queue執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM