Жизненный цикл BuiltinHandlerActivator и запросов приложений с Rebus - PullRequest
1 голос
/ 28 мая 2019

У меня есть вопросы относительно жизненных циклов различных объектов Rebus, связанных с заявками на приложения для издателя и подписчика:

См. Ниже:

Издатель

1 Должен ли приведенный ниже код быть инициализирован один раз и только один раз за время существования приложения?

Например, приведенный ниже экземпляр BuiltinHandlerActivator инициализируется один раз и используется на протяжении всего жизненного цикла приложения?

using (var activator = new BuiltinHandlerActivator())
{
    Log.Logger = new LoggerConfiguration()
        .WriteTo.ColoredConsole()
        .ReadFrom.Configuration(SerilogConfiguration)
        .Enrich.WithProperty("App Name", "Rebus Publisher")
        .CreateLogger();

    Configure.With(activator)
        .Logging(l =>
        {
            l.Serilog(Log.Logger);
        })
        .Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Publisher))
        .Options(o =>
        {
            o.Decorate<IErrorHandler>(c => new MyErrorHandler(c.Get<IErrorHandler>()));

            o.SimpleRetryStrategy(maxDeliveryAttempts: 1, errorQueueAddress: "poison");
        })
        .Start();

2 Может ли несколько потоков одновременно вызывать и использовать activator ниже?

Например, если поступает несколько запросов, среда выполнения функции Azure создает несколько экземпляров функции ниже, каждый из которыхкоторые обрабатывают запросы.

activator.Bus.Publish("test").Wait();

Subscriber1

Подобные вопросы относятся к издателю выше

1 Необходимо только один раз инициализировать приведенный ниже кододин раз за всю жизнь приложения?Например, приведенный ниже экземпляр BuiltinHandlerActivator инициализируется один раз и используется на протяжении всего жизненного цикла приложения?

using (var activator = new BuiltinHandlerActivator())
{
    activator.Register(() => new Handler(MessageContext.Current));

    Configure.With(activator)
        .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
        .Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Subscriber1))
        .Routing(r => r.TypeBased().MapAssemblyOf<string>(Consts.Publisher))
        .Options(o =>
        {
            //consumer only
            o.SimpleRetryStrategy(maxDeliveryAttempts: 2, errorQueueAddress: "poison");
            //consumer only
            o.SetNumberOfWorkers(7);
            o.SetMaxParallelism(10);
        }).Start();

2 Может ли несколько потоков одновременно вызывать и использовать активатор ниже?

Например, если поступает несколько запросов, среда выполнения функции Azure создает несколько экземпляров функции ниже, каждый из которых обрабатываетзапросы.

Обратите внимание, что и SetNumberOfWorkers, и SetMaxParallelism используются для Subscriber1.

activator.Bus.Subscribe<string>().Wait();

1 Ответ

0 голосов
/ 28 мая 2019

Экземпляр шины является полностью реентерабельным и, следовательно, безопасным для использования в потоках.

Как правило, вы должны создать экземпляр шины только один раз, а затем либо

  • утилизируйте экземпляр шины или
  • утилизируйте BuiltinHandlerActivator или
  • избавьтесь от контейнера IoC, который вы используете для удержания вашего экземпляра шины

когда приложение закрывается.

Если вы находитесь в функции Azure, вам следует использовать «односторонний клиент», который является просто другим словом для экземпляра шины, который не способен получать сообщения - он способен только отправка / публикации. Вы можете прочитать о двух режимах шины здесь: Различные режимы шины

Подробнее о политике экземпляров и безопасности потоков можно прочитать здесь: Политики безопасности потоков и экземпляров .

...