簡體   English   中英

使用kafka-streams有條件地對json輸入流進行排序

[英]using kafka-streams to conditionally sort a json input stream

我是開發kafka-streams應用程序的新手。 我的流處理器旨在根據輸入json消息中的用戶鍵值對json消息進行排序。

Message 1: {"UserID": "1", "Score":"123", "meta":"qwert"}
Message 2: {"UserID": "5", "Score":"780", "meta":"mnbvs"}
Message 3: {"UserID": "2", "Score":"0", "meta":"fghjk"}

我在這里閱讀了動態地將Kafka輸入流連接到多個輸出流的動態解決方案。

在我的用例中,我知道排序輸入流所需的用戶鍵和輸出主題。 因此,我正在編寫針對每個用戶的單獨處理器應用程序,其中每個處理器應用程序都與一個不同的UserID匹配。

所有不同的流處理器應用程序都從kafka中的相同json輸入主題中讀取,但是如果滿足預設的用戶條件,則每個應用程序僅將消息寫入特定用戶的輸出主題。

public class SwitchStream extends AbstractProcessor<String, String> {
        @Override
        public void process(String key, String value) {
            HashMap<String, String> message = new HashMap<>();
            ObjectMapper mapper = new ObjectMapper();
            try {
                message = mapper.readValue(value, HashMap.class);
            } catch (IOException e){}

            // User condition UserID = 1
            if(message.get("UserID").equals("1")) {
                context().forward(key, value);
                context().commit();
            }
        }

        public static void main(String[] args) throws Exception {
            Properties props = new Properties();
            props.put(StreamsConfig.APPLICATION_ID_CONFIG, "sort-stream-processor");
            props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
            props.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
            props.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());

            props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
            TopologyBuilder builder = new TopologyBuilder();
            builder.addSource("Source", "INPUT_TOPIC");
            builder.addProcessor("Process", SwitchStream::new, "Source");
            builder.addSink("Sink", "OUTPUT_TOPIC", "Process");

            KafkaStreams streams = new KafkaStreams(builder, props);
            streams.start(); 
       }
}

問題1:如果使用低級處理器API,是否可以使用高級流DSL輕松實現相同的功能? (我承認我發現很難理解並遵循High-Level Streams DSL的其他在線示例)

問題2:輸入json主題正在以20K-25K EPS的高速率獲取輸入。 我的處理器應用程序似乎無法跟上該輸入流的速度。 我曾嘗試部署每個進程的多個實例,但結果遠不及我希望的那樣。 理想情況下,每個處理器實例應能夠處理3-5K EPS。

有沒有辦法使用高級流DSL改善我的處理器邏輯或編寫相同的處理器邏輯? 那會有所作為嗎?

您可以通過filter()在高級DSL中執行此操作(有效地實現了過濾器,因為只有在userID==1才返回消息)。 您可以使用KStream#branch()來概括此過濾器模式(有關更多詳細信息,請參閱文檔: http : KStream#branch() )。 另請閱讀JavaDocs: http ://kafka.apache.org/0102/javadoc/index.html?org/apache/kafka/ streams

KStreamBuilder builder = new KStreamBuilder();
builder.stream("INPUT_TOPIC")
       .filter(new Predicate() {
           @Overwrite
           boolean test(String key, String value) {
               // put you processor logic here
               return message.get("UserID").equals("1")
           }
        })
       .to("OUTPUT_TOPIC");

關於性能。 一個實例應該能夠處理10K +條記錄。 沒有任何進一步的信息,很難說出問題可能出在哪里。 我建議在Kafka用戶列表中詢問(請參閱http://kafka.apache.org/contact

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM