.net - 使用 MassTransit 7 将两个服务连接到同一个 VHost 以处理作业 (JobSlotUnavailable)
问题描述
我正在从 Hangfire 迁移到 MassTransit 7/RabbitMQ 以执行后端作业。我们有许多 Windows 服务,其中每个服务处理一组作业。
当我单独启动服务 A 时,作业消费者正常执行,我可以看到每个作业都在审计存储接收 JobSlotAllocated 事件的地方执行。
如果我单独启动服务 B,作业也会正常执行。
现在如果两个服务都启动了,MassTransit 停止释放槽并且只执行前 20 个作业(并发限制设置为 20),并且审计存储开始接收 JobSlotUnavailable 事件。
是否需要进行任何配置以允许两个服务使用作业?
总线配置如下:
services.AddMassTransit(busConfigurator =>
{
busConfigurator.SetKebabCaseEndpointNameFormatter();
//Register commands, jobs, ...
busConfigurator.AddRabbitMqMessageScheduler();
busConfigurator.UsingRabbitMq((context, cfg) =>
{
cfg.Host(busOptions.Host, "/", h =>
{
h.Username(busOptions.Username);
h.Password(busOptions?.Password);
});
cfg.UseDelayedExchangeMessageScheduler();
if (serviceInstance)
{
var options = new ServiceInstanceOptions();
options.EnableInstanceEndpoint();
options.EnableJobServiceEndpoints();
cfg.ServiceInstance(options, instance =>
{
instance.ConfigureJobService();
instance.ConfigureJobServiceEndpoints(a =>
{
a.StartJobTimeout = TimeSpan.FromSeconds(30);
});
instance.ConfigureEndpoints(context);
});
}
else
{
cfg.ConfigureEndpoints(context);
}
});
});
services.AddMassTransitHostedService();
谢谢你,
解决方案
您需要为作业服务配置一个共享的 saga 存储库。您当前所拥有的是使用内存中的,这是每个实例,并且不会工作。
您可以在此示例中了解如何将 EF Core 配置为作业服务的 saga 存储库。
推荐阅读
- sql - 联合查询后消除重复的更好设计
- python - 使用python获取json对象值
- python-3.x - 尝试使用 Gensim 运行 Mallet 时出现 subprocess.CalledProcessError
- c# - 如何使用c#将动态查询插入表中
- php - 如何同时删除括号和括号内的文本以及之前的任何空格(如果存在)?
- c# - 如果 ON HEAP 和 OFF HEAP Memory full APACHE IGNITE 将条目逐出到磁盘
- excel - 如何修复在 excel vba 中发送的“Next with no For”错误
- sql - sql:比较具有不同值的两个表会产生重复的结果
- c++ - C++ 中的定期线程创建
- selenium - selenium element.click() 不工作(不点击)