2

我希望能够限制执行消息的级别,以限制我的数据库上的负载,如果我的站点上有大量流量,那么队列将六角形,在低流量时队列将被处理。

这是用例。

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

另一台机器上的 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 崩溃,消息的持久性不是问题。如果发生这种情况,我只需从头开始重建整个搜索数据库就足够快了。

4

1 回答 1

1

实际上,这种情况不需要 Quartz.net。您可以使用-parameter轻松调整RegisterHandler-method 调用中的线程数: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,这可以作为一种完美的节流方式。

于 2015-06-09T21:24:00.010 回答