Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用服务堆栈限制Redis消息队列执行_C#_Redis_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack_Message Queue_Quartz.net - Fatal编程技术网 servicestack,message-queue,quartz.net,C#,Redis,servicestack,Message Queue,Quartz.net" /> servicestack,message-queue,quartz.net,C#,Redis,servicestack,Message Queue,Quartz.net" />

C# 使用服务堆栈限制Redis消息队列执行

C# 使用服务堆栈限制Redis消息队列执行,c#,redis,servicestack,message-queue,quartz.net,C#,Redis,servicestack,Message Queue,Quartz.net,我希望能够限制消息的执行级别,以限制数据库上的负载。如果我的站点上有大量流量,那么队列将退出,在流量较低时,将处理队列 下面是用例 用户对我们网站中的某些数据进行更改,从而将一行新数据保存到一个更大的对象中。然后,我想向队列中添加一条消息,表示需要在搜索数据库中更新较大的对象 另一台计算机上的windows服务以限制方式从队列中读取消息。然后,它会将对象完整地从SQL数据库中取出,将它们转换为搜索poco,然后在搜索数据库中更新该对象 我想我可以运行一个每x秒运行一次的计划作业,从队列中读取一个

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

下面是用例

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

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

我想我可以运行一个每x秒运行一次的计划作业,从队列中读取一个并处理它,或者使用其他节流机制

我在下面列出了我的第一种未经测试的尝试(即明天的尝试)

我正在用c#编程,并使用服务堆栈库,作业由quartz net调度库执行

也许有更好的方法可以做到这一点

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();
    }
}
公共类UpdateJob:IJob
{   
public void Execute(IJobExecutionContext上下文)
{
var redisFactory=new PooledRedisClientManager(“localhost:6379”);
var mqHost=new RedisMqServer(redisFactory,retryCount:2);
mqHost.RegisterHandler(m=>
{
//在这里做正确的逻辑。
WriteLine(“接收到:UpdateId[“+m.GetBody().Id+”]);
返回;
});
mqHost.Start();
}
}

若一条消息时不时地丢失,我也不会太在意,所以若redis崩溃,消息的持久性并不是问题。如果发生这种情况,我只需要从头开始重建整个搜索数据库就足够快了。

实际上,在这种情况下,您不需要Quartz.net。您可以使用
noOfThreads
-参数轻松调整
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();
var redisFactory=newpooledRedisClientManager(“localhost:6379”);
var mqHost=new RedisMqServer(redisFactory,retryCount:2);
mqHost.RegisterHandler(m=>
{
//TODO处理发生在这里
}, 2);
mqHost.Start();
这将把你的平行度限制在2,这是一种完美的投掷方式