Поточно-ориентированное пакетное задание - PullRequest
0 голосов
/ 31 октября 2011

Я использую серверы appengine. Я ожидаю получить много запросов (десятков) в непосредственной близости, что приведет к тому, что некоторые из моих данных будут в несогласованном состоянии. Очистка этих данных может быть эффективно организована - например, лучше всего выполнить мой код очистки только один раз, после того как десятки запросов будут выполнены. Я не знаю точно, сколько запросов будет, или как близко они будут. Это нормально, если код очистки запускается несколько раз, но он должен выполняться после последнего запроса.

Какой лучший способ минимизировать количество циклов очистки?

Вот моя идея:

public void handleRequest() {
    manipulateData();
    if (memCacheHasCleanupToken()) {
        return; //yay, a cleanup is already scheduled
    } else {
        scheduleDeferredCleanup(5 seconds from now);
        addCleanupTokenToMemCache();
    }
}

...

public void deferredCleanupMethod() {
    removeCleanupTokenFromMemcache();
    cleanupData();
}

Я думаю, что это сломается, потому что cleanupData может получать устаревшие данные даже после того, как какой-то запрос обнаружил, что в memcache есть токен очистки (задержка HRD и т. Д.), Поэтому некоторые данные могут быть пропущены при очистке.

Итак, мои вопросы:

  1. Будет ли работать эта общая стратегия? Может быть, если я использую транзакционную блокировку для объекта хранилища данных?
  2. Какую стратегию следует использовать?

1 Ответ

1 голос
/ 01 ноября 2011

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

Одной из проблем, о которых следует помнить при выполнении описанной выше процедуры, являются условия гонки. Как уже говорилось, запрос, обрабатываемый в то же время, что и задача очистки, может проверить memcache, заметить наличие токена и пренебречь постановкой задачи очистки в очередь, пока задача очистки уже завершена, но еще не удалила ключ memcache. Самый простой способ избежать этого - сделать так, чтобы срок действия ключа memcache истек сам по себе, но до выполнения соответствующей задачи. Таким образом, вы можете запланировать повторяющиеся задачи очистки, но вы никогда не должны пропускать те, которые требуются.

...