#azure #azure-functions #azure-cosmosdb
#azure #azure-функции #azure-cosmosdb
Вопрос:
Я хотел бы узнать, как справиться с этим сценарием в Cosmos DB:
- У меня есть коллекция A с каналом изменений, который обновляет значения в коллекции B.
- У меня есть коллекция B с каналом изменений, который обновляет значения в коллекции A.
Этот сценарий создает бесконечный цикл.
Есть ли конкретный способ справиться с этим сценарием?
Комментарии:
1. Идентифицируется ли изменение, которое происходит на втором шаге? Это добавление определенного свойства? Можете ли вы добавить более подробную информацию об этом?
2. Нет, он не идентифицируется и не добавляет определенное свойство. По сути, элемент в коллекции B используется во многих элементах коллекции A. Дело в том, что изменения в элементе в коллекции B должны обновлять внедренные ссылки в коллекции A, пока все хорошо. Проблема в том, что обновленный элемент в коллекции A должен обновлять свойства элемента в коллекции B на основе его присвоенного элемента.
Ответ №1:
Похоже, что предлагаемый дизайн в корне нарушает принципы шаблона поиска событий. Как обсуждалось в связанном обзоре, важным свойством архитектуры является то, что обновления являются идемпотентными, т. Е. Что Нет побочного эффекта от нескольких эквивалентных операций. В описанном случае это означало бы, что попытки обновить элемент или внедренный элемент с тем же значением будут обнаружены и предотвращены, чтобы избежать цикла.
В общем, должен быть «источник истины» с односторонним перемещением данных. Я бы вообще избегал двухсторонних архитектур каналов изменений. Если вы пытаетесь оптимизировать операции чтения путем встраивания копии другого элемента, копия должна быть доступна только для чтения и не должна подвергаться обновлениям, которые поступают в обратном направлении. Только оригинал должен быть доступен для записи.
Комментарии:
1. Вы имеете в виду, что копия должна поддерживать только запись и удаление, чтобы ее можно было использовать только для чтения и нельзя было обновлять?
2. По сути, да. Насколько я знаю, это должно быть реализовано в коде, что невозможно на уровне Cosmos.