Политика переподключения Masstransit, когда RabbitMQ не работает - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующие различные сценарии ios:

Сценарий 1

RabbitMQ запущен.

Потребитель запускается и подписывается правильно через MassTransit к RabbitMQ.

RabbitMQ понижается.

RabbitMQ снова повышается.

Если потребитель пытался подписаться на busControl.StartAsyn c () ; тогда он больше не будет подключаться

Если Потребитель попытается подписаться на busControl.Start (); , тогда он будет правильно подключен.

Уже нахожу это немного странным ... но ладно.

Сценарий 2

RabbitMQ не работает

Потребитель идет вверх и пытается подписаться с busControl.Start (); , который завершится ошибкой из-за того, что RabbitMQ выключен

RabbitMQ повышается

Потребитель не может повторно подключиться к RabbitMQ

Но мне нужно как-то охватить это дело ..

Регистрация:

private static void RegisterRabbitMQ(SimpleInjectorContainer container)
{
    container.AddMassTransit(x =>
    {
        x.AddBus(() => Bus.Factory.CreateUsingRabbitMq(cfg =>
        {
            var host = cfg.Host(ConfigurationValuesProvider.Current.Get("RabbitMQHostName"), hostConfigurator =>
            {
#if !DEBUG
                hostConfigurator.Username(ConfigurationValuesProvider.Current.Get("RabbitMQUsername"));
                hostConfigurator.Password(ConfigurationValuesProvider.Current.Get("RabbitMQPassword"));

                hostConfigurator.UseCluster(c =>
                {
                    string[] hostnames = ConfigurationValuesProvider.Current.Get("RabbitMQNodes").Split(';');
                    c.ClusterMembers = hostnames;
                });
#endif
            });
        }));
    });
}

Стартовый автобус:

try
{
    RegisterRabbitMQ(container);
    var busControl = container.GetInstance<IBusControl>();
    busControl.Start();
}
catch (Exception ex)
{
    Log.Seq.Error("RabbitMQ broker is not reachable, BusControl cannot be started. ", ex);
}

t заранее спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Мы уже давно используем Mass Transit в производстве. Когда Mass Transit подключается к Rabbit, управление массовым транзитом на самом деле становится solid. Я полагаю, что это запуск и остановка виртуальных машин / контейнеров и кролика, который не работает, когда появляются ваши потребительские сервисы. Это настоящая проблема.

Способ, которым мы подошли к этому вопросу, состоит в том, чтобы переместить старта потребителя в другую поток службы и реализовать операцию повтора. Это позволит вашему сервису успешно начать и go в l oop и дождаться появления кролика. Важно отметить, что мы регистрируем, что служба не может подключиться к кролику, поэтому мы видим это.

code

private async Task StartAsync()
{
    await Task.Run(() => {

        bool isConnected = false;
        while(!isConnected)
        {
            try
            {
                ServiceBus = CreateServiceBus();
                ServiceBus?.Start();
                isConnected = true;
                _loggingService.Info("Messaging service bus started.");
            }
            catch(Exception ex)
            {
                _loggingService.Error("Cannot connect to message broker host.", ex);
                Thread.Sleep(Defined_Time);
            }
        }
    });
}

, тогда настройка шины выполняется точно так же, как в демонстрационной версии

private IBusControl CreateServiceBus()
{
    var url = string.Format(CultureInfo.InvariantCulture, "rabbitmq://{0}", _messagingServerName);
    var uri = new Uri(url);

   _loggingService.DebugFormat("Starting messaging service bus: \"{0}\". Username=\"{1}\".", url, _messagingUsername);

    return Bus.Factory.CreateUsingRabbitMq(sbc =>
    {
        Host = sbc.Host(uri, h =>
        {
            h.Username(_messagingUsername);
            h.Password(_messagingPassword);
        });

        //Configure end points
    });
}

Надеюсь, это поможет.

...