使用服务堆栈限制Redis Message Queue执行

时间:2013-10-02 21:10:05

标签: c# redis servicestack message-queue quartz.net

我希望能够限制执行邮件的级别,以便限制我的数据库上的负载,如果我的网站上有大量的流量,那么队列将会逐渐减少,并且在低音量时队列将被处理。

这是用例。

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

另一台计算机上的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 个答案:

答案 0 :(得分:1)

实际上你不需要Quartz.net来实现这个场景。您可以使用RegisterHandler - 参数轻松调整noOfThreads - 方法调用中的线程数:

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,这可以作为一种完美的节奏方式。