2013-10-02 88 views
2

我希望能够限制执行消息的级别,以便在我的站点上存在大量流量时限制数据库的负载,然后队列将手风琴出来了,在小批量的时候,队列将被处理。使用服务堆栈限制Redis消息队列执行

这是用例。

用户更改了我们网站中的一些数据,这些数据将数据的新行保存到更大的对象中。然后,我想向队列中添加一条消息,以表示需要在我们的搜索数据库中更新较大的对象。

另一台机器上的Windows服务以受限制的方式从队列中读取消息。然后它会将对象全部从SQL数据库中取出,将它们转换为搜索poco,然后在搜索数据库中更新该对象。

我想我可以运行一个计划任务,每隔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的崩溃是不是一个问题困扰。如果发生这种情况,我只需从头开始重新构建整个搜索数据库就足够快了。

回答

1

其实你不需要这个场景的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,它可以作为throtteling的一个完美的方式行事。