gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:06:55 24 4
gpt4 key购买 nike

我希望能够限制消息执行的级别,以便在我的网站上有大量流量时限制我的数据库的负载,然后队列将在低流量时被折叠起来队列将被处理。

这是用例。

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

另一台机器上的 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();
}
}

如果一条消息时不时丢失,我也不会感到非常困扰,因此如果 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();

这会将您的并行度限制为 2,这可以作为一种完美的节流方式。

关于c# - 使用服务堆栈限制 Redis 消息队列的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com