AWS DynamoDB дает странное ResourceNotFoundException, но регион задан явно - PullRequest
0 голосов
/ 20 сентября 2019

Я определил регион моей DynamoDB следующим образом:

const AWS = require('aws-sdk');

AWS.config.update({ region: process.env.TABLE_REGION });

const dynamodb = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10', region: process.env.TABLE_REGION });

, где process.env.TABLE_REGION относится к региону, который я определил.Это может показаться немного излишним, но я продолжаю находить ответы, в которых говорится, что «указан неправильный регион», когда мне кажется, что это не совсем так.

Проблема в том, что иногда, когда я обновляютаблица (обычно несколько сотен одновременных PUT) Я иногда получаю исключение ResourceNotFoundException с сообщением «Запрошенный ресурс не найден». Подавляющее большинство PUT работают, только случайные - нет. Я бы предположил, что это некоторыесвоего рода регулирующее сообщение, но я не могу найти никакой документации, поддерживающей использование этого исключения. Кроме того, емкость моей базы данных находится в пределах целевых значений.

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

Помощьбудет признателен, спасибо.

РЕДАКТИРОВАТЬ:

Некоторые примеры кода (немного сложно обобщить / воспроизвести, так как скрипт довольно большой, но будет делать все возможное).В лучшем случае это только псевдокод;Я должен отметить, что код прошел много итераций, но результат тот же.Думать, что проблема более фундаментальная, чем просто выявление ошибок в коде.Кроме того, часто работает, просто иногда нет:

Кроме того, это PUT.Когда я говорю «обновить» таблицу, я не очень точен, скорее в смысле «внести изменения» в таблицу, а точнее «сделать вставки в».

const posts = [...];

const addPost = async ({ post }) => {
  await dynamodb.put({
      TableName: tableName,
      Item: {
          PartitionKey: organizationId + '-POST',
          SortKey: post.creationTime + '--' + post.id,
          ...post
      }
  }).promise();
};

const addAllPosts = async ({ sum = [], posts, index = 0 }) => {
  if (posts[index] === undefined) {
    await Promise.all(sum);

    return;
  }

  const post = posts[index];

  sum.push(addPost({ post }));

  if (sum.length === 300) {
    await Promise.all(sum);
    sum = undefined;
  } 

  await addAllPosts({ posts, sum, index: index + 1 });
};

await addAllPosts({ posts });

Основная идеяявляется то, что я хочу делать вставки в пакетах не более 300, поэтому я могу ожидать единиц записи в БД.

FULL ERROR:

Это происходит только изредка, но когда это происходит, конечно,ломает все:

{
    "errorType": "Runtime.UnhandledPromiseRejection",
    "errorMessage": "ResourceNotFoundException: Requested resource not found",
    "stack": [
        "Runtime.UnhandledPromiseRejection: ResourceNotFoundException: Requested resource not found",
        "    at process.on (/var/runtime/index.js:37:15)",
        "    at process.emit (events.js:198:13)",
        "    at process.EventEmitter.emit (domain.js:448:20)",
        "    at emitPromiseRejectionWarnings (internal/process/promises.js:119:20)",
        "    at process._tickCallback (internal/process/next_tick.js:69:34)"
    ],
    "reason": {
        "errorType": "ResourceNotFoundException",
        "errorMessage": "Requested resource not found",
        "code": "ResourceNotFoundException",
        "stack": [
            "ResourceNotFoundException: Requested resource not found",
            "    at Request.extractError (/var/task/node_modules/aws-sdk/lib/protocol/json.js:51:27)",
            "    at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:106:20)",
            "    at Request.emit (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:78:10)",
            "    at Request.emit (/var/task/node_modules/aws-sdk/lib/request.js:683:14)",
            "    at Request.transition (/var/task/node_modules/aws-sdk/lib/request.js:22:10)",
            "    at AcceptorStateMachine.runTo (/var/task/node_modules/aws-sdk/lib/state_machine.js:14:12)",
            "    at /var/task/node_modules/aws-sdk/lib/state_machine.js:26:10",
            "    at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:38:9)",
            "    at Request.<anonymous> (/var/task/node_modules/aws-sdk/lib/request.js:685:12)",
            "    at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"
        ],
        "message": "Requested resource not found",
        "time": "2019-09-23T23:22:54.784Z",
        "requestId": {redacted},
        "statusCode": 400,
        "retryable": false,
        "retryDelay": 3.7761727886367558
    },
    "promise": {}
}
...