2016-12-16 1 views
3

Эта новая функция Change Feed, предоставляемая DocumentDB, довольно крутая. Однако в документации указано:DocumentDB Change Feed - Как просмотреть все изменения в документе

Каждое изменение документа появляется только один раз в ленте изменения. Только последнее изменение для данного документа включено в журнал изменений. Промежуточные изменения могут быть недоступны.

В принципе, если документ перешел из ревизии A-> B-> C, когда подана лента изменений, мы собираемся получить «C.», - У меня есть ситуация, когда я хочу видеть «А» и «В».

Я знаю несколько существующих шаблонов, чтобы решить эту проблему, но я действительно надеялся использовать эту новую функцию Feed Feed. Я надеялся, что он вернет A, B и C.

Является ли намерение этой функции иметь «рабочих» опрос службы очень часто? Очевидно, что чем чаще опроса работников, тем менее вероятно, что они должны пропустить пересмотр документа. Тем не менее, я бы не хотел отрицательно влиять на производительность коллекции в результате.

+0

Просто думая вслух, вы не можете использовать триггеры DocumentDB для этой цели - https://docs.microsoft.ком/ан-нас/лазурь/documentdb/documentdb-программирование # а-idtriggera-базы-триггеров? У вас может быть триггерный огонь после каждого обновления документа, который будет иметь код для идентификации изменения и внесения изменений в журнал изменений. –

+0

Правильно, триггер может позволить мне захватить diff. Затем я бы включил изменения в самом документе или в отдельный документ. Либо достаточно распространенные шаблоны в зависимости от ожидаемого количества обновлений. Тем не менее, у меня есть внешняя система, которая должна видеть ВСЕ версии, для целей хранения данных. Это проблема только с триггером + sproc. – Jmoney38

+2

Но для чьего-либо пособия, читая это ... Было бы возможно 1) использовать триггер для захвата различий, 2) внедрить различия в документе, 3) обнаружить обновленный документ в Change Feed, 4) обработать ситуация, в которой вы уже «обработали» обновления 0- [i-1] и 5) обрабатываете ситуацию, в которой вы видите более одного «нового» обновления на одной и той же итерации. - Это просто обслуживание + кодирование. Я надеялся, что с момента последнего звонка на «Изменить канал» у меня есть поток ВСЕХ обновлений для документа. – Jmoney38

ответ

9

ДокументDB член команды здесь. Я начну говоря, пожалуйста, предложить/голосовать за поддержку всех версий/поколений документа здесь: http://feedback.azure.com/forums/263030-documentdb

Цель перемен поток поддержки последней версии по двум причинам:

  1. Многие проблемы, как синхронизация данных и обработка потока основываются на последней версии и не нуждаются в промежуточных версиях.
  2. Этот подход имеет то преимущество, что не требует дополнительного хранилища для хранения всех версий или наличия периода времени для доступности ленты обновлений.

Вы упомянули, что уже знаете об обходных решениях, но я просто укажу это на благо других: эту проблему можно решить, инвертируя то, что хранится в DocumentDB. То есть вы можете хранить все версии в DocumentDB путем создания новых документов, а затем консолидировать их через ленту изменений, обновив последнюю версию.

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

  1. Изменение статуса является гораздо более эффективным. Запрос «порядок по метке времени» по распределенному набору данных выполняет глобальный сортировку, тогда как «Изменить канал» сортируется локально на временной отметке разделов. Кроме того, нет служебных данных синтаксического анализа
  2. Часовое время менее значимо в распределенных системах из-за перекоса часов, и важно различать несколько обновлений в течение секунды/миллисекунды. Вместо этого вам нужно «логическое время», представляющее точный порядок фиксации в базе данных. С лентой изменения обновления в разделе раздела находятся в точном порядке фиксации, и вы получаете все документы, обновленные в транзакции, отмеченной той же логической меткой времени.
  3. Изменение подачи может быть распределено распределенным способом между несколькими работниками, в отличие от запроса. Это отлично работает при работе с масштабируемыми вычислительными платформами, такими как Apache Storm или Azure Functions.
+0

Привет, Aravind. Спасибо за ответ. Я понял, что причина связана с дополнительными расходами на хранение. – Jmoney38

+0

Aravind - вы можете пролить свет на пользу этой функции по сравнению с клиентом, который постоянно запускает запрос, который выбирает автоматическую отметку времени? Возможно, есть различия в производительности? Похоже, что стоимость - это фактор. Запрос будет зависеть от стоимости RU для выполнения запроса, тогда как Change Feed заявляет, что никаких других затрат не понесено, кроме того, что тянет документы по проводу? – Jmoney38

+0

Многие причины. 1) Гораздо эффективнее. Запрос «порядок по метке» по распределенному набору данных менее эффективен по сравнению с упорядоченным по метке времени в пределах разделов/диапазонов ключей. Кроме того, нет служебных данных синтаксического анализа ... –

Смежные вопросы