2015-06-17 65 views
0

我正在使用Azure ServiceBus主題將消息從一個應用程序(WorkerRole)發送到另一個應用程序(WorkerRole)。儘可能快地添加到消息主題隊列是很重要的,但是我發現TopicClient的方法有時在1秒到1分鐘之間變化。TopicClient.Send需要很長時間才能發送消息

的設置我有我的Azure的儀表盤:

  • 1命名空間
  • 1主題
  • 4訂閱​​

我送的話題從2個不同的客戶但量我發送的消息在此刻相當小,即每隔幾秒我會向2個不同的訂閱發送消息。

我注意到的是,發送到訂閱的消息似乎隨着發送時間而變化。以下是我的發送代碼。

private void SendToSubscription(ReceivedQueue record, ServiceBusTopicFilter topicFilter) 
{ 
    var connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus." + topicFilter.Topic); 
    var factory = MessagingFactory.CreateFromConnectionString(connectionString); 

    var topicClient = factory.CreateTopicClient(topicFilter.Topic); 

    try 
    { 
     // The Filter is so that different handlers of messages can receive only the ones they are desiring 
     var message = AsBrokeredMessage(record, topicFilter.Filter); 

     _traceMonitor.TraceInformation(record.Uid, "Sending packet to topic " + "[" + record.PacketId + "] [" + topicFilter.Filter + "]"); 

     // NOTE: From my logging this part seems to take a while to action sometimes 
     topicClient.Send(message); 
    } 
    catch (MessagingException e) 
    { 
     // TODO: Handle transient errors properly to ensure we don't missing packet ?? 
     Trace.TraceError("SendToSubscription.MessagingException :: " + e.Message); 
    } 
    catch (Exception ex) 
    { 
     Trace.TraceError("SendToSubscription.Exception :: " + ex); 
    } 
} 

消息的處理會影響發送嗎?如果需要,我可以發佈該代碼。

+0

有沒有可能你的'var topicClient = factory.CreateTopicClient(topicFilter.Topic)'花了很多時間?請參閱:https://msdn.microsoft.com/en-us/library/azure/hh528527.aspx(「重用工廠和客戶端」部分)。 –

+0

這是可能的,我想謝謝,我會在那裏做出改變。然而,我的日誌記錄就在發送之前,之後我看到時間滯後,因爲我在此方法之外有另一個日誌語句來指示Send()所花費的時間。 – dreza

+0

@GauravMantri做了一個調整後,現在看起來速度更快。感謝您的幫助 – dreza

回答

0

感謝Gaurav Mantri指點我的方向,我發現了一種看起來更快的方法。

看來我正在爲每個請求創建一個新的MessageFactory。如MSDN所示,在我們可以的地方重新使用工廠效率更高。

所以我最終做的是創建一個消息工廠池,以便通常我很少創建新的消息工廠連接。

這意味着我現在看到即時消息發送到服務總線隊列,並且唯一一次我看到最初的5秒延遲是當我第一次創建MessageFactory對象,然後第一次使用它。

相關問題