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的製造商特定軟件公司工作,但我使用了兩種推薦的框架。你需要決定哪一個適合你。

相關問題