В моей компании мы широко используем Kafka, но мы используем реляционную базу данных для хранения результатов нескольких промежуточных преобразований и агрегаций по причинам отказоустойчивости. Сейчас мы исследуем Kafka Streams как более естественный способ сделать это. Часто наши потребности довольно просты - один такой случай
- Прослушивание входной очереди
<K1,V1>, <K2,V2>, <K1,V2>, <K1,V3>...
- Для каждой записи выполнить некоторую операцию с высокой задержкой (вызвать удаленную службу)
- Если к моменту обработки
<K1,V1>
, и оба <K1,V2>, <K1,V3>
были произведены, то я должен обработать V3, так как V2 уже устарел
Для этого я читаю тему как KTable
. Код выглядит ниже
KStreamBuilder builder = new KStreamBuilder();
KTable<String, String> kTable = builder.table("input-topic");
kTable.toStream().foreach((K,V) -> client.post(V));
return builder;
Это работает, как и ожидалось, но мне не ясно, как Кафка достигает этого автоматически. Я предполагал, что Кафка создает внутренние темы для достижения этой цели, но я не вижу созданных внутренних тем. Javadoc для метода , кажется, подтверждает это наблюдение. Но затем я наткнулся на эту официальную страницу , которая, кажется, предполагает, что Kafka использует отдельное хранилище данных, также называемое RocksDB, вместе с темой журнала изменений.
Теперь я запутался, так как при каких обстоятельствах создаются темы журнала изменений. Мои вопросы
- Если поведение хранилища состояний по умолчанию является отказоустойчивым, как предполагает официальная страница, то где хранится это состояние? В RocksDB? В теме журнала изменений или в обоих?
- Каковы последствия использования RocksDB в производстве? (Edited)
- Как я понял, зависимость от rocksdb прозрачна (просто файл jar), а rockdb хранит данные в локальной файловой системе. Но это также означает, что в нашем случае это приложение будет хранить копию защищенных данных в хранилище, где выполняется приложение. Когда мы заменяем удаленную базу данных на KTable, это влияет на хранилище, и это моя точка зрения.
- Будут ли релизы Kafka заботиться о том, чтобы RocksDB продолжал работать на различных платформах? (Поскольку это, кажется, зависит от платформы и не написано на Java)
- Имеет ли смысл сокращать журнал входных тем?
Я использую v. 0.11.0