首页 > 解决方案 > 使用 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();

谢谢你,

标签: .netrabbitmqmasstransit

解决方案


您需要为作业服务配置一个共享的 saga 存储库。您当前所拥有的是使用内存中的,这是每个实例,并且不会工作。

您可以在此示例中了解如何将 EF Core 配置为作业服务的 saga 存储库。


推荐阅读