Asp.net core 尝试连接k8s上的rabbitmq群集时发生Masstransit错误

Asp.net core 尝试连接k8s上的rabbitmq群集时发生Masstransit错误,asp.net-core,kubernetes,rabbitmq,masstransit,Asp.net Core,Kubernetes,Rabbitmq,Masstransit,我在k8s上有rabbitmq集群。我有一个使用MassTransit和rabbitmq的应用程序。启动时将应用程序部署到k8s时,MassTransit写入错误。我确信rabbitmq是可访问的,因为我还添加了返回健康的rabbitmq健康检查。我还分享了服务yaml和主机信息 我还可以查看从rabbitmq管理ui创建的身份交换 Startup.cs var rabbitConfig = new RabbitMqConfig(); rabbitConfig.H

我在k8s上有rabbitmq集群。我有一个使用MassTransit和rabbitmq的应用程序。启动时将应用程序部署到k8s时,MassTransit写入错误。我确信rabbitmq是可访问的,因为我还添加了返回健康的rabbitmq健康检查。我还分享了服务yaml和主机信息

我还可以查看从rabbitmq管理ui创建的身份交换

Startup.cs

        var rabbitConfig = new RabbitMqConfig();
        rabbitConfig.Host = Configuration.GetValue<string>("RABBIT_HOST");
        rabbitConfig.UserName = Configuration.GetValue<string>("RABBIT_USER_NAME");
        rabbitConfig.Password = Configuration.GetValue<string>("RABBIT_PASSWORD");
        rabbitConfig.Port = Configuration.GetValue<int>("RABBIT_PORT");

        services.AddSingleton(rabbitConfig);

        var factory = new ConnectionFactory()
        {
            HostName = rabbitConfig.Host,
            Password = rabbitConfig.Password,
            UserName = rabbitConfig.UserName,
            VirtualHost = "/",
            Port = rabbitConfig.Port,
            AutomaticRecoveryEnabled = true
        };

        var connection = factory.CreateConnection();
        services.AddSingleton<IConnection>(connection);

        string connectionString =  Configuration.GetValue<string>("CONNECTION_STRING");

        services.AddDbContext<DataContext>(options =>
        {
            options.UseMySql(connectionString);
        }); 

        services.AddHealthChecks()
            .AddMySql(connectionString, "MySQL")
            .AddRabbitMQ(name: "Rabbit");

        services.AddMassTransit( x=> {   

            x.AddConsumers(typeof(Startup).Assembly);

            x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg => {
                Action<MassTransit.RabbitMqTransport.IRabbitMqHostConfigurator> configure = h =>
                {
                    h.Username(rabbitConfig.UserName);
                    h.Password(rabbitConfig.Password);
                };
                cfg.Host(new Uri($"rabbitmq://{rabbitConfig.Host}"),"/", configure);
                cfg.ReceiveEndpoint("identity", e=> {
                    e.UseMessageRetry(x => x.Interval(2, 100));                    
                });
            }));
        }); 

        services.AddSingleton<IHostedService, BusService>(); 
主持人:

当我将我的应用程序部署到k8s群集时,MassTransit写入如下错误

大众运输[0] 操作中断: RabbitMQ.Client.Exceptions.OperationInterruptedException:AMQP操作被中断:AMQP关闭原因,由对等方启动,代码=541,text='INTERNAL_ERROR',classId=0,methodId=0 在RabbitMQ.Client.Impl.SimpleBlockingRpcContinuation.GetReply(TimeSpan超时) 位于RabbitMQ.Client.Impl.ModelBase.QueueDeclare(字符串队列、布尔被动、布尔持久、布尔排他、布尔自动删除、IDictionary
2个参数)
位于RabbitMQ.Client.Impl.ModelBase.QueueDeclare(字符串队列、布尔持久、布尔独占、布尔自动删除、IDictionary
2个参数) 在MassTransit.RabbitMqTransport.Contexts.RabbitMqModelContext.c__DisplayClass19_0.b__0()中 在System.Threading.Tasks.Task
1.InnerInvoke()中
位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
---来自引发异常的上一个位置的堆栈结束跟踪---
位于System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task¤tTaskSlot,threadPoolThread)
---来自引发异常的上一个位置的堆栈结束跟踪---
在MassTransit.RabbitMqTransport.Pipeline.ConfigureTopologyFilter上
1.ConfigureTopology(ModelContext) 在MassTransit.RabbitMqTransport.Pipeline.ConfigureTopologyFilter
1.c_uuDisplayClass3_0.d.MoveNext()中
---来自引发异常的上一个位置的堆栈结束跟踪---
在GreenPipes.PipeExtensions.OneTimeSetup[T](PipeContext上下文,Func
2 setupMethod,PayloadFactory
1 PayloadFactory)
在MassTransit.RabbitMqTransport.Pipeline.ConfigureTopologyFilter
1.GreenPipes.IFilter.Send(ModelContext上下文,IPIPPE
1下一步)
在MassTransit.RabbitMqTransport.Pipeline.ReceiveEndpointFilter.GreenPippes.IFilter.Send(ConnectionContext上下文,IPipe
1下一步) 在MassTransit.RabbitMqTransport.Pipeline.ReceiveEndpointFilter.GreenPipes.IFilter.Send处(ConnectionContext上下文,IPipe
1下一步)
位于GreenPipes.Agents.PipeContextSupervisor
1.GreenPipes.ipippeContextSource.Send(ipippe
1管道,取消令牌取消令牌)
位于GreenPipes.Agents.PipeContextSupervisor
1.GreenPipes.ipippeContextSource.Send(ipippe
1管道,取消令牌取消令牌)
在GreenPipes.Agents.PipeContextSupervisor上
1.GreenPipes.IPipeContextSource.Send(ipippe`1管道,取消令牌取消令牌) 在masstTransit.RabbitMqTransport.Transport.RabbitMqReceiveTransport.b_u_12_0()上


这很可能是您的RMQ部署问题。您是如何将其部署到k8s的?如果您使用了其中一个头盔图表,则不需要自烘焙服务文件。RMQ 541错误是内部服务器错误。此外,除了将消费者添加到容器中之外,您还没有配置消费者。请确保您按照文档中的说明进行操作,谢谢您的回复Alexey。事实上,我刚刚开始这个项目,并试图看到我的本地k8s集群的实际行为,这就是为什么我还没有任何消费者。对于rabbitmq部署,我遵循以下链接。我想你是对的,在检查了rabbitmq集群的实例日志之后,我猜这是关于部署的。
kind: Service
apiVersion: v1
metadata:
  namespace:  rabbitmq
  name: rabbitmq
  labels:
    app: rabbitmq
spec:
  selector:
    app: rabbitmq
  ports:
   - name: rabbitmq-mgmt-port
     protocol: TCP
     port: 15672
     targetPort: 15672
   - name: rabbitmq-amqp-port
     protocol: TCP
     port: 5672
     targetPort: 5672
rabbitmq.rabbitmq.svc.cluster.local