Потоковое решение с движком приложений Google - PullRequest
1 голос
/ 21 марта 2012

У меня есть «очередь» из примерно миллиона объектов в Google App Engine.Я должен «вытолкнуть» элементы из очереди с помощью запроса.

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

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

Возможно, мне нужно каким-то образом использовать транзакции, но когда я посмотрел на это,было несколько "гучей".Как можно решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Есть ли какая-либо причина не реализовывать "очередь" с помощью App Engine TaskQueue API ? Если проблема связана с размером очереди, TaskQueue может содержать до 200 миллионов задач для платного приложения, поэтому миллион объектов будет легко обработан.

Если вы хотите иметь возможность имитировать запросы для определенной задачи в очереди, вы можете использовать теги задач , и ваш клиентский процесс извлекает задачи с определенным тегом для обработки. Обратите внимание, что задачи извлечения поддерживаются через очереди извлечения , а не очереди извлечения .

Кроме этого, если вы хотите сохранить реализацию «очередь как сущность», вы можете использовать Memcache API , чтобы сигнализировать клиентскому процессу, какую сущность необходимо обработать. Memcache обеспечивает более высокую согласованность, когда вам нужно обмениваться данными между экземплярами вашего приложения, по сравнению с возможной согласованностью хранилища данных HRD, с оговоркой, что данные в Memcache могут быть потеряны в любой момент времени.

1 голос
/ 21 марта 2012

Я вижу два пути решения этой проблемы:

  1. То, что вы делаете, в порядке, вам просто нужно использовать транзакции. Если ваши процессы длиннее 30 с, вы можете перенести их в очередь задач, которая может быть частью транзакции.

  2. Вы можете использовать Очереди получения , где вы заполняете очередь, а затем клиентские процессы извлекают задачи из очереди атомарным способом (цикл аренды-удаления). С Pull Queues вы можете быть уверены, что задача сдана в аренду только один раз. Также задача должна быть вручную удалена из очереди после того, как она будет выполнена, то есть если ваш процесс умирает, задача будет возвращена в очередь после истечения срока аренды.

...