C# 使用服务堆栈限制Redis消息队列执行
我希望能够限制消息的执行级别,以限制数据库上的负载。如果我的站点上有大量流量,那么队列将退出,在流量较低时,将处理队列 下面是用例 用户对我们网站中的某些数据进行更改,从而将一行新数据保存到一个更大的对象中。然后,我想向队列中添加一条消息,表示需要在搜索数据库中更新较大的对象 另一台计算机上的windows服务以限制方式从队列中读取消息。然后,它会将对象完整地从SQL数据库中取出,将它们转换为搜索poco,然后在搜索数据库中更新该对象 我想我可以运行一个每x秒运行一次的计划作业,从队列中读取一个并处理它,或者使用其他节流机制 我在下面列出了我的第一种未经测试的尝试(即明天的尝试) 我正在用c#编程,并使用服务堆栈库,作业由quartz net调度库执行 也许有更好的方法可以做到这一点C# 使用服务堆栈限制Redis消息队列执行,c#,redis,
servicestack,message-queue,quartz.net,C#,Redis,
servicestack,Message Queue,Quartz.net,我希望能够限制消息的执行级别,以限制数据库上的负载。如果我的站点上有大量流量,那么队列将退出,在流量较低时,将处理队列 下面是用例 用户对我们网站中的某些数据进行更改,从而将一行新数据保存到一个更大的对象中。然后,我想向队列中添加一条消息,表示需要在搜索数据库中更新较大的对象 另一台计算机上的windows服务以限制方式从队列中读取消息。然后,它会将对象完整地从SQL数据库中取出,将它们转换为搜索poco,然后在搜索数据库中更新该对象 我想我可以运行一个每x秒运行一次的计划作业,从队列中读取一个
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,这是一种完美的投掷方式