Хорошо, поэтому вы не предоставили пример, как этого требуют knightpfhor и codingoutloud .Тем не менее, вот один из самых распространенных способов работы с идемпотентными операциями: перенести необходимые действия в очередь Windows Azure.Затем, независимо от количества имеющихся у вас экземпляров рабочих ролей, только один экземпляр может работать с определенным элементом очереди одновременно.Когда сообщение очереди читается из очереди, оно становится невидимым на указанное вами время.
Теперь: во время обработки этого сообщения может произойти несколько вещей:
- Вызавершить обработку после истечения времени ожидания.Когда вы удаляете сообщение, вы получаете исключение.
- Вы понимаете, что у вас заканчивается время, поэтому вы увеличиваете время ожидания сообщения в очереди (сегодня для этого нужно вызвать REST API; одиндень, когда он будет включен в SDK).
- Что-то идет не так, вызывая исключение в вашем коде, прежде чем вы сможете удалить сообщение.В конце концов, сообщение снова становится видимым в очереди (по истечении заданного периода ожидания невидимости).
- Вы завершаете обработку до истечения времени ожидания и успешно удаляете сообщение.
Это связано с параллелизмом.Для идемпотентности вы должны убедиться, что можете повторить операцию без побочных эффектов.Например, вы рассчитываете чью-то недельную оплату, ставите в очередь задание на печать и сохраняете еженедельную оплату в строке таблицы.По какой-то причине происходит сбой, и вы либо никогда не удаляете сообщение, либо ваш код прерывается до того, как появляется возможность удалить сообщение.
Быстрая перемотка во времени и другой рабочий экземпляр (или, возможно, дажетот же) перечитывает это сообщение.На этом этапе вы теоретически должны быть в состоянии просто повторно выполнить необходимые действия.Если это не возможно в вашем случае, у вас нет идемпотентной операции.Однако в вашем распоряжении есть несколько механизмов, которые помогут вам обойти эту проблему:
- Каждое сообщение очереди имеет DequeueCount.Вы можете использовать это, чтобы определить, обрабатывалось ли ранее сообщение очереди, и, если да, предпринять соответствующие действия (например, проверить строку таблицы для этого сотрудника).
- Возможно, существуют этапы конвейера обработкиэто не может быть повторено.В этом случае: теперь у вас есть возможность изменять содержимое сообщения очереди , пока сообщение очереди все еще невидимо для других и обрабатывается вами. Итак, представьте, что вы добавляете что-то вроде | SalaryServiceCalled ,Затем чуть позже, добавив | PrintJobQueued и так далее.Теперь, если у вас есть сбой в конвейере, вы можете выяснить, где вы остановились, в следующий раз, когда прочитаете ваше сообщение.
Надеюсь, что это поможет.Какая-то стрельба в темноте здесь, не зная больше о том, чего ты пытаешься достичь.
РЕДАКТИРОВАТЬ: я думаю, я должен упомянуть, что я не вижу связи между идемпотентностью и Table Storage.Я думаю, что это скорее проблема параллелизма, поскольку идемпотентность должна быть решена при использовании Table Storage, SQL Azure или любого другого контейнера хранения.