Kafka: Consumer API เทียบกับ Streams API


99

ฉันเพิ่งเริ่มเรียนรู้คาฟคาและจบลงด้วยคำถามเหล่านี้

  1. อะไรคือความแตกต่างระหว่าง Consumer และ Stream? สำหรับฉันหากเครื่องมือ / แอปพลิเคชันใด ๆ ใช้ข้อความจาก Kafka เป็นผู้บริโภคในโลก Kafka

  2. สตรีมแตกต่างกันอย่างไรเนื่องจากใช้หรือสร้างข้อความไปยังคาฟคา และเหตุใดจึงจำเป็นเนื่องจากเราสามารถเขียนแอปพลิเคชันสำหรับผู้บริโภคของเราเองโดยใช้ Consumer API และประมวลผลได้ตามต้องการหรือส่งไปยัง Spark จากแอปพลิเคชันสำหรับผู้บริโภค

ฉันใช้ Google ในเรื่องนี้ แต่ไม่ได้รับคำตอบที่ดีสำหรับเรื่องนี้ ขออภัยหากคำถามนี้ไม่สำคัญเกินไป

คำตอบ:


103

อัปเดตเมื่อวันที่ 9 เมษายน 2018 : ปัจจุบันคุณสามารถใช้ksqlDBซึ่งเป็นฐานข้อมูลการสตรีมเหตุการณ์สำหรับ Kafka เพื่อประมวลผลข้อมูลของคุณใน Kafka ksqlDB สร้างขึ้นจาก Streams API ของ Kafka และยังมาพร้อมกับการสนับสนุนระดับเฟิร์สคลาสสำหรับ "สตรีม" และ "ตาราง"

อะไรคือความแตกต่างระหว่าง Consumer API และ Streams API

