Согласованность общего распределенного кеша

введите здесь описание изображения

Давайте посмотрим на простую схему моей системы. По сути, есть две (или более) службы, которые выполняют простые операции с базой данных SQL: READ, UPDATE, WRITE. После записи (чтения) записи E в (из) базы данных она записывается в распределенный кеш (Redis). Следующие чтения E будут считываться E из кеша Redis для достижения более высокой пропускной способности. В принципе работает корректно.

Однако я рассматриваю следующую ситуацию:

Кэш пуст.

Process A (reads the entry `E`)     Process B (updates the entry `E`)           
   
READ(E, cache) = EMPTY     
READ(E, db) = E1
                                          WRITE(E2, db) 
                                          WRITE(E2, cache)
WRITE(E1, cache)                          
     

Итак, наконец, есть устаревшее E1, сохраненное в кэше.

  1. Это конечная согласованность?
  2. Как решить мою проблему?
  3. Не могли бы вы порекомендовать мне что-нибудь почитать о таких проблемах и методах их решения? Я кое-что знаю о распределенных системах (например, теорема CAP и т. д.)

Заранее спасибо.


person Gilgamesz    schedule 30.04.2021    source источник


Ответы (1)


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

Это сказало. В качестве первого простого шага я бы добавил небольшой слой между базой данных и клиентским процессом. Такой слой будет отвечать за операции записи процесса атомарно (запись в БД, ожидание ACK, запись в кеш).

person Benedetto    schedule 30.04.2021