Как добавить проверку работоспособности в .NET 5 для MassTransit Amazon SQS?

У меня есть работающее и запущенное приложение .NET 5. Существует REST API для данных POST. При публикации данных публикуется сообщение MassTransit. Используя AWS Explorer, я ясно вижу, что если тема с названием customerinfo.fifo не существует, он создан в Amazon моим приложением. Судя по всему, мое приложение делает что-то полезное с Amazon SQS / SNS. Мне нравится, что.

Что мне не нравится, так это то, что при добавлении проверки работоспособности появляется ошибка, из-за которой моя проверка работоспособности становится Нездоровой (после вызова http: // localhost: 5000 / health / ready). Этого не должно происходить, поскольку мое приложение работает нормально и может публиковать сообщения. По логике, нездоровый статус должен возникать только тогда, когда что-то не так. Вот мой код, отвечающий за проверку работоспособности. Это часть метода ConfigureServices.

        services.AddHealthChecks();
        services.Configure<HealthCheckPublisherOptions>(options =>
        {
            options.Delay = TimeSpan.FromSeconds(2);
            options.Predicate = (check) => check.Tags.Contains("ready");
        });

Чтобы использовать добавленную проверку работоспособности, в метод Configure добавляется следующий код.

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions()
            {
                Predicate = (check) => check.Tags.Contains("ready"),
            });

            endpoints.MapHealthChecks("/health/live", new HealthCheckOptions());
        });

Этот код, показанный выше, в основном таков, как он задокументирован в документации MassTransit . Кроме того, у меня также есть код для добавления самого MassTransit SQS. У меня есть специальный метод расширения для этого:

    public static void UseMassTransit(this IServiceCollection services, MassTransitConfiguration massTransitConfiguration)
    {
        services.AddMassTransit(x =>
        {
            x.AddConsumer<CustomerChangeConsumer>();
            x.UsingAmazonSqs((context, cfg) =>
            {
                cfg.Host(massTransitConfiguration.Host, h =>
                {
                    h.AccessKey(massTransitConfiguration.AccessKey);
                    h.SecretKey(massTransitConfiguration.SecretKey);
                    h.EnableScopedTopics();
                });

                cfg.ReceiveEndpoint("CustomerChangeConsumer",
                    configurator =>
                    {
                        configurator.ConfigureConsumer<CustomerChangeConsumer>(context);
                    });

                cfg.Message<CustomerUpdate>(x =>
                {
                    x.SetEntityName("customerupdate.fifo");
                });

                cfg.Publish<CustomerUpdate>(x =>
                {
                    x.TopicAttributes["FifoTopic"] = "true";
                });
            });
        });
        services.AddMassTransitHostedService();
    }

Для решения этой проблемы возможны два типа решений:

  1. Просто удалите проверку работоспособности MassTransit. Он не может потерпеть неудачу, его больше нет. Мне нужно найти способ реализовать проверку работоспособности SQS / SNS при выборе такого решения.
  2. Исправить (мой?) Код, чтобы проверка работоспособности работала правильно.

Очевидно, что последний предпочтительнее, но для обоих типов решений я не знаю, как их реализовать.

Чтобы прояснить мою проблему, здесь показано зарегистрированное сообщение об ошибке при проверке работоспособности.

сбой: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService [103] Проверка работоспособности masstransit-bus завершена через 13,2985 мс со статусом «Неработоспособен» и описанием «Не готов: не запущен» MassTransit.AmazonSqsTransport.Exceptions.AmazonSqsConnectionException: https://support.microsoft.com/kb/ eu-west-2 / --- ›Amazon.SQS.AmazonSQSException: доступ к ресурсу https://sqs.eu-west-2.amazonaws.com/ отклонено. --- ›Amazon.Runtime.Internal.HttpErrorResponseException: создано исключение типа Amazon.Runtime.Internal.HttpErrorResponseException. в Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync (CancellationToken cancellationToken) в Amazon.Runtime.Internal.HttpHandler1.InvokeAsync[T](IExecutionContext executionContext) at Amazon.Runtime.Internal.Unmarshaller.InvokeAsync[T](IExecutionContext executionContext) at Amazon.SQS.Internal.ValidationResponseHandler.InvokeAsync[T](IExecutionContext executionContext) at Amazon.Runtime.Internal.ErrorHandler.InvokeAsync[T](IExecutionContext executionContext) --- End of inner exception stack trace --- at GreenPipes.Caching.Internals.NodeValueFactory1.CreateValue () в GreenPipes.Caching.Internals.NodeTracker1.AddNode(INodeValueFactory1, в стеке исключений MassValue, внутреннем траектории --- MassTracker1.AddNode(INodeValueFactory1 в стеке исключений MassTracker. .ReceiveTransport1.ReceiveTransportAgent.RunTransport() at MassTransit.Transports.ReceiveTransport1.ReceiveTransportAgent.Run ()

Я очень надеюсь, что там кто-нибудь сможет мне с этим помочь. Это так странно. MassTransit и SQS / SNS прекрасно работают вместе. Единственная проблема в том, что проверка работоспособности это отрицает, что очень расстраивает.

введите описание изображения здесь


person Daan    schedule 10.03.2021    source источник
comment
Вы нашли какое-либо решение, я получаю ту же ошибку Health check masstransit-bus completed after 0.0497ms with status Unhealthy and 'Not ready: not started' Я использую asp.net 3.1 с masstransit (sns / sqs)   -  person Niraj Trivedi    schedule 28.04.2021
comment
@NirajTvedi Нет, пока просто проверкой работоспособности не пользуюсь.   -  person Daan    schedule 28.04.2021
comment
В нескольких местах, где я обнаружил, что нам нужно реализовать настраиваемую проверку работоспособности с помощью команды ping pong   -  person Niraj Trivedi    schedule 30.04.2021


Ответы (2)


Я нашел ссылку, где говорят, что вам нужно определить настраиваемую проверку работоспособности, как показано ниже.

https://github.com/MassTransit/MassTransit/issues/1513#issuecomment-554943164

person Niraj Trivedi    schedule 30.04.2021

Вы пробовали установить Autostart = true? Это помогло мне с RabbitMq, так что, возможно, это поможет и вам.

mt.UsingAmazonSqs((context, cfg) =>
            {                    
                cfg.Host(massTransitConfiguration.Host, h =>
                {
                    h.AccessKey(massTransitConfiguration.AccessKey);
                    h.SecretKey(massTransitConfiguration.SecretKey);
                    h.EnableScopedTopics();
                });

                cfg.AutoStart = true;

                cfg.ReceiveEndpoint("CustomerChangeConsumer",
                    configurator =>
                    {
                        configurator.ConfigureConsumer<CustomerChangeConsumer>(context);
                    });

                cfg.Message<CustomerUpdate>(x =>
                {
                    x.SetEntityName("customerupdate.fifo");
                });

                cfg.Publish<CustomerUpdate>(x =>
                {
                    x.TopicAttributes["FifoTopic"] = "true";
                });
            });
person SzymonB    schedule 03.07.2021