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

#java-native-interface #in-memory-database #key-value-store #rocksdb #apache-kafka-streams

#java-native-interface #база данных в памяти #хранилище ключей-значений #rocksdb #apache-kafka-streams

Вопрос:

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

И здесь возникают простые вопросы:

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

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

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

Комментарии:

1. @miguno: вы правы, если ошибок нет :-). Но когда возникают ошибки и / или требуются сеансы отладки, любой неродной код делает действия довольно сложными, или? Второй вопрос заключается в том, что я не вижу в документации никакой спецификации, в которой указано, на каких платформах будут выполняться потоки Kafka, поскольку это будет ограничено разделяемыми библиотеками RocksDB. Это вопрос прозрачности.

Ответ №1:

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

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

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

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

К вашему сведению: "RocksDB is not written in JVM 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), можно подключать пользовательские хранилища состояний и использовать другое хранилище значений ключей.

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

Комментарии:

1. На странице введения kafka говорится, что uses Kafka for stateful storage . Это ложь? kafka.apache.org/intro

2. Не уверен, почему вы считаете, что это было бы неправильно? Обратите внимание, что локальные хранилища являются только кэшами — все данные, которые находятся в хранилищах, также хранятся в теме Kafka.