Streams API ของ Kafka ( https://kafka.apache.org/documentation/streams/ ) สร้างขึ้นจากผู้ผลิตและลูกค้าผู้บริโภคของ Kafka มันมีประสิทธิภาพมากกว่าและแสดงออกมากกว่าลูกค้าผู้บริโภคของคาฟคาอย่างเห็นได้ชัด คุณลักษณะบางอย่างของ Kafka Streams API มีดังนี้

  • รองรับการประมวลผลความหมายเพียงครั้งเดียว (Kafka เวอร์ชัน 0.11+)
  • รองรับความผิดใจกว้างstateful (เช่นเดียวกับไร้สัญชาติของหลักสูตร) การประมวลผลรวมทั้งสตรีมมิ่งร่วม , การรวมและwindowing กล่าวอีกนัยหนึ่งก็คือสนับสนุนการจัดการสถานะการประมวลผลของแอปพลิเคชันของคุณแบบสำเร็จรูป
  • รองรับการประมวลผลตามเวลาเหตุการณ์เช่นเดียวกับการประมวลผลตามเวลาในการประมวลผลและเวลาในการส่งผ่านข้อมูล
  • มีการสนับสนุนชั้นหนึ่งสำหรับทั้งสตรีมและตารางซึ่งการประมวลผลสตรีมตรงตามฐานข้อมูล ในทางปฏิบัติแอปพลิเคชันการประมวลผลสตรีมส่วนใหญ่ต้องการทั้งสตรีมและตารางสำหรับการใช้งานกรณีการใช้งานตามลำดับดังนั้นหากเทคโนโลยีการประมวลผลสตรีมขาดสิ่งที่เป็นนามธรรมทั้งสองอย่าง (เช่นไม่รองรับตาราง) คุณอาจติดขัดหรือต้องใช้ฟังก์ชันนี้ด้วยตนเอง (ขอให้โชคดี ... )
  • รองรับการสืบค้นแบบโต้ตอบ (เรียกอีกอย่างว่า 'สถานะการสอบถาม ') เพื่อแสดงผลการประมวลผลล่าสุดไปยังแอปพลิเคชันและบริการอื่น ๆ
  • คือแสดงออกมากขึ้น: เรือด้วย (1) รูปแบบการเขียนโปรแกรมการทำงานDSLกับการดำเนินงานเช่นmap, filter, reduceเช่นเดียวกับ (2) รูปแบบความจำเป็นประมวลผล APIสำหรับเช่นทำประมวลเหตุการณ์ที่ซับซ้อน (CEP) และ (3) คุณยังสามารถรวม DSL และ Processor API

โปรดดูhttp://docs.confluent.io/current/streams/introduction.htmlสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ Kafka Streams API ซึ่งจะช่วยให้คุณเข้าใจความแตกต่างของผู้บริโภค Kafka ระดับล่าง ลูกค้า. นอกจากนี้ยังมีบทช่วยสอนที่ใช้ Docker สำหรับ Kafka Streams APIซึ่งฉันบล็อกไว้เมื่อต้นสัปดาห์นี้

ดังนั้น Kafka Streams API จึงแตกต่างกันอย่างไรเนื่องจากใช้หรือสร้างข้อความไปยัง Kafka ด้วย

ใช่ Kafka Streams API สามารถอ่านข้อมูลและเขียนข้อมูลไปยัง Kafka ได้

และเหตุใดจึงจำเป็นเนื่องจากเราสามารถเขียนแอปพลิเคชันสำหรับผู้บริโภคของเราเองโดยใช้ Consumer API และประมวลผลได้ตามต้องการหรือส่งไปยัง Spark จากแอปพลิเคชันสำหรับผู้บริโภค

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


8
แอปพลิเคชันจะใช้ Kafka Consumer API ผ่าน Kafka Streams API ในกรณีใด
bhh1988

4
โดยทั่วไปในสถานการณ์ที่คุณต้องการเข้าถึงโดยตรงไปยังวิธีการระดับล่างของ Kafka Consumer API ตอนนี้ Kafka Streams พร้อมใช้งานแล้วโดยทั่วไปจะทำสำหรับแอปพลิเคชันเฉพาะทางและกรณีการใช้งานที่ค่อนข้างกำหนดเอง นี่คือการเปรียบเทียบ: ลองนึกภาพว่า Kafka Streams เป็นรถยนต์ - คนส่วนใหญ่แค่อยากขับ แต่ไม่อยากเป็นช่างซ่อมรถ แต่บางคนอาจต้องการเปิดและปรับแต่งเครื่องยนต์ของรถด้วยเหตุผลใดก็ตามนั่นคือเวลาที่คุณอาจต้องการใช้ Consumer API โดยตรง (ดังที่กล่าวไว้ Kafka Streams ยังมี Processor API สำหรับความต้องการที่กำหนดเอง)
Michael G.Noll

1
ฉันคิดว่าสิ่งสำคัญที่ทำให้พวกเขาแตกต่างคือความสามารถในการเข้าถึงร้านค้า เมื่อคุณเข้าใจจุดแข็งของการใช้ร้านค้าภายในสตรีมแล้วคุณจะเข้าใจพลังของสตรีมคาฟคา
Yonatan Kiron

22

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

"Kafka Streams ช่วยลดความยุ่งยากในการพัฒนาแอปพลิเคชันโดยสร้างจากผู้ผลิต Kafka และไลบรารีผู้บริโภคและใช้ประโยชน์จากความสามารถดั้งเดิมของ Kafka ในการนำเสนอความขนานของข้อมูลการประสานงานแบบกระจายการยอมรับข้อผิดพลาดและความเรียบง่ายในการปฏิบัติงาน"

ด้านล่างนี้เป็นคุณสมบัติทางสถาปัตยกรรมที่สำคัญของ Kafka Stream โปรดดูที่นี่

  1. สตรีมพาร์ติชันและงานสตรีม: Kafka Streams ใช้แนวคิดของพาร์ติชันและงานเป็นหน่วยลอจิคัลของโมเดลแบบขนานตามพาร์ติชันหัวข้อ Kafka
  2. รุ่นเธรด: Kafka Streams อนุญาตให้ผู้ใช้กำหนดค่าจำนวนเธรดที่ไลบรารีสามารถใช้เพื่อประมวลผลแบบขนานภายในอินสแตนซ์แอ็พพลิเคชัน
  3. ร้านค้าของรัฐในท้องถิ่น : Kafka Streams ให้บริการที่เรียกว่าร้านค้าของรัฐซึ่งสามารถใช้โดยแอปพลิเคชันการประมวลผลสตรีมเพื่อจัดเก็บและสืบค้นข้อมูลซึ่งเป็นความสามารถที่สำคัญเมื่อใช้การดำเนินการที่มีสถานะ
  4. Fault Tolerance: Kafka Streams สร้างขึ้นจากความสามารถในการยอมรับข้อผิดพลาดซึ่งรวมอยู่ใน Kafka พาร์ติชัน Kafka มีให้ใช้งานได้สูงและจำลองแบบดังนั้นเมื่อข้อมูลสตรีมยังคงอยู่ใน Kafka จะพร้อมใช้งานแม้ว่าแอปพลิเคชันจะล้มเหลวและจำเป็นต้องประมวลผลใหม่

จากความเข้าใจของฉันด้านล่างนี้คือความแตกต่างที่สำคัญฉันเปิดให้อัปเดตหากขาดหายไปหรือทำให้เข้าใจผิดในประเด็นใด

ป้อนคำอธิบายภาพที่นี่ ป้อนคำอธิบายภาพที่นี่

สถานที่ใช้ผู้บริโภค - ผู้ผลิต:

  1. หากมีผู้บริโภครายเดียวให้ใช้กระบวนการข้อความ แต่ไม่แพร่กระจายไปยังหัวข้ออื่น ๆ
  2. ในฐานะที่เป็นจุดที่ 1 หากมีผู้ผลิตเพียงแค่ผลิตข้อความเราไม่จำเป็นต้องมี Kafka Stream
  3. หากข้อความของผู้บริโภคจากคลัสเตอร์ Kafka หนึ่ง แต่เผยแพร่ไปยังหัวข้อคลัสเตอร์ Kafka อื่น ในกรณีนี้แม้ว่าคุณจะใช้ Kafka Stream ได้ แต่คุณต้องใช้ Producer แยกต่างหากเพื่อเผยแพร่ข้อความไปยังคลัสเตอร์อื่น หรือใช้กลไก Kafka Consumer - Producer
  4. การประมวลผลแบบกลุ่ม - หากมีความต้องการในการรวบรวมข้อความหรือชนิดของการประมวลผลแบบแบตช์คุณควรใช้วิธีดั้งเดิมตามปกติ

สถานที่ใช้ Kafka Stream:

  1. หากคุณใช้ข้อความจากหัวข้อหนึ่งการแปลงและเผยแพร่ไปยังหัวข้ออื่น Kafka Stream จะเหมาะสมที่สุด
  2. การประมวลผลแบบเรียลไทม์การวิเคราะห์แบบเรียลไทม์และการเรียนรู้ของเครื่อง
  3. การแปลงสภาพเช่นการรวมหน้าต่างการเข้าร่วม ฯลฯ
  4. การวางแผนที่จะใช้ร้านค้าของรัฐในท้องถิ่นหรือร้านค้าของรัฐที่ติดตั้งเช่น Portworx เป็นต้น
  5. บรรลุการประมวลผลความหมายและความทนทานต่อความผิดพลาดที่กำหนดโดยอัตโนมัติหนึ่งรายการ

1
ยอดเยี่ยมมีประโยชน์จริง ๆ แต่มีข้อผิดพลาดที่สำคัญอย่างหนึ่งคือเมื่อความหมายมีอยู่ใน API ของผู้บริโภคและสตรีมแล้วยิ่งไปกว่านั้น EOS เป็นเพียงการตั้งค่ามากมายสำหรับผู้บริโภค / ผู้ผลิตในระดับล่างเช่นกลุ่มการตั้งค่านี้ร่วมกับค่าเฉพาะ รับประกันพฤติกรรม EOS ตอนนี้ฉันใช้ EOS กับ Consumer api โดยไม่มีปัญหา
uptoyou

ใช่แล้วเราสามารถกำหนดค่าความหมายได้อย่างถูกต้องครั้งเดียวใน Kafka Stream โดยการตั้งค่าคุณสมบัติอย่างไรก็ตามสำหรับผู้ผลิตและผู้บริโภคที่เรียบง่ายเราจำเป็นต้องกำหนด idempotent และการทำธุรกรรมเพื่อรองรับการทำธุรกรรมต่อหน่วย
อาทิตย์ 007

มีการเปลี่ยนแปลงถ้อยคำตามคำแนะนำ
sun007

@ sun007 ซึ่งเร็วกว่าสำหรับแอปพลิเคชั่นง่ายๆที่ไม่ต้องการความสามารถแบบเรียลไทม์? และการใช้สตรีมมิงจะเพิ่มค่าใช้จ่ายในการแปลง "พิเศษ" เช่นเดียวกับเครื่องมือระดับสูงอื่น ๆ นอกเหนือจากฟังก์ชันเนทีฟของคาฟคาหรือไม่
Nag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.