Сценарий Google App - служба кэша пропускает ключи при использовании метода getAll - PullRequest
0 голосов
/ 30 августа 2018

В моем скрипте я использую службу кэширования для хранения больших строк, разбитых на куски по 100 КБ. Недавно я обнаружил getAll метод, который сильно ускоряет процесс. К сожалению, это иногда ненадежно - он имеет тенденцию пропускать ключи при попытке загрузить много ключей одновременно (чаще всего, когда количество ключей превышает 200). Забавно, что, если я соберу недостающие ключи и снова наберу getAll только с отсутствующими ключами, все они успешно загрузятся.

Вы когда-нибудь сталкивались с подобной проблемой? Сбор данных за несколько getAll запусков решает мою проблему, но мне просто любопытно, есть ли какие-либо неопределенные ограничения.

Если кому-то интересно, вот мой метод загрузки данных с использованием getAll:

PaginatedCache.prototype._getChunksAsync = function(expectedChunkKeys) {
  var expectedChunkCount = expectedChunkKeys.length;
  var fetchedChunks = {};
  var fetchedChunkKeys = [];

  // This is done in loop, because it sometimes happens that Google cache's getAll
  // method randomly missing some keys, most often when the number of keys is greater than 200.
  // Fetching the missing keys again using getAll solves the problem.
  while (fetchedChunkKeys.length < expectedChunkCount) {
    console.log(expectedChunkCount - fetchedChunkKeys.length, 'keys need to be loaded');
    var missingKeys = this._getMissingKeys(fetchedChunkKeys, expectedChunkKeys);
    var fetchedMissingChunks = this.service.getAll(missingKeys);
    var fetchedMissingChunkKeys = Object.keys(fetchedMissingChunks);

    if (fetchedMissingChunkKeys.length === 0) {
      console.log('0 chunks loaded');
    }

    for (var missingChunkKey in fetchedMissingChunks) {
      fetchedChunks[missingChunkKey] = fetchedMissingChunks[missingChunkKey];
    }

    console.log('Loaded', fetchedMissingChunkKeys.length, 'keys');
    fetchedChunkKeys = fetchedChunkKeys.concat(fetchedMissingChunkKeys);
  }

  return fetchedChunks;
};

Проверьте также мой журнал выполнения скриптов: execution log

РЕДАКТИРОВАТЬ: я добавил простой сценарий с воспроизведением: https://script.google.com/d/1-LkE70P0JJxoTqKGnoCv0mNM6wWHFAWRbFHH1SbWbnQusHuUe53cyRgn/edit?usp=sharing

Пример журнала:

[18-09-01 15:17:06:396 CEST] Value length: 17888891
[18-09-01 15:17:06:409 CEST] Storing chunks test_data, Chunks: 175
[18-09-01 15:17:06:914 CEST] Chunk count in cache:175
[18-09-01 15:17:06:919 CEST] 175 keys need to be loaded
[18-09-01 15:17:07:278 CEST] Loaded 171 keys
[18-09-01 15:17:07:279 CEST] 4 keys need to be loaded
[18-09-01 15:17:07:282 CEST] Missing keys: ["test_data_PC_UNIQUE_KEY2_163","test_data_PC_UNIQUE_KEY2_167","test_data_PC_UNIQUE_KEY2_171","test_data_PC_UNIQUE_KEY2_174"]
[18-09-01 15:17:07:313 CEST] Loaded 4 keys
[18-09-01 15:17:08:510 CEST] Loaded 175 chunks from cache asynchronously
...