Как с помощью хранилища данных NDB Google App Engine обеспечить строго согласованное чтение списка сущностей после создания новой сущности?
Примером использования является то, что у меня есть сущности типа Сотрудник.
- Создать новую сущность сотрудника
- Сразу загрузить список сотрудников (включая того, который был добавлен)
Я понимаю, что приведенный ниже подход приведет к последовательному прочтению списка сотрудников, который может содержать или не включать нового сотрудника. В последнем случае это приводит к плохому опыту.
e = Employee(...)
e.put()
Employee.query().fetch(...)
Вот несколько вариантов, о которых я подумал:
ВАЖНЫЕ КВАЛИФИКАЦИИ
Меня интересует только согласованный список, прочитанный для пользователя, добавившего нового сотрудника. Меня не волнует, есть ли у других пользователей в конечном итоге последовательное чтение.
Предположим, я не хочу помещать всех сотрудников под предков, чтобы обеспечить строго согласованный запрос предков. В случае тысяч и тысяч объектов-служащих ограничение в 5 операций записи в секунду не стоит того.
Также предположим, что я хочу, чтобы запись и чтение списка были результатом двух отдельных HTTP-запросов. Теоретически я мог бы поместить и запись, и чтение в одну транзакцию (?), Но тогда это была бы конечная точка API, не относящаяся к RESTful.
Вариант 1
- Создайте новую сущность сотрудника в хранилище данных
- Кроме того, запишите новый объект сотрудника в кэш памяти, локальный файл cookie браузера, локальное мобильное хранилище.
- Запросить хранилище данных для списка сотрудников (в конечном итоге согласованный)
- Если новый объект сотрудника отсутствует в этом списке, добавить его в список (в моем коде приложения) из memcache / локальной памяти
- Предоставить результаты пользователю. Если пользователь выбирает новую сущность сотрудника, извлеките эту сущность с помощью key.get () (строго согласовано).
Вариант 2
- Создайте новую сущность сотрудника с помощью транзакции
- Запросить хранилище данных для списка сотрудников в транзакции
Я не уверен, что вариант №2 действительно работает.
- Технически, записывается ли предыдущая транзакция записи на все серверы до того, как произойдет транзакция чтения этого объекта? Или это неправильное поведение?
- Транзакции (включая XG) имеют ограничение на количество групп сущностей, и список сотрудников (каждый является своей собственной группой сущностей) может превышать этот лимит.
- Каковы недостатки транзакций только для чтения по сравнению с обычным чтением?
Мысли? Вариант №1 кажется, что он сработает, но кажется, что нужно много поработать, чтобы обеспечить последовательность при последующем чтении.