С очередями вам нужно кодировать с учетом идемпотентности, ожидать и обрабатывать EntityAlreadyExists как жизнеспособный ответ.
Как и предполагали другие, причины могут быть
- Несколько сообщений в очереди с одинаковым идентификатором.
- Просматривают сообщение и не читают его из очереди, поэтому не делают его невидимым.
- Не удаляется сообщение, потому что перед тем, как вы сможете удалить его, возникло исключение.
- Слишком много времени, чтобы обработать сообщение, чтобы его нельзя было удалить (поскольку время невидимости истекло), и снова появляется
Не глядя на код, я предполагаю, что это либо опция 3, либо 4.
Если вы не можете обнаружить проблему с помощью проверки кода, вы можете подумать о добавлении регистрации по времени и обертках try / catch для лучшего понимания.
Эффективное использование очередей в многоцелевой среде требует несколько иного мышления, и раннее столкновение с такими проблемами на самом деле является скрытым благословением.
Добавлены 2/24
Просто чтобы уточнить, изменение тайм-аута невидимости не является общим решением для этого типа проблемы. Также обратите внимание, что эта функция, хотя и доступна в REST API, может быть недоступна в клиенте очереди.
Другие варианты включают асинхронную запись в хранилище таблиц для ускорения вашего времени обработки, но опять-таки это меры с ограничением пробела, которые в действительности не учитывают основную парадигму работы с очередями.
Итак, суть в том, чтобы быть идемпотентом. Вы можете попробовать использовать функцию сохранения (обновления или вставки) хранилища таблиц, чтобы избежать появления ошибки «EntitiyAlreadyExists», если это работает для вашего кода. Если все, что вы делаете, это вставляете новые сущности в хранилище таблиц Azure, тогда upsert должен решить вашу проблему с минимальным изменением кода.
Если вы делаете обновления, то это совсем другая игра с мячом. Один шаблон заключается в соединении обновлений с фиктивными вставками в одной и той же таблице с одним и тем же ключом раздела, чтобы исключить ошибку, если обновление произошло ранее, и пропустить обновление. Позже, после удаления сообщения, вы можете удалить фиктивные вставки. Однако все это добавляет сложности, поэтому гораздо лучше пересмотреть архитектуру продукта; Например, вам действительно нужно вставить / обновить столько таблиц?