2015-11-18 1 views
0

Обычная история. У меня есть com.google.appengine.api.search.Index, поддерживаемый моим хранилищем данных. Для каждого документа documentId является ключом определенного объекта. (Для визуализации представьте, что у меня есть «таблица» продуктов, и каждый продукт имеет ряд обзоров, поэтому каждый документ представляет собой продукт с дескриптивными данными и сопроводительными отзывами. SO ...)Должен ли я использовать очередь задач для добавления документов для индексации на AppEngine

Итак, для тех, кто знает, каждый время, когда вы обновляете Документ, вы по существу воссоздаете его. Я хочу обновлять документ каждый раз, когда пользователь добавляет обзор. Но я хочу избежать условий гонки. Но если я использую очередь задач, как бы мне это создать? Как и в случае, если это одна очередь или несколько очередей? И если несколько очередей, как мне избежать чередования данных? То есть две разные очереди одновременно обновляют один и тот же документ?

ответ

0

Я предполагаю, что вы обновляете продукт Entity каждый раз, когда новый обзор добавлен (возможно, у вас есть список обзора ключей в продукта лиц)?

Не уверен, что я понимаю подход «несколько очередей», но если вы обновите продукт объекта внутри транзакции хранилища данных вы можете enqueue a task, что воссоздает документа. Таким образом, вы можете убедиться, что документ только «обновлен», если продукт успешно обновлен, и обновления для документа могут быть сериализованы.

Предполагается, что у вас нет большого разногласия на ваш продукт объектов.

+0

У меня есть «таблица» продуктов и «таблица» отзывов. Без особого шума, в вашем примере, что должно быть «Максимальным одновременным» в очереди задач для предотвращения чередования? Спасибо за идею транзакционного вложения. Я использую Objectify и поэтому буду использовать этот подход. –

0

Ответ, чтобы избежать условий гонки при записи в хранилище данных, совпадает с традиционной базой данных: transactions. Вы можете легко использовать транзакцию, чтобы обойти состояние гонки, которое вы подняли. Нет необходимости использовать очередь задач. Транзакция гарантирует, что если ваш продукт будет обновлен в середине вашей операции, ваша операция завершится с ошибкой. Objectify (это отличный выбор) автоматически перезапустит его.

Если вы беспокоитесь о конкуренции за запись, это, в первую очередь, нужно знать: Datastore не может обрабатывать большую пропускную способность записи на одном объекте (или даже entity group). Если вам нужно обрабатывать более one or two writes per second, вам нужно разделить свои данные. В вашем примере я думаю, что вы должны хранить каждый комментарий как отдельный объект. Это устранит все заявления о записи. Вам нужно будет включить идентификатор продукта в комментарий и убедиться, что поле проиндексировано. Затем, когда вам нужен продукт и его комментарии, вы запрашиваете их все сразу.

Кроме того, FYI, одна очередь задач не означает, что за один раз будет выполняться только одна задача из этой очереди (если вы специально не настроили ее таким образом). Существует несколько вариантов ограничения скорости, с которой очередь позволяет выполнять задачи. Документация: here.

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