Последовательная реализация изменения одного и того же элемента в таблице DynamoDB на нескольких машинах - несколько потоков - PullRequest
0 голосов
/ 15 мая 2019

У меня есть элемент (номер) в таблице DynamoDB.Это значение считывается в службе, увеличивается и обновляется обратно в таблицу.Есть несколько машин с несколькими потоками, делающими это одновременно.Моя проблема здесь в том, чтобы иметь возможность прочитать правильное непротиворечивое значение и обновить правильное значение.

Я попытался сделать приращение и обновить в синхронизированном блоке Java.Тем не менее, я все еще заметил несоответствия в счете в конце.Кажется, он не обновляется согласованным образом.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

«Моя проблема здесь в том, чтобы иметь возможность прочитать правильное непротиворечивое значение и обновить правильное значение.»

Для чтения / записи правильного согласованного значения

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

  • ConditionExpression (укажите в своем запросе):
    • в вашем запросе вы можете указать, что обновлять значение, если некоторые условия выполняются (например, текущее значение в db совпадает со значением, которое вы прочитали ранее. Это означает, что никто не обновлял его между), в противном случае он возвращает ConditionalCheckFailedException, и вам нужно чтобы обработать это в вашем коде, чтобы повторить, ...

Итак, , чтобы ответить на ваш вопрос , сначала вам нужно быть полностью последовательным, чтобы получить текущее значение счетчика в дБ. Затем, чтобы обновить его, ваш запрос должен выглядеть следующим образом (удалены ненужные параметры), и вы должны обработать исключение ConditionalCheckFailedException в вашем коде:

   "TableName": "counters",
  "ReturnValues": "UPDATED_NEW",
  "ExpressionAttributeValues": {
    ":a": currentValue,
    ":bb": newValue
  },
  "ExpressionAttributeNames": {
    "#currentValue": "currentValue"
  },
**// current value is what you ve read
// by Strongly Consistent **
  "ConditionExpression": "(#currentValue = :a)",  
  "UpdateExpression": "SET #currentValue = :bb", // new counter value
0 голосов
/ 16 мая 2019

В каждой записи хранится значение типа uuid (длинная случайная строка), всякий раз, когда вы пытаетесь обновить запись, отправьте запрос на обновление, который должен обновляться, только если uuid равно значению, которое вы прочитали. И обновите значение uuid.

синхронизированный блок не будет работать, если вы пытаетесь записывать с нескольких машин вместе.

...