Почему Apache Kafka Streams использует RocksDB, и как можно изменить его?

Во время исследования в рамках новых функций в Apache Kafka 0,9 и 0,10, мы использовали KStreams и KTables. Есть интересный факт, что Кафка использует RocksDB внутри. См. Представление потоков Kafka: упрощена обработка потоков. RocksDB написан не на языке, совместимом с JVN, поэтому требует тщательной обработки развертывания, так как для него требуется дополнительная общая библиотека (зависит от ОС).

И здесь есть простые вопросы:

  • Почему Apache Kafka Streams использует RocksDB?
  • Как это можно изменить?

Я пытался найти ответ, но вижу только неявную причину, по которой RocksDB очень быстро выполняет операции в диапазоне около миллионов операций в секунду.

С другой стороны, я вижу некоторые БД, которые закодированы в Java, и, возможно, они могут сделать это из конца в конец, так как они не используют JNI.

Ответ 1

RocksDB используется по нескольким (внутренним) причинам (как вы уже упоминали, например, о его производительности). Концептуально, Kafka Streams не нуждается в RocksDB - он используется в качестве внутреннего кэша значения ключа, и любой другой магазин, предлагающий аналогичную функциональность, также будет работать.

Комментарий от @miguno ниже (перефразирован):

Одним из важных преимуществ RocksDB по сравнению с чистыми хранилищами ключей в памяти является возможность записи на диск. Таким образом, Kafka Streams может поддерживать состояние, превышающее объем доступной основной памяти.

Комментарий от @miguno выше:

К вашему сведению: "RocksDB is not written in JVN compatible language, so it needs careful handling of the deployment, as it needs extra shared library (OS dependent)." Как пользователь Kafka Streams вам не нужно ничего устанавливать.

Используя Kafka Streams DSL, начиная с выпуска 0.10.2 (KAFKA-3825) можно подключать пользовательские хранилища состояний и использовать другое хранилище значений ключей.

Используя Kafka Streams Processor API, вы можете создать собственное хранилище через интерфейс StateStore и подключить его к узлу процессора в вашей топологии.