Вчера у нас была ужасная проблема / опыт, когда мы пытались поменять местами нашу постановочную ‹--> производственную роль.
Вот наша установка:
У нас есть рабочая роль, которая забирает сообщения из очереди. Эти сообщения обрабатываются ролью. (Вставки для хранения таблиц, выбор БД и т. Д.). Это может занять 1-3 секунды на сообщение очереди в зависимости от того, сколько сообщений в хранилище таблиц ему нужно сделать. Он удалит сообщение, когда все будет готово.
Проблема при замене:
Когда наш промежуточный проект был запущен в онлайн, наша рабочая роль начала давать ошибки.
Когда роль хотела обработать сообщение очереди, она выдавала постоянный поток ошибок EntityAlreadyExists. Из-за этих ошибок сообщения очереди не удалялись. Это привело к тому, что сообщения очереди были помещены обратно в очередь и обратно для обработки и так далее ....
Заглянув внутрь этих сообщений очереди и проанализировав, что с ними произойдет, мы увидели, что они действительно были обработаны, но не удалены.
Проблема не закончилась при удалении этих ошибочных сообщений. Новые сообщения в очереди также не обрабатывались, поскольку они еще не обрабатывались и не добавлялись записи хранилища таблиц, что звучит очень странно.
При удалении промежуточного и производственного этапов и повторной публикации в продакшн все стало работать нормально.
Возможные проблемы?
Мы мало 2 понятия не имеем, что произошло на самом деле.
- Может быть, обе роли получили одни и те же сообщения, одна из них написала сообщение, а другая допустила ошибку?
- ...???
Возможное решение?
У нас есть некоторые идеи, как решить эту «проблему».
- Сделать аварийное сообщение для отработки отказа системы? Когда счетчик удаления из очереди превышает X, мы должны просто удалить это сообщение из очереди или поместить его в отдельную «подозрительную очередь».
- Перехватите ошибку EntityAlreadyExists и просто удалите это сообщение из очереди или поместите его в отдельную очередь.
- ...????
Несколько ролей
Полагаю, у нас возникнет такая же проблема при назначении нескольких ролей?
Большое спасибо.
РЕДАКТИРОВАТЬ 24/02/2012 - Дополнительная информация
- На самом деле мы используем GetMessage ()
- Каждый элемент в очереди уникален и будет генерировать уникальные сообщения в таблице Storage. Немного дополнительной информации о процессе: пользователь что-то публикует, и его нужно будет распространить среди других пользователей. Сообщение, сгенерированное этим пользователем, будет иметь уникальный идентификатор (guid). Это сообщение будет отправлено в очередь и получено рабочей ролью. Сообщение распределяется по нескольким другим таблицам (partitionkey -> UserId, rowkey -> Некоторая отметка времени в тиках и уникальный идентификатор сообщения. Таким образом, почти нет шансов, что те же сообщения будут отправлены в нормальной ситуации.
- Тайм-аут невидимости МОЖЕТ быть логическим объяснением, потому что некоторые сообщения могут быть распределены по 10-20 таблицам. Это означает 10-20 вставок без возможности пакетной обработки. Можете ли вы установить или увеличить это время невидимости?
- Отсутствие удаления сообщения из очереди из-за исключения МОЖЕТ быть объяснением, потому что мы еще не реализовали какое-либо подозрительное сообщение при сбое;).