You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by "Guozhang Wang (Jira)" <ji...@apache.org> on 2020/05/15 21:39:00 UTC

[jira] [Commented] (KAFKA-10005) Decouple RestoreListener from RestoreCallback and not enable bulk loading for RocksDB

    [ https://issues.apache.org/jira/browse/KAFKA-10005?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17108682#comment-17108682 ] 

Guozhang Wang commented on KAFKA-10005:
---------------------------------------

Relevant rockdb APIs to explore: 

https://github.com/facebook/rocksdb/issues/2261
https://github.com/apache/kafka/pull/8661#discussion_r424771783

> Decouple RestoreListener from RestoreCallback and not enable bulk loading for RocksDB
> -------------------------------------------------------------------------------------
>
>                 Key: KAFKA-10005
>                 URL: https://issues.apache.org/jira/browse/KAFKA-10005
>             Project: Kafka
>          Issue Type: Improvement
>          Components: streams
>            Reporter: Guozhang Wang
>            Assignee: Guozhang Wang
>            Priority: Major
>
> In Kafka Streams we have two restoration callbacks:
> * RestoreCallback (BatchingRestoreCallback): specified per-store via registration to specify the logic of applying a batch of records read from the changelog to the store. Used for both updating standby tasks and restoring active tasks.
> * RestoreListener: specified per-instance via `setRestoreListener`, to specify the logic for `onRestoreStart / onRestoreEnd / onBatchRestored`.
> As we can see these two callbacks are for quite different purposes, however today we allow user's to register a per-store RestoreCallback which is also implementing the RestoreListener. Such weird mixing is actually motivated by Streams internal usage to enable / disable bulk loading inside RocksDB. For user's however this is less meaningful to specify a callback to be a listener since the `onRestoreStart / End` has the storeName passed in, so that users can just define different listening logic if needed for different stores.
> On the other hand, this mixing of two callbacks enforces Streams to check internally if the passed in per-store callback is also implementing listener, and if yes trigger their calls, which increases the complexity. Besides, toggle rocksDB for bulk loading requires us to open / close / reopen / reclose 4 times during the restoration which could also be costly.
> Given that we have KIP-441 in place, I think we should consider different ways other than toggle bulk loading during restoration for Streams (e.g. using different threads for restoration).
> The proposal for this ticket is to completely decouple the listener from callback -- i.e. we would not presume users passing in a callback function that implements both RestoreCallback and RestoreListener, and also for RocksDB we replace the bulk loading mechanism with other ways of optimization: https://rockset.com/blog/optimizing-bulk-load-in-rocksdb/



--
This message was sent by Atlassian Jira
(v8.3.4#803005)