โบรกเกอร์ข้อความดั้งเดิมและสตรีมข้อมูล


14

ตามไซต์ Kafka :

" Kakfa ใช้สำหรับสร้างท่อข้อมูลและแอพสตรีมมิ่งแบบเรียลไทม์ "

การค้นหาอินเทอร์เน็ตอย่างกว้างขวางฉันได้พบคำจำกัดความที่เป็นที่ยอมรับโดยทั่วไปของคำว่า " ข้อมูลสตรีม " คืออะไร:

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

ตอนนี้ถ้ามีสิ่งใดที่ฉันกล่าวข้างต้นไม่ถูกต้องไม่สมบูรณ์หรือผิดทั้งหมดโปรดเริ่มต้นด้วยการแก้ไขฉัน! สมมติว่าฉันติดตามมากกว่าหรือน้อยกว่านั้น ...

ตอนนี้ฉันเข้าใจแล้วว่า "การสตรีมข้อมูล" คืออะไรจากนั้นฉันก็เข้าใจว่าคาฟคาและไคเนซิสหมายถึงอะไรเมื่อพวกเขาเรียกเก็บเงินด้วยตนเองว่าเป็นตัวกลางในการประมวลผล / การเป็นนายหน้าตัวกลางสำหรับแอปพลิเคชัน แต่มันทำให้ฉันสนใจ: สามารถ / ควร "สตรีมมิดเดิลแวร์" เช่น Kafka หรือ Kinesis ใช้สำหรับข้อมูลที่ไม่ได้สตรีมมิงเช่นโบรกเกอร์ข้อความแบบดั้งเดิมหรือไม่ และในทางกลับกัน: สามารถ / ควรใช้ MQ แบบดั้งเดิมเช่น RabbitMQ, ActiveMQ, Apollo และอื่น ๆ เพื่อใช้ในการสตรีมข้อมูล?

ลองมาตัวอย่างที่แอปพลิเคชันจะส่งแบ็กเอนด์ค่าคงที่แบ็กเอนด์ของข้อความ JSON ที่ต้องถูกประมวลผลและการประมวลผลค่อนข้างซับซ้อน (การตรวจสอบการแปลงข้อมูลการกรองการรวมตัว ฯลฯ ):

  • กรณี # 1: ข้อความแต่ละเฟรมของภาพยนตร์ นั่นคือหนึ่งข้อความ JSON ต่อเฟรมวิดีโอที่มีข้อมูลเฟรมและข้อมูลเมตาที่สนับสนุนบางส่วน
  • กรณีที่ # 2: ข้อความเป็นข้อมูลอนุกรมเวลาบางทีหัวใจของใครบางคนเป็นหน้าที่ของเวลา ดังนั้นข้อความ # 1 จะถูกส่งแทน heartbeat ของฉันที่ t = 1, ข้อความ # 2 มี heartbeat ของฉันที่ t = 2, ฯลฯ
  • กรณีที่ # 3: ข้อมูลมีความแตกต่างอย่างสิ้นเชิงและไม่เกี่ยวข้องตามเวลาหรือเป็นส่วนหนึ่งของ "data stream" บางทีเหตุการณ์การตรวจสอบ / ความปลอดภัยที่ถูกไล่ออกเนื่องจากผู้ใช้หลายร้อยคนนำทางปุ่มคลิกแอปพลิเคชันและดำเนินการ

จากการที่ Kafka / Kinesis ถูกเรียกเก็บเงินและความเข้าใจของฉันเกี่ยวกับสิ่งที่ "สตรีมข้อมูล" พวกเขาดูเหมือนจะเป็นผู้สมัครที่ชัดเจนสำหรับคดี # 1 (ข้อมูลวิดีโอที่ต่อเนื่องกัน) และ # 2 (ข้อมูลอนุกรมเวลาต่อเนื่อง) อย่างไรก็ตามฉันไม่เห็นเหตุผลใด ๆ ว่าทำไมนายหน้าข้อความแบบดั้งเดิมเช่น RabbitMQ ไม่สามารถจัดการอินพุตทั้งสองได้อย่างมีประสิทธิภาพเช่นกัน

และด้วย Case # 3 เราได้รับเฉพาะเหตุการณ์ที่เกิดขึ้นและเราต้องดำเนินการตอบสนองต่อเหตุการณ์นั้น ดังนั้นสำหรับฉันนี่พูดถึงการต้องการนายหน้าแบบดั้งเดิมเช่น RabbitMQ แต่ก็ไม่มีเหตุผลใดที่คุณจะไม่มี Kafka หรือ Kinesis จัดการกับการประมวลผลข้อมูลเหตุการณ์เช่นกัน

โดยพื้นฐานแล้วฉันกำลังหารูบริกที่ระบุว่า: ฉันมีข้อมูล X พร้อมคุณสมบัติ Y ฉันควรใช้สตรีมโปรเซสเซอร์เช่น Kafka / Kinesis เพื่อจัดการมัน หรือในทางกลับกันสิ่งหนึ่งที่ช่วยฉันพิจารณา: ฉันมีข้อมูล W พร้อมคุณสมบัติ Z ฉันควรใช้นายหน้าข้อความแบบดั้งเดิมเพื่อจัดการมัน

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

คำตอบ:


6

คาฟคาจัดการในบันทึกคำสั่งของข้อความอะตอมมิก คุณสามารถดูได้เช่นเดียวกับpub/subโหมดของโบรกเกอร์ข้อความ แต่ด้วยการสั่งซื้อที่เข้มงวดและความสามารถในการเล่นซ้ำหรือค้นหากระแสข้อความในจุดใด ๆ ในอดีตที่ยังคงถูกเก็บไว้ในดิสก์ (ซึ่งอาจเป็นตลอดไป)

รสชาติของการสตรีมของคาฟคาย่อมาจากการเรียกกระบวนการระยะไกลเช่น Thrift หรือ HTTP และการประมวลผลแบบแบทช์เช่นในระบบนิเวศ Hadoop ซึ่งแตกต่างจาก RPC ส่วนประกอบสื่อสารแบบอะซิงโครนัส: ชั่วโมงหรือวันที่อาจผ่านระหว่างเมื่อมีการส่งข้อความและเมื่อผู้รับตื่นขึ้นมาและดำเนินการกับมัน อาจมีผู้รับหลายคนในเวลาต่างกันหรืออาจไม่มีใครใส่ใจที่จะใช้ข้อความ ผู้ผลิตหลายรายสามารถผลิตในหัวข้อเดียวกันโดยปราศจากความรู้ของผู้บริโภค คาฟคาไม่ทราบว่าคุณเป็นสมาชิกหรือไม่หรือมีการใช้ข้อความหรือไม่ ข้อความส่งถึงบันทึกซึ่งผู้สนใจสามารถอ่านได้

คุณสนใจข้อความเดียวไม่ใช่แค่การรวบรวมข้อความจำนวนมาก (แม้ว่าไม่ใช่เรื่องแปลกที่จะเก็บข้อความ Kafka ลงในไฟล์ Parquet บน HDFS และทำการสืบค้นเป็นตาราง Hive)

กรณีที่ 1 : คาฟคาไม่ได้รักษาความสัมพันธ์ชั่วคราวระหว่างผู้ผลิตและผู้บริโภค มันเป็นแบบที่ไม่ดีสำหรับการสตรีมวิดีโอเพราะ Kafka ได้รับอนุญาตให้ชะลอความเร็วเพิ่มความเร็วเคลื่อนย้ายได้พอดีและเริ่มต้น ฯลฯ สำหรับสื่อสตรีมมิ่งเราต้องการแลกเปลี่ยนปริมาณงานโดยรวมเพื่อแลกกับราคาต่ำและที่สำคัญกว่าคือความเสถียรแฝง เรียกว่ากระวนกระวายใจต่ำ) คาฟคาใช้ความเจ็บปวดอย่างมากที่จะไม่สูญเสียข้อความ ด้วยการสตรีมวิดีโอเรามักจะใช้ UDP และเป็นเนื้อหาที่จะวางเฟรมที่นี่และที่นั่นเพื่อให้วิดีโอทำงานต่อไป SLA ในกระบวนการที่ได้รับการสนับสนุนจากคาฟคานั้นโดยปกติแล้วจะใช้เวลาไม่กี่วินาทีในการมีสุขภาพดี SLA บนสื่อการสตรีมมีหน่วยเป็นสิบมิลลิวินาที

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

กรณีที่ 2 : อย่างแน่นอน เราใช้คาฟคาแบบนี้กับนายจ้างของฉัน

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


1
ขอบคุณ @closeparen (+1) - ฉันจะได้รับสิ่งที่คุณพูดด้วยข้อยกเว้นใหญ่ ในย่อหน้าของคุณที่เริ่มต้นด้วยประโยค " รสนิยมของสตรีมคาฟคาที่ตรงกันข้าม " ...ฉันคิดว่าฉันสามารถแทนที่คำว่า "คาฟคา" เป็น "RabbitMQ" ส่วนใหญ่และประโยคนั้นจะเป็นจริง สำหรับ RabbitMQ: ผู้ผลิตสามารถส่งข้อความและผู้บริโภคจะดึงมันลงมาและประมวลผลชั่วโมง / วันหลังจากนั้น ผู้บริโภคสามารถแนบกับคิวได้ทุกเวลาที่ต้องการและสำหรับ RabbitMQ อาจมีผู้รับหลายคนในเวลาต่างกัน
smeeb

1
คิดว่าคาฟคาเป็นเครื่องมือฐานข้อมูลที่มีโครงสร้างบันทึกเชิงแปลกประหลาด ผู้ผลิตต่อท้ายผู้บริโภคอ่าน การอ่านไม่ส่งผลกระทบต่อสถานะของคาฟคา แต่อย่างใด ผู้บริโภคสามารถรักษาเคอร์เซอร์ที่เพิ่มขึ้นเพื่อสร้างซีแมนทิกส์เหมือนกับ RabbitMQ pub / sub และนี่เป็นกรณีการใช้งานทั่วไป แต่ไม่ใช่กรณีการใช้งานเพียงอย่างเดียว
closeparen

1
คิดถึง RabbitMQ เหมือนรุ่นกระจายของโครงสร้างข้อมูลคิวในหน่วยความจำ เมื่อคุณนำอะไรบางอย่างออกจากคิวมันไม่ได้อยู่ในคิวอีกต่อไป แน่นอนว่าคุณอาจมีโทโพโลยีที่มีการจำลองแบบไปยังคิวอื่น ๆ เพื่อประโยชน์ของผู้บริโภครายอื่น แต่โดยทั่วไปคุณจะไม่สามารถพูดว่า "ให้ข้อความที่ฉันจัดการ 500 ข้อความมาแล้ว" หรือ "เริ่มคิวคิวเป็นสำเนา ของ Queue A จากที่ Queue A คือเมื่อวาน "
closeparen

2
ระบบที่ใช้คาฟคานั้นกำลังให้อภัย หากคุณไม่ชอบวิธีที่โปรแกรมของคุณทำงานคุณสามารถผลักดันการเปลี่ยนแปลงรหัสแล้วย้อนกลับอินพุตได้ คุณสามารถหยุดผู้บริโภค RabbitMQ โดยไม่ส่งผลกระทบต่อผู้ผลิต แต่คุณจะไม่สามารถกลับไปที่อดีต
closeparen

1
Ahhh: หลอดไฟ: ขอบคุณ (+1 สำหรับทั้ง 3)! ดังนั้นนี่จึงเป็นกรณีที่น่าสนใจสำหรับคาฟคา: ความสามารถในการกลับมาอีกครั้งในอดีต ฉันคิดว่าจะต้องมีการ จำกัด หรือตัดทอนบางอย่างเกิดขึ้น? ไม่เช่นนั้นความทรงจำของคาฟคาก็จะปีนขึ้นไปเสมอ แม้ว่าข้อมูลจะกระจายไปยังดิสก์ แต่ไฟล์ที่จัดเก็บข้อมูลหัวข้อจะเติมข้อมูลในดิสก์อย่างรวดเร็วใช่หรือไม่
smeeb

6

Kafka / Kinesis ถูกสร้างแบบจำลองเป็นสตรีม สตรีมมีคุณสมบัติแตกต่างจากข้อความ

  • สตรีมมีบริบทกับพวกเขา พวกเขามีระเบียบ คุณสามารถใช้ฟังก์ชั่นหน้าต่างกับสตรีม แม้ว่าแต่ละรายการในสตรีมจะมีความหมาย แต่อาจมีความหมายมากขึ้นกับบริบทที่อยู่รอบ ๆ
  • เนื่องจากสตรีมมีคำสั่งซื้อคุณสามารถใช้สิ่งนั้นเพื่อสร้างข้อความบางอย่างเกี่ยวกับความหมายของการประมวลผล เช่น Apache ตรีศูลคาดคะเนความหมายที่แน่นอนครั้งเดียวเมื่อบริโภคจากกระแสคาฟคา
  • คุณสามารถใช้ฟังก์ชั่นกับสตรีม คุณสามารถแปลงกระแสโดยไม่ต้องบริโภคมัน คุณสามารถใช้สตรีมอย่างเกียจคร้านได้ คุณสามารถข้ามบางส่วนของสตรีมได้
  • คุณสามารถเล่นซ้ำสตรีมใน Kafka ได้ แต่คุณไม่สามารถ (ไม่ต้องมีซอฟต์แวร์เพิ่มเติม) รอคิวข้อความซ้ำ สิ่งนี้มีประโยชน์เมื่อคุณไม่รู้ด้วยซ้ำว่าคุณต้องการทำอะไรกับข้อมูล นอกจากนี้ยังมีประโยชน์สำหรับการฝึกอบรม AI

โดยทั่วไปใช้ Kafka สำหรับการประมวลผลสตรีมออฟไลน์ใช้คิวข้อความสำหรับข้อความไคลเอ็นต์ - เซิร์ฟเวอร์แบบเรียลไทม์

ตัวอย่างการใช้เคสจากการพิจาณา :

Kafka: การติดตามกิจกรรมเว็บไซต์, การวัด, การรวบรวมบันทึก, การประมวลผลสตรีม, การจัดหากิจกรรมและบันทึกการกระทำ

RabbitMQ: การส่งข้อความที่มีวัตถุประสงค์ทั่วไป ... มักใช้เพื่ออนุญาตให้เว็บเซิร์ฟเวอร์ตอบสนองต่อการร้องขออย่างรวดเร็วแทนที่จะถูกบังคับให้ทำตามขั้นตอนการใช้ทรัพยากรจำนวนมากในขณะที่ผู้ใช้รอผล ใช้เมื่อคุณต้องการใช้โปรโตคอลที่มีอยู่เช่น AMQP 0-9-1, STOMP, MQTT, AMQP 1.0

บางครั้งอาจมีประโยชน์ในการใช้งานทั้งสองอย่าง! ตัวอย่างเช่นใน Use Case # 2 หากนี่คือสตรีมข้อมูลจากเครื่องกระตุ้นหัวใจบอกว่าฉันจะให้เครื่องกระตุ้นหัวใจส่งข้อมูล heartbeat ไปยังคิวข้อความ RabbitMQ (โดยใช้โปรโตคอล cool เช่น MQTT) ซึ่งจะประมวลผลทันทีเพื่อ ดูว่าหัวใจของแหล่งที่มายังคงเต้นอยู่หรือไม่ สิ่งนี้สามารถเพิ่มประสิทธิภาพแดชบอร์ดและระบบตอบกลับฉุกเฉิน คิวข้อความจะฝากข้อมูลอนุกรมเวลาลงใน Kafka เพื่อให้เราสามารถวิเคราะห์ข้อมูลการเต้นของหัวใจเมื่อเวลาผ่านไป ตัวอย่างเช่นเราอาจใช้อัลกอริทึมในการตรวจจับโรคหัวใจโดยการสังเกตแนวโน้มในกระแสการเต้นของหัวใจ


1
ขอบคุณ @Samuel (+1) - นี่เป็นคำตอบที่ยอดเยี่ยมและช่วยให้สิ่งต่าง ๆ ดีขึ้นในบริบท จริง ๆ แล้วฉันมีคำถามติดตามน้อยสำหรับคุณ (ถ้าคุณไม่รังเกียจ) แต่พวกเขาทั้งหมดบานพับ / ผูกพันในการชี้แจงครั้งแรกที่ฉันต้องการ: เมื่อคุณพูดว่า " คุณสามารถใช้ฟังก์ชั่นกับสตรีมคุณสามารถแปลงกระแส โดยไม่ต้องใช้มันจริง ๆ ... ", ฟังก์ชั่น / การแปลงเหล่านั้นถูกประมวลผลบน Kafkaหรือจำเป็นต้องใช้ก่อนก่อนที่จะประมวลผลสตรีมผ่านฟังก์ชั่น / การแปลงหรือไม่?
smeeb

1
ความหมายที่คุณมีKafkaProducer, และKafka KafkaConsumerสมมติว่าKafkaProducerใช้ชีวิตอยู่ในแอพ Java และที่KafkaConsumerใช้กับแอพ Ruby / แบ็กเอนด์บางตัว KafkaProducerส่งไปยังคาฟคาที่ต้องมีการเปลี่ยนผ่านMessage1 Function1ที่ไม่Function1's รหัสสด? บน Kafka (เหมาะสม) หรือภายในKafkaConsumer(แอพ Ruby)?
smeeb

2
คุณไม่สามารถใช้งานฟังก์ชั่นหรือทำการประมวลผลใด ๆ ในคาฟคาเองได้ Apache Spark Streaming และ Apache Storm เป็นเฟรมเวิร์กการประมวลผลสตรีมแบบกระจายสองเฟรมที่สามารถใช้งานได้จาก Kafka พวกเขาทำงานนอก Kafka และเชื่อมต่อกับมันราวกับว่ามันเป็นฐานข้อมูล เฟรมเวิร์กแสดงฟังก์ชั่นที่มีประโยชน์เช่นการแยกการรวมการเรียงหน้าต่าง ฯลฯ คุณสามารถใช้ฟังก์ชันพื้นฐานในผู้ใช้ Ruby ของคุณ แต่ฉันขอแนะนำหนึ่งในเฟรมเวิร์ก spark.apache.org/streaming storm.apache.org/releases/2.0.0-SNAPSHOT/Trident-tutorial.html
ซามูเอล

1
ตกลงขอบคุณและ +1 อีกครั้ง - มันคงยอดเยี่ยมมากถ้าคาฟคาสามารถทำการประมวลผลบนลำธารได้! ดังนั้นเพื่อสนับสนุนทนายของปีศาจคุณไม่เพียง แต่ให้ผู้บริโภค RabbitMQ ดึงข้อความออกจากคิวรวมพวกเขาตามเวลาประทับ (หรือจริงๆเกณฑ์หรือคุณลักษณะอื่น ๆ ) และดำเนินการหน้าต่างเดียวกันและแปลงฟังก์ชันเป็นข้อมูลที่จุดประกาย สตรีมมิ่งหรือ Storm ให้?
smeeb

1
ใช่ฉันคิดว่าคุณสามารถทำได้ด้วย RabbitMQ เพราะ RabbitMQ รับประกันเกี่ยวกับการส่งข้อความ คุณอาจไม่สามารถทำได้กับทุกคิวข้อความ และมันจะซับซ้อนในการสร้าง เช่นถ้าผู้บริโภค RabbitMQ ของคุณที่รวมการล่ม ด้วย Kafka คุณสามารถติดตามตำแหน่งที่อยู่ในกระแสที่คุณดำเนินการได้เพื่อให้คุณสามารถเริ่มต้นผู้บริโภคของคุณในจุดที่คุณค้างไว้
ซามูเอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.