ความแตกต่างระหว่าง Redis และ Kafka [ปิด]


91

Redis สามารถใช้เป็นผับย่อยแบบเรียลไทม์ได้เช่นเดียวกับ Kafka

ฉันสับสนว่าจะใช้อันไหนดีเมื่อไหร่

กรณีการใช้งานใด ๆ จะช่วยได้มาก


15
ฉันไม่แน่ใจว่าทำไมคำถามนี้จึงถูกปิดว่าเป็น "ตามความคิดเห็น"? มีความแตกต่างทางเทคนิคที่เป็นวัตถุประสงค์ระหว่างสองข้อและคำตอบที่มีอยู่สรุปความแตกต่างเหล่านั้นอย่างชัดเจน
David Anderson

คำตอบ:


143

Redis pub-sub ส่วนใหญ่เป็นเหมือนระบบไฟและลืมซึ่งข้อความทั้งหมดที่คุณผลิตจะถูกส่งไปยังผู้บริโภคทั้งหมดในคราวเดียวและข้อมูลจะถูกเก็บไว้ที่ใด คุณมีข้อ จำกัด ด้านความจำเกี่ยวกับ Redis นอกจากนี้จำนวนผู้ผลิตและผู้บริโภคอาจส่งผลต่อประสิทธิภาพใน Redis

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

รอบชิงชนะเลิศ:

ใช้ Redis:

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

ใช้คาฟคา:

  1. หากคุณต้องการความน่าเชื่อถือ
  2. หากคุณต้องการให้ระบบของคุณมีสำเนาของข้อความที่ถูกส่งแม้ว่าจะใช้งานไปแล้วก็ตาม
  3. หากคุณไม่สามารถอยู่กับการสูญเสียข้อมูล
  4. ถ้าความเร็วไม่ใช่เรื่องใหญ่
  5. ขนาดข้อมูลใหญ่มาก

74
ความแตกต่างที่สำคัญอย่างหนึ่งคือ Redis Pub / Sub นั้นเป็นแบบพุชในขณะที่ Kafka Pub / Sub ถูกดึง นั่นหมายความว่าข้อความที่เผยแพร่ไปยัง Redis จะถูกส่งไปยังสมาชิกโดยอัตโนมัติทันทีในขณะที่ใน Kafka Data / ข้อความจะไม่ถูกส่งไปยังผู้บริโภคผู้บริโภคจะขอข้อความเมื่อผู้บริโภคพร้อมที่จะจัดการกับข้อความนั้น cloudkarafka.com/blog/… kafka.apache.org/documentation.html#design_pull
Zeni

อ่านสิ่งนี้: redis.io/topics/persistenceดูเหมือนว่าฉันจะเก็บข้อความที่ส่งไปได้ ฉันผิดเหรอ?
David D.

1
@DavidD: การเชื่อมโยงคุณให้ explians วิธีการที่คุณสามารถกำหนดค่าredisเพื่อให้แน่ใจว่าข้อความที่ที่ได้รับการส่งแต่ไม่ได้รับการประมวลผลredisจะยังไม่หายไปหลังจากที่เริ่มต้นของ แม้ว่าจะเป็นไปได้ที่จะทำเช่นนั้น แต่redisก็ไม่อนุญาตให้ถือ (หรือเก็บเพื่อนำคำของ @Karthikeyan กลับมาใช้ใหม่) นอกกรอบ
Younes

12

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

โดยทั่วไปโครงสร้างสตรีมให้ capabilites เดียวกับ Kafka

นี่คือเอกสารhttps://redis.io/topics/streams-intro

มีไคลเอนต์ Java ที่ได้รับความนิยมสูงสุดสองตัวที่รองรับคุณสมบัตินี้: Redissonและ Jedis


1
Nikita เอง :) ห้องสมุดสุดหรู! เพิ่งเริ่มใช้งาน โครงสร้างดีและคิดออก! คุณเป็นอัจฉริยะ!
mmm

@mmm ขอบคุณ!
Nikita Koksharov

ฉันมีคำถามบางอย่างเกี่ยวกับการใช้งานที่เหมาะสมและไม่และฉันกลัวว่าจะตั้งสมมติฐานผิด? บางทีคุณอาจทบทวนคำถามสองข้อที่ฉันได้เพิ่มไว้ที่ SO นอกจากนี้ยังชอบที่จะเพิ่มคุณใน Skype เพื่อรบกวนคุณในบางครั้งหากเป็นไปได้ ฉันสามารถให้ข้อมูลเชิงลึกเกี่ยวกับวิธีที่ฉันต้องการใช้ ไม่ใช่ Noob ทั้งหมด :)
mmm

ตัวอย่างเช่นฉันกำลังสร้างแผนที่ที่สามารถแคชได้ ... โดยใช้รหัส runtimes เป็นคีย์จากนั้นเพิ่มรายการของสิ่งที่ระบบกำลังประมวลผลจาก deque ... รายการฉันสามารถสร้าง ArrayList ได้สำหรับฉันเดา ฉันเชื่อว่า redisson จะแปลงเป็นการภายในสำหรับฉัน แต่ถ้าฉันไม่ทำและสร้างรายการ redisslon ฉันต้องตั้งชื่อให้ถูกต้องหรือไม่? คุณจะตั้งชื่อรายการนั้นภายในชื่ออะไร? รหัสสุ่ม? หาก API ของคุณไม่ควรให้พารามิเตอร์น้อยกว่า createList, createMap และอื่น ๆ เนื่องจากมี usecase สำหรับมัน?
mmm

แน่นอนว่าฉันสามารถส่ง randomUuid ได้ แต่คงจะดีที่รู้ว่า redisson มีตัวสร้างชื่อที่ดี ฉันยังเขียน Deque ของตัวเองสำหรับการประมวลผลงานชุดงานที่มี deque ซ้ำซึ่งสำรองข้อมูลโดยแผนที่ที่มีองค์ประกอบ "ถ่ายแล้ว" หากเรามีระบบ 10 ระบบโดยแต่ละเธรด 8 เธรดกำลังประมวลผลคิวและมีระเบิดนิวเคลียร์เกิดขึ้นสิ่งเหล่านี้จะสูญหายไปและไม่ได้ประมวลผลเนื่องจากระบบเหล่านี้ถูกนำไป แต่ไม่ได้รับการประมวลผลอย่างสมบูรณ์
mmm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.