Это классический подход к улучшению задержки записи, часто называемый обратной записью. Пакетирование обновлений и выполнение их в отдельном асинхронном потоке имеет несколько преимуществ:
- удаляет (предположительно медленные) записи в постоянное хранилище из пути обновления
- более эффективно, если вы можете пакетные обновления
- может разрешить объединение обновлений (если у вас есть несколько записей для одного и того же ключа в одном пакете, вы можете просто уничтожить все, кроме последнего, и никогда не записывать промежуточное значение вообще)
Обратная запись также имеет существенные недостатки:
- записи могут быть потеряны, если данные хранятся только в памяти
- иногда сложно заставить фоновый асинхронный поток правильно работать с остальной частью транзакционной системы
- фоновые потоки могут быть сохранены, поскольку они обрабатывают "медленную" часть операции; запись с задержкой лучше всего работает, когда она используется для ускорения случайных пиков и может восстанавливаться во время впадин
- последующие чтения между записью в память и записью в хранилище будут видеть старое значение, если только вы не проверите состояние в памяти - это может быть либо запутанным, либо потенциально дорогостоящим при чтении. Из-за этого обратная запись часто используется в сочетании с кэшированием сквозного чтения, когда все чтения происходят через кеш.
Ничто из этого, разумеется, не имеет ничего общего с ClojureQL или STM. :)