如何主动处理Azure Service Bus队列消息

时间:2016-11-06 22:16:25

标签: azure nservicebus azureservicebus servicebus azure-servicebus-queues

我们目前正在利用Azure Service Bus处理来自我们应用程序的各种消息。

我想知道实时处理这些消息的最佳方法是什么?

当邮件放入队列时,有没有办法自动执行脚本?

我只是认为必须有一个比单独的应用程序每分钟检查队列更好的方法/ 30秒/等。

谢谢你们

2 个答案:

答案 0 :(得分:1)

您无需经常根据计时器检查总线。

Service Bus主题和订阅支持发布/订阅消息传递通信模型。

当消息发送到某个主题时,它随后可供每个订阅使用以独立处理/处理。

以下是关于如何从主题接收消息的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/

答案 1 :(得分:1)

当谈到基础设施代码时,我宁愿不写任何代码。毕竟,您最不希望看到的是基础架构代码中的一个错误,导致数据/消息丢失。

使用裸骨Azure Service Bus的替代方法是使用库来为您抽象出所有代码。最终,您将声明您的消息 - 您的事件和命令 - 并且您有处理程序在有消息时会被触发。所有消息的抽取,队列创建,重试,错误处理以及审计和交易只是冰山一角,都有这样的框架。

至于使用哪个框架,有NimbusNServiceBus以及其他可能的框架。 NServiceBus是一个商业产品,附带extensive documentationdevopsdebugging and visualization实用程序,如果您需要,还需要额外的付费支持。以下是如何使用Azure ServiceBus启动和运行NServiceBus端点:

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。我为特殊软件公司工作NServiceBus的制造商,但我使用了两个推荐的框架。你需要决定哪一个适合你。