2017-03-19 5 views
2

Azureイベントハブからデータを送信または受信しています。要件メッセージをコンシューマが順番に処理する必要があるため、私はPartitionSenderに参加し、常に同じパーティションにイベントを送信することに決めました。 https://docs.microsoft.com/en-us/azure/event-hubs/event-hubs-availability-and-consistencyで「一貫性」の下Azure EventHubの再試行ロジックPartitionedSender

それはPartitionSenderについてこう述べています。このタイプの構成では

、あなたが送信された特定のパーティションが使用できない場合、エラーが表示されますことを心に留めておく必要があります応答。比較のポイントとして、単一のパーティションに対する親和性がない場合、イベントハブサービスはイベントを次の使用可能なパーティションに送信します。

エラーが発生した場合、別のパーティションを使用して送信しようとする再試行ロジックを実装します。 (私は4)

私はこのエラーをトリガする方法がわからないので、コードでは再試行ロジックを実装する必要があります少し不明です。

私の推測では、それがスローされます「Sender.SendAsync(データ)」であり、それはここで私は再試行ロジックに

を実装する必要があります。これは、関連するコードです:私として

private EventHubSender _sender; 

    private EventHubSender Sender(int partitionId) 
    { 
     if (_sender == null) 
     { 
      _sender = CreatePartitionedSender(partitionId); 
     } 
     return _sender; 
    } 

    private static EventHubSender CreatePartitionedSender(int partitionId) 
    { 
     var eventHubClient = EventHubClient.CreateFromConnectionString(SnakeHubSendSas); 
     return eventHubClient.CreatePartitionedSender(partitionId.ToString()); 
    } 

    public void SendToEventHub(string json, long sequenceNumber) 
    {    
     Console.WriteLine(""); 
     Console.WriteLine("Sending message: sequence number '" + sequenceNumber + "'"); 

     var data = new EventData(Encoding.UTF8.GetBytes(json)); 
     data.Properties.Add("SequenceNumber", sequenceNumber); 

     try 
      { 
       Sender(1).SendAsync(data); 
      } 
      catch (Exception ex) 
      { 

      }   
    } 

答えて

0

アプリケーションの一貫性に関するイベントを特定のパーティションに送信するには、PartitionSenderオブジェクトを利用することができます。また、送信している特定のパーティションが利用できないときに例外をキャプチャし、イベントを別の特定のパーティションに送信することもできます。しかし、この時点で、セカンダリ・パーティションはしばらくは使用できなくなり、そのパーティションのイベントを処理するために追加のロジックを追加する必要があります。

あなたのイベントハブのパーティション間に自動的にイベントを配信し、最大のアップタイムでイベントを送信し、イベントをカスタムシーケンス状態プロパティでスタンプするために、EventHubClient.Sendメソッドを利用してイベントを送信することができますオーダーを確実にし、処理アプリケーションによってイベントの状態を保持します。

+0

私は、例外を処理する方向に傾いていて、それを別のパーティションに送信しています。それは醜いですが、それが最も簡単なようです。 –

+0

私は[ILSpy](http://ilspy.net/)を利用してMicrosoft.ServiceBusを逆コンパイルしようとしましたが、特定のパーティションが使用できないことを示すExceptionについて何も見つかりませんでした。しかし、Messaging例外はMessagingExceptionを継承していることがわかりました。だから私はあなたのリトライロジックを実装するための回避策について[MessagingException](https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.messaging.messagingexception)を捕捉できると仮定しました。 –

関連する問題