Как мы можем реализовать масштабируемую Compute Grid с массовыми параллельными обновлениями памяти, поддерживающими низкую задержку и согласованность - PullRequest
1 голос
/ 19 октября 2019

Мы внедряем систему распределенных вычислений с малой задержкой с кластером Apache Ignite. Все данные хранятся в памяти. Теперь мы поддерживаем около 600 запросов на распределенные вычисления в секунду с задержкой около 50-200 мс. Вычисления действительно сложны и включают в себя разные кэши. Мы также поддерживаем обновления наших данных.

Мы столкнулись с проблемой масштабируемости, когда данные обновляются при одновременном чтении. Наши данные не являются атомарными (задействовано несколько кэшей). Фактически все данные делятся на сегменты, и мы распределяем такие сегменты через кластер. При выполнении поискового вычисления каждый узел сканирует все свои локальные сегменты и находит результат.

Когда мы делаем одно обновление, мы затрагиваем один сегмент, где хранятся эти данные.

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

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

Существуют ли какие-либо архитектурные методы для поддержки масштабируемости с такими обновлениями?

Мы пыталисьреализуйте ОПТИМИЧЕСКИЕ операции с повторениями, но вычисления повторяются очень часто. Уровень READ_COMMITED нарушил согласованность. REPEATABLE_READ блокирует.

1 Ответ

0 голосов
/ 21 октября 2019

Я думаю, что вы можете взять блок транзакций (сегмент?), Оптимизировать его, удалив дубликаты и объединяя операции, работающие над одними и теми же ключами, чтобы выполнить одну операцию, а затем выполнить оставшуюся транзакцию транзакционно.

...