2017-01-24 9 views
0

Я использую темы Azure Service Bus в производственном приложении. Мое понимание заключается в том, что система гарантирует по крайней мере одну копию сообщения в конце подписки при публикации.Azure Service Bus Тема: Почему возникает дублирование сообщений?

На практике я обычно вижу 1 сообщение, соответствующее публикации. В некоторых вырожденных случаях, хотя я вижу кратные. Например: 1 публикация, соответствующая ~ 20 сообщениям в соответствующей подписке. В настоящее время ничто не поглощает эту подписку, что заставляет меня думать, что это логика публикации.

При каких обстоятельствах сообщения повторяются безудержным образом? Я бы предположил, что сетевые помехи могут вызвать это. Что еще?

Обратите внимание, что логика обработки дубликатов по умолчанию не может справиться с этим. У вас будет несколько сообщений с одним и тем же телом и разными идентификаторами сообщений, которые, как я понимаю, используются для установления «идентичности» сообщения.

EDIT: Моя публикация логика довольно простой и напоминает следующее:

public void PublishSomeId(Guid someId, int eventDelayInMinutes, string componentName) 
     { 
      var topicClient = ServiceBusManager.GetTopicClient(); 

      var message = new BrokeredMessage(someId); 
      message.To = componentName; 
      message.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(eventDelayInMinutes); 
      topicClient.Send(message); 
     } 
+0

Более подробная информация потребуется для ответа на этот вопрос. Какова ваша публикационная логика? Если вы публикуете одну и ту же полезную нагрузку 20 раз с другим идентификатором, тогда да, у вас будет 20 «копий» события. Как выглядит ваша топология? Без этой информации, отвечающей на это, очень много догадок. –

+0

Я отредактировал вопрос, чтобы добавить образец кода, который очень похож на мою фактическую реализацию. Анекдотически я вижу ~ 20 сообщений с телом 'someId'. С помощью журналов я знаю, что этот метод был вызван только один раз с помощью «someId». –

+0

Действительно, ничего необычного. Какова ваша настройка темы и подходит к этой теме? –

ответ

1

Два предложения:

  1. Убедитесь, что издатель не дублировать сообщения. Добавьте оператор журнала в PublishSomeId, чтобы узнать, что такое значение someId. Я подозреваю, что этот метод можно вызвать несколько раз. В дополнение к этому, если вы не видите, что дубликаты регистрировались, вы можете включить обнаружение дубликатов. Для этого вам необходимо назначить someId брокерскому сообщению MessageId. Не уверен, что это период времени, когда дубликаты генерируются, но вы можете экспериментировать.

  2. Если # 1 не помогает, это может быть установка топологии (объекты). Проверьте, что нет ничего забавного, как забава с поклонником в той же теме.

+0

Я принял этот ответ как принятый, поскольку он дает некоторое представление о следующих шагах, которые я могу предпринять, чтобы отследить эту проблему. Оценены дополнительные ответы, объясняющие причины возникновения дублирования. –

+0

@ArxoClay вы нашли источник дублирования? –

+0

Мы нашли один источник дублирования. Я подозреваю, что там может быть больше. Один из найденных нами источников работает следующим образом: если вы обновляете подписку при обработке сообщений в подписке, это, похоже, влияет на блокировки сообщений, которые в настоящее время обрабатываются с этой подпиской. У нас есть такая схема «отбрасывания» сообщения в подписке (сценарии опроса), поэтому в нашем случае исходный случай не может быть «завершен», а дубликат помещается в подписку по нашему коду. –