Мы внедряем систему распределенных вычислений с малой задержкой с кластером Apache Ignite. Все данные хранятся в памяти. Теперь мы поддерживаем около 600 запросов на распределенные вычисления в секунду с задержкой около 50-200 мс. Вычисления действительно сложны и включают в себя разные кэши. Мы также поддерживаем обновления наших данных.
Мы столкнулись с проблемой масштабируемости, когда данные обновляются при одновременном чтении. Наши данные не являются атомарными (задействовано несколько кэшей). Фактически все данные делятся на сегменты, и мы распределяем такие сегменты через кластер. При выполнении поискового вычисления каждый узел сканирует все свои локальные сегменты и находит результат.
Когда мы делаем одно обновление, мы затрагиваем один сегмент, где хранятся эти данные.
Но проблема в том,все вычисления поиска блокируются или повторяются во время обновления одного сегмента на одном узле, чтобы обеспечить согласованность всего результата.
Я знаю, что Hadoop ограничивает такие случаи и не позволяет обновлять в HDFS, только сохраняет новую версию. Но это не наш случай, потому что сбор разных версий данных требует много памяти и приводит к дублированию.
Существуют ли какие-либо архитектурные методы для поддержки масштабируемости с такими обновлениями?
Мы пыталисьреализуйте ОПТИМИЧЕСКИЕ операции с повторениями, но вычисления повторяются очень часто. Уровень READ_COMMITED нарушил согласованность. REPEATABLE_READ блокирует.