В моей компании мы широко используем 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;
Это работает так, как ожидалось, но мне непонятно, как Kafka автоматически этого добивается. Я предполагал, что Кафка создает внутренние темы для достижения этой цели, но я не вижу созданных внутренних тем. Javadoc для метода, похоже, подтверждают это наблюдение. Но потом я наткнулся на эту официальную страницу которые, похоже, предполагают, что Kafka использует отдельное хранилище данных, также известное как RocksDB, вместе с темой журнала изменений.
Теперь я не понимаю, при каких обстоятельствах создается тема журнала изменений. Мои вопросы
- Если поведение хранилища состояний по умолчанию является отказоустойчивым, как это предлагается на официальной странице, то где хранится это состояние? В RocksDB? В теме журнала изменений или и то, и другое?
- What are the implications of relying on RocksDB in production? (EDITED)
- As I understood, the dependency to rocksdb is transparent (just a jar file) and rocksdb stores data in local file system. But this would also means that in our case, that application will maintain a copy of the sharded data on the storage where application is running. When we replace a remote database with a KTable, it has storage implications and that is my point.
- Будут ли релизы Kafka позаботиться о том, чтобы RocksDB продолжала работать на различных платформах? (Поскольку кажется, что это зависит от платформы и написано не на Java)
- Имеет ли смысл уплотнять журнал входных тем?
Я использую v. 0.11.0