Kafka Stream Topology ในหลายอินสแตนซ์

เรามีโทโพโลยีสตรีมที่จะทำงานกับเครื่องหลายเครื่อง เรากำลังจัดเก็บผลลัพธ์การรวมกลุ่มที่มีกรอบเวลาไว้ในร้านค้าของรัฐ เนื่องจากร้านค้าของรัฐกำลังจัดเก็บข้อมูลในเครื่อง การรวมจึงควรดำเนินการในหัวข้ออื่นสำหรับการรวมโดยรวม ฉันคิดว่า แต่ดูเหมือนว่าฉันขาดอะไรบางอย่างไปเพราะไม่มีตัวอย่างใดที่รวบรวมโดยรวมใน KStream หรือโปรเซสเซอร์อื่น

เราจำเป็นต้องใช้ตรรกะ groupBy เพื่อจัดเก็บการรวมกลุ่มโดยรวม หรือใช้ GlobalKtable หรือเพียงแค่ใช้รหัสการควบรวมของเราเองในที่ใดที่หนึ่งหรือไม่?

สถาปัตยกรรมที่ถูกต้องสำหรับสิ่งนี้คืออะไร?

ในโค้ดด้านล่างนี้ ฉันได้พยายามจัดกลุ่มข้อความทั้งหมดที่มาถึงโปรเซสเซอร์ด้วยคีย์คงที่เพื่อจัดเก็บการรวมกลุ่มโดยรวมไว้ในเครื่องเพียงเครื่องเดียว แต่ฉันคิดว่ามันจะสูญเสียความขนานที่ Kafka จัดหาให้ไป

dashboardItemProcessor = streamsBuilder.stream("Topic25", Consumed.with(Serdes.String(), eventSerde))
        .filter((key, event) -> event != null && event.getClientCreationDate() != null);

 dashboardItemProcessor.map((key, event) -> KeyValue.pair(key, event.getClientCreationDate().toInstant().toEpochMilli()))
       .groupBy((key, event) -> "count", Serialized.with(Serdes.String(), Serdes.Long()))
       .windowedBy(timeWindow)
       .count(Materialized.as(dashboardItemUtil.getStoreName(itemId, timeWindow)));

person talhaocakci    schedule 11.09.2018    source แหล่งที่มา
comment
ทันทีที่คุณต้องการจัดกลุ่มคีย์ คุณจะถ่ายโอนข้อมูลทั้งหมดไปยังโปรเซสเซอร์ตัวเดียวได้อย่างมีประสิทธิภาพ โดยไม่คำนึงถึงเฟรมเวิร์กที่ใช้ (เช่น หากคุณทำสิ่งเดียวกันใน Spark) ยังไม่ชัดเจนว่าทำไมคุณต้องจัดกลุ่มทุกอย่างและคีย์ใหม่   -  person OneCricketeer    schedule 12.09.2018
comment
คุณบอกว่าเราไม่จำเป็นต้องผสานผลลัพธ์ที่มาจากอินสแตนซ์ที่แตกต่างกันของโทโพโลยีเดียวกันด้วยตนเองใช่ไหม   -  person talhaocakci    schedule 12.09.2018
comment
ไม่ชัดเจนว่าหมายถึงข้อมูลที่คุณได้รับหรือคาดหวังเป็นผลลัพธ์ หากคุณต้องการให้บางสิ่งขนานกัน ตามหลักการแล้ว มันจะไม่เป็นตัวอย่างการนับจำนวนคำที่นับเฉพาะคำเท่านั้น ตัวอย่างเช่น คุณอาจต้องการนับด้วย event.getName() หรือ event.getClientUuid() หรือคล้ายกัน แต่อย่างที่ฉันบอกไป ฉันไม่รู้ข้อมูลของคุณ   -  person OneCricketeer    schedule 12.09.2018


คำตอบ (1)


ในโค้ดด้านล่างนี้ ฉันได้พยายามจัดกลุ่มข้อความทั้งหมดที่มาถึงโปรเซสเซอร์ด้วยคีย์คงที่เพื่อจัดเก็บการรวมกลุ่มโดยรวมไว้ในเครื่องเพียงเครื่องเดียว แต่ฉันคิดว่ามันจะสูญเสียความขนานที่ Kafka จัดหาให้ไป

นี่ดูเหมือนจะเป็นแนวทางที่ถูกต้อง และใช่ คุณสูญเสียความเท่าเทียม แต่นั่นคือวิธีการทำงานของการรวมกลุ่มทั่วโลก สุดท้ายก็ต้องมีเครื่องหนึ่งมาคำนวณ...

สิ่งที่คุณสามารถปรับปรุงได้คือดำเนินการสองขั้นตอน กล่าวคือ ขั้นแรกให้รวมโดยใช้คีย์ "สุ่ม" พร้อมกัน และใช้ขั้นตอนที่สองที่มีเพียงคีย์เดียวเพื่อ "รวม" การรวมบางส่วนเป็นคีย์เดียว ด้วยวิธีนี้ การคำนวณบางส่วนจะถูกขนานกัน และเฉพาะขั้นตอนสุดท้ายเท่านั้น (ซึ่งหวังว่าจะลดภาระข้อมูลลง) เท่านั้นที่ไม่ขนานกัน เมื่อใช้ Kafka Streams คุณจะต้องใช้แนวทางนี้ "ด้วยตนเอง"

person Matthias J. Sax    schedule 12.09.2018
comment
ดังนั้นเราควรปรับใช้ตัวลดขนาดโปรเซสเซอร์เป็นโมดูลแยกต่างหากและไม่ต้องปรับขนาดขนาดนั้นใช่ไหม - person talhaocakci; 13.09.2018
comment
คุณจะมีตัวลดสองตัว คุณยังคงปรับใช้ทั้งสองอย่างได้ในแอปพลิเคชันเดียว หากคุณตั้งค่าซิงเกิลตันคีย์หลังจากการย่อครั้งแรก ข้อมูลทั้งหมดจะไปยังอินสแตนซ์เดียวของตัวลดอันที่สองอยู่แล้ว - person Matthias J. Sax; 13.09.2018