0

我们目前正在利用Azure服务总线处理来自应用程序的各种消息。如何积极处理Azure服务总线队列消息

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

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

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

谢谢你们

回答

1

你并不需要检查基于定时器不断总线。

服务总线主题和订阅支持发布/订阅消息传递通信模型。

当消息发送到某个主题时,它将被提供给每个订阅以独立处理/处理。

这里是如何从一个主题接收消息的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/

+0

什么处理/处理消息?这段代码在哪里可以处理即时发送给主题的消息? ...我目前有一个单独的应用程序,它使用与上面类似的代码,但它每分钟都在触发,我不确定在收到消息时我会在何处/如何将代码瞬间触发。它是一个Azure Webjob /等? – Nefariis

+0

此方法处理/处理消息:客户端。OnMessage((message)=> { – Aram

+0

@Nefariis大约一分钟是AutoRenewTimeout属性的默认值,您可以更改AutoComplete设置为false以手动控制何时调用接收到的消息的完成AutoRenewTimeout为设置为1分钟,这会导致客户端等待最多一分钟,然后终止自动续订功能,并且客户端将重新进行呼叫以检查消息。 – Aram

1

当它归结到基础结构代码,我宁愿不写任何代码。毕竟,你想看到的最后一件事是基础结构代码中的一个错误,导致数据/消息丢失。

使用裸露Azure服务总线的替代方法是使用库来为您抽象出所有代码。最终,你会声明你的消息 - 你的事件和命令 - 并且你有处理程序会在有消息时被解雇。所有的消息抽取,队列创建,重试,错误处理和审计以及仅仅是冰山一角的交易都伴随着这样的框架。

至于要使用哪个框架,有NimbusNServiceBus以及其他可能的框架。 NServiceBus是extensive documentation,devopsdebugging 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; 
    } 
} 

附:我为NServiceBus的制造商特定软件公司工作,但我使用了两种推荐的框架。你需要决定哪一个适合你。

相关问题