Как активно обрабатывать сообщения очереди служебной шины Azure

В настоящее время мы используем служебную шину Azure для обработки различных сообщений из нашего приложения.

Я хочу знать, как лучше всего обрабатывать эти сообщения в реальном времени?

Есть ли способ автоматически выполнять скрипт, когда сообщение помещается в очередь?

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

Спасибо, парни


person Nefariis    schedule 06.11.2016    source источник


Ответы (2)


Не нужно постоянно проверять автобус по таймеру.

Темы и подписки служебной шины поддерживают модель обмена сообщениями публикация / подписка.

Когда сообщение отправляется в тему, оно становится доступным для каждой подписки для независимой обработки / обработки.

Вот пример C # того, как вы можете получить сообщение из темы:

string connectionString =
    CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

SubscriptionClient Client =
    SubscriptionClient.CreateFromConnectionString
            (connectionString, "TestTopic", "HighMessages");

// Configure the callback options.
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

Client.OnMessage((message) =>
{
    try
    {
        // Process message from subscription.
        Console.WriteLine("\n**High Messages**");
        Console.WriteLine("Body: " + message.GetBody<string>());
        Console.WriteLine("MessageID: " + message.MessageId);
        Console.WriteLine("Message Number: " +
            message.Properties["MessageNumber"]);

        // Remove message from subscription.
        message.Complete();
    }
    catch (Exception)
    {
        // Indicates a problem, unlock message in subscription.
        message.Abandon();
    }
}, options);

Вот более подробная информация о модели подписчика издателя:

https://azure.microsoft.com/en-us/documentation/articles/service-bus-dotnet-how-to-use-topics-subscriptions/

person Aram    schedule 06.11.2016
comment
Что обрабатывает / обрабатывает сообщение? Куда подевался бы этот код, чтобы он мог мгновенно обрабатывать сообщение, отправляемое в тему? ... В настоящее время у меня есть отдельное приложение, которое использует код, аналогичный приведенному выше, но он запускается каждую минуту, и я не уверен, где и как бы я поместил код для мгновенного срабатывания при получении сообщения. Это веб-задание Azure и т. Д.? - person Nefariis; 07.11.2016
comment
Этот метод обрабатывает / обрабатывает сообщение: Client.OnMessage ((message) = ›{ - person Aram; 07.11.2016
comment
@Nefariis Примерно одна минута, которая является значением по умолчанию для свойства AutoRenewTimeout, которое вы можете изменить. AutoComplete имеет значение false, чтобы включить ручное управление, когда вызывать Complete в полученном сообщении. AutoRenewTimeout установлен на 1 минуту, что заставляет клиента ждать до одной минуты перед завершением функции автоматического обновления, и клиент делает новый вызов для проверки сообщений. - person Aram; 07.11.2016

Что касается кода инфраструктуры, я бы предпочел не писать никакого кода. В конце концов, последнее, что вы хотите видеть, - это ошибка в коде вашей инфраструктуры, которая приводит к потере данных / сообщений.

Альтернативой использованию простой служебной шины Azure является использование библиотеки для абстрагирования всего этого кода за вас. В конечном итоге вы объявляете свои сообщения - свои события и команды - и у вас есть обработчики, которые будут запускаться при появлении сообщения. Вся перекачка сообщений, создание очереди, повторные попытки, обработка ошибок, аудит и транзакции, которые являются лишь верхушкой айсберга, сопровождаются такими фреймворками.

Что касается того, какой фреймворк использовать, то есть Nimbus и NServiceBus и, возможно, другие. NServiceBus - это коммерческий продукт, к которому прилагается обширная документация, DevOps и отладка и визуализация утилиты и дополнительная платная поддержка, если она вам понадобится. Вот как получить конечную точку NServiceBus и запустить ее с помощью Azure ServiceBus:

var endpointConfiguration = new EndpointConfiguration("Endpoint1");
endpointConfiguration.SendFailedMessagesTo("error");

var transport = endpointConfiguration.UseTransport<AzureServiceBusTransport>();
var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus.ConnectionString");

transport.ConnectionString(connectionString);
transport.UseTopology<ForwardingTopology>();

var endpointInstance = await Endpoint.Start(endpointConfiguration)
        .ConfigureAwait(false);

var message = new Message1
{
    Property = "Hello from Endpoint1"
};

await endpointInstance.Send(message).ConfigureAwait(false);

а на стороне получателя все, что вам нужно, это иметь класс обработчика:

public class MyMessageHandler : IHandleMessages<Message1>
{
    public Task Handle(Message2 message, IMessageHandlerContext context)
    {
        //Do your task
        Console.WriteLine(message.Property);
        return Task.CompletedTask;
    }
}

P.S. Я работаю в компании Special Software, создателя NServiceBus, но я использовал оба рекомендуемых фреймворка. Вам нужно будет решить, какой из них вам подходит.

person Hadi Eskandari    schedule 07.11.2016