Группы сущностей Google App Engine заблокированы, когда записи не находятся в транзакции - PullRequest
1 голос
/ 24 сентября 2019

У меня есть приложение с вопросом-ответом-комментарием (аналогично stackoverflow).Вопросы и связанные с ними ответы и комментарии логически образуют часть групп сущностей, как это определено в Документах App Engine .

Я хочу использовать группы сущностей / пути предков для группировки моих сущностей по двум причинам.:

  1. Повышение эффективности запросов за счет физического хранения сущностей Вопросов и Ответов
  2. Позвольте мне выполнять запросы предков, что исключает необходимость хранить ключи Ответа на сущности Вопрос (взаимосвязи)

Мне не нужна сильная согласованность, поскольку в конечном итоге это приведет к конфликту.

Всегда ли App Engine блокирует группу объектов при обновлении или только когда обновление выполняется в транзакции?Другими словами, вынуждают ли группы сущностей выполнять обновления в транзакциях или просто предоставляют возможность использовать транзакции?

1 Ответ

2 голосов
/ 24 сентября 2019

О вашей первой причине выбора подхода, основанного на происхождении - я не думаю, что когда-либо видел какие-либо обещания в отношении физического местоположения в хранилище данных - я думаю, что любое такое ограничение вступит в противоречие с его высокой масштабируемостью.Я бы не волновался об этом, ИМХО, выигрыш от такой оптимизации эффективности, если таковой вообще был бы, незначителен.

Вы должны знать, что конфликт не имеет прямого отношения к (сильной) согласованности (согласованность действительно сводится к нулю)только на точность результатов запроса).

Конфликт, однако, напрямую связан с одновременным доступом к одной и той же группе объектов, даже для операций чтения, а не только для записи - см. Проблемы конфликта в Google App Engine .Использование предков только ухудшает ситуацию, поскольку все сущности в дереве предков находятся в одной и той же группе сущностей.

По 2-й причине (если я правильно понимаю вашу цель) вам не нужно хранить ключи ответа в своемВопрос сущности или использование родословной.Если вы сохраняете ключ вопроса (или идентификатор ключа) в объекте ответа, вы можете получить ответы на вопрос, выполняя регулярные (не являющиеся предками) запросы для объектов ответа с соответствующим ключом / идентификатором вопроса.

«Блокировка» группы объектов видна только в транзакциях (и нет, транзакции не применяются, но дважды подумайте, прежде чем пытаться записывать внешние транзакции - произойдет непреднамеренная перезапись).Но учтите, что такая блокировка эффективна только для защиты от конфликтующих операций записи, но не от конфликтов.

...