kafka-for-qa
kafka-for-qa

Apache Kafka ที่ร้อนแรงจนเราไม่เรียนรู้ไม่ได้แล้ววววว 🙂

ถ้าชอบสั้นๆๆเลยเจ้า Kafa มันเป็น Streaming Platform ตัวนึงที่ทําหน้าที่เป็น Broker รับเอา message จากที่นึงไปอีกที่นึงแค่นั้นแหละ โดย message จะเป็น record ผ่าน tcp protocol ไปมา เพื่อช่วยในการ scalability & decoupling ของระบบ ให้มัน asynchronus มากที่สุด …. จบ! ง่ายมั้ย?

แต่ชอบยาวๆ วันนี้มาดูกันว่าจะเรียนรู้อะไรบ้าง?

  1. Apache Kafka คืออะไร
  2. Apache Kafka มีประโยชน์ยังไง
    • Apache Kafka ในชีวิตจริงเป็นยังไง
  3. Overall Kafka concept
  4. Test Cases

Apache Kafka คืออะไร?

คํานิยามเท่ๆ…

A distributed streaming platform

คืออะไร? อ่านแล้วก็ยังสับสน… จริงๆต้องเริ่มจากมันเกิดมากจากไหนก่อน? เจ้า Kafka นี้เป็นผลงานจากบริษัท Linkedin ราวๆปี 2010 ที่ในสมัยก่อนเค้าต้องจัดการกับปัญหาเรื่องของ

  1. ผู้ใช้จํานวน 300 million users events ทุกวันๆ ทําให้ในบางทีมันเกิดปัญหาเรื่องของ data lost !!! (รวมไปถึงการทำ internal services messaging ด้วย นึกถึงสภาพบริษัทเรามี cluster A, cluster B, cluster C เยอะแยะไปหมด แล้วจะคุยกันยังไงละ)
  2. แล้วยังมีปัญหาเรื่องของ การย่อยข้อมูลขนาดใหญ่ ขนาดนั้นเวลาเอามาใช้งานอีกด้วย

(อ่านเต็มๆที่นี้เลย 1,2)

ทีนี้มันก็เลยเกิดออกมาเป็น Kafka นั้นเอง! ออกแบบมาเพื่อให้จัดการข้อมูลขนาดใหญ่,การันตีข้อมูลจะถึงผู้รับ และเป็น distributed system ซึ่งจริงๆมีความคล้ายๆ messaging queue (ตัว popular ก็ RabbitMQ เลย) นั้นแหละ

Apache Kafka มีประโยชน์ยังไง?

ตัว Use cases ของการใช้งาน Apache Kafka มีไม่น้อยเลยล่ะ แต่ตัวที่ Popular น่าจะเป็นเรื่องของ

  1. Messaging
    • อย่างที่พูดถึงที่มาของ Kafka ก็จะพอเห็นแล้วล่ะว่าเราเอามาทํา messaging queue ได้เลย เช่น A producer ส่งไปหา Kafka server หลังจากนั้น B consumer ก็ไปเอามาอ่านเป็นต้น แต่ที่คนมาสนใจใช้ Kafka ทํา messaging มากกว่าตัวอื่นนน คงเป็นเพราะ replication,built-in partitioning, fault-tolerance กว่า traditional messaging อื่นๆ อย่าง rabbit MQ เป็นต้น …..
  2. Website Activity Tracking
    • ด้วยความสามารถของ real-time publish-subscribe คนนิยมเอาไปใช้ทํา real-time processing, monitoring แล้วโหลดลง Hadoop เพื่อเอาไปทํา offline processing and reporting  (high volume มากๆน่ะเรื่องของ Website Acitivity นี้อะ เพราะต่อหน้านึงเว็ปไซต์ user สามารถก่อให้เกิด activity ได้มากๆ)
  3. Metrics
    • messaging อะน่ะ ก็อย่างที่เข้าใจแหละ คือมัน producer and consumer ใช่มั้ยล่ะ? เพราะฉะนั้นมันก็ส่งข้อมูลไปที่ centralized feeds ได้ พวก Operation data ต่างๆ นึกถึง ทะเลน่ะ มีทุ่นตรวจจับอุณหภูมิกระจายทั่วท้องทะเลเลย ข้อมูลพวกนั้นน่ะเป็นอารมณ์ Operational data ที่จะส่งกลับมา centralize feed  นั้นเอง

หรือถ้าขี้เกรี้ยจอ่านทั้งหมดน่ะ จําแค่ 2 คําพอเลย

scalability & decoupling

(อ่านเต็มๆที่นี้เลย Kafka Official Usage, แต่จริงๆถ้าอยากอ่านย่อๆแนะนํานี้เลย AWS Message Queue Benefits)

Apache Kafka ในชีวิตจริงเป็นยังไง

คือพวกนี้อ่านไปเป็นทฤษฐีซะส่วนใหญ่อะ แต่เรามองลองคุยกันในแบบชีวิตจริงๆบ้างดีกว่า ลองนึกถึงระบบสองแบบคือ ระบบที่ใช้ Message Queue กับ ไม่ใช่ Message Queue น่ะ

โดยมีข้อสมมุติฐานให้ว่า ระบบนี้มีคนใช้ต่อวันอย่างน้อย 1,000,000 requests/per day ลองคิดดูน่ะว่า จะทํายังไงกับ request ขนาดนั้น ต้องใช้ระบบมากมายแค่ไหนในการรับ เช่นสมมุติเรามี cluster 20 เครื่องน่ะ หมายความว่าต่อวัน เครื่องแต่ละเครื่องจะต้องรับ request ราวๆ 50,000 requests (ใช้ load balance switch traffic ไปมาน่ะ) แล้วเจ้า 50,000 request เนี่ย ถ้าเกิดมันต้อง read-write databsae ด้วย คิดว่า server 1 เครื่องจะแตก thread พอมั้ย? พอทีจะไม่ทํา request ซักตัวตกหล่น หรือ bad request เลย 🙂 ….. บอกเลยยากมากน่ะ

นั้นเลยเป็นเหตุผลที่เราต้องมี queue ไงล่ะ เพื่อการ scalability & decoupling ของระบบนั้นเอง!!! ลองคิดดูสิ ถ้ามีตัวกลางอย่าง queue ที่นํา request มาเก็บไว้ แล้วพอเครื่องพร้อมใช้งาน มันก็หยิบมาทํา เป็น asynchronous นั้นเอง ไม่ต้องรอใคร…. จะกี่ล้าน request ก็ได้ มันก็รอจนกว่าเครื่องจะพร้อมทํางาน แล้วก็หยิบไปทํา ง่ายๆแค่นั้น (ซึ่งถึงเวลาจริงๆมันก็จะต้องทําให้ cluster ที่จะหยิบมาใช้งานเนี่ย ทํางานเร็วในระดับนึงเหมือนกันน่ะ ฮ่าๆ ไม่ใช้ระบบ cluster ประมวลเป็น s เหมือนกัน มันต้องเป็น ms แต่โดยปกติแล้วมันง่ายกว่าการที่ให้ระบบเป็น synchronus รอไปเรื่อยๆแบบนั้น)

Overall Kafka Concept

การจะเข้าใจ Kafka เราต้องรู้ก่อนว่า component มีอะไรบ้าง โดยหลักๆมีแค่ 8 อย่างเท่านั้นเอง

  1. Producer
    • application ที่ส่ง Message ไปหา Broker (Kafka server) โดยจะอยู่ในรูปแบบของ array of byte
    • โดยที่เวลา Producer ส่งข้อมูลออกไปจะส่งทีล่ะ record … ไม่ใช่ทีเดียวหมด เช่น ถ้าจะส่งไฟล์ให้ Broker มันก็จะส่งทีล่ะ rows/record นั้นเอง
  2. Consumer
    • application ที่รับ Message จาก Broker (Kafka server) ที่ Producer ส่งมา คือ consumer ของเราจะไม่ส่งหา Producer ตรงๆน่ะ มันจะต้องไปหา kafka server
    • Producer -> Broker (Kafka server)
    • Consumer -> Broker (Kafka server)
    • อย่าลืมน่ะว่า Producer ส่งทีล่ะ rows/record/line ใช่มั้ย? เพราะฉะนั้นเจ้า consumer ก็จะ request ไปที่ Broker (Kafka server) จนกว่า Producer จะไม่ส่งนั้นแหละ 🙂
    • kafka-component-example
      kafka-component-example (https://www.youtube.com/watch?v=udnX21__SuU)
  3. Broker (Kafka server)
    • Kafka server ก็คือ Broker
    • สิ่งที่มันทําก็คือแค่เป็นตัวกลางในการ exchange message นั้นเอง
  4. Cluster
    • อันนี้น่าจะไม่ยาก กลุ่มของคอมพิวเตอร์ที่ทํางานร่วมกันเพื่อเป้าหมายเดียวกัน (distributed system)
    • kafka-cluster-zookeeper
      kafka-cluster-zookeeper (https://www.youtube.com/watch?v=udnX21__SuU)
    • จากรูปจะเห็นว่ามันก็คือแค่ Multiple Broker ทํางานเป็นกลุ่มนั้นเอง 🙂 แต่ถ้ามองดีๆจะเห็นคําว่า Zookeeper เจ้าตัวนี้อธิบายง่ายๆก็คือ ผู้คุมสําหรับ distributed system นั้นแหละ เช่น Naming,configuration,syncjrpmozation, etc
  5. Topic
    • ลองจิตนาการข้อมูลที่เราส่งไปมาใน Kafka Stream นี้มันเยอะมากๆๆๆๆๆๆเลยน่ะ แล้วเราจะรู้ได้ไงว่าต้องเอาข้อความไหนล่ะ? คําตอบง่ายมากเลยก็คือต้องหา Unique key ใช่มั้ยล่ะ? ซึ่งเจ้าตัวนั้นก็คือ Topic นั้นเอง (หรือจะมองว่า Topic คือ Unique key ใน database ได้)
    • kafka-topic-example
      kafka-topic-example
  6. Partitions
    • อย่างที่รู้ว่า Broker จะเป็นคนเก็บข้อมูลที่ส่งไปมาใช่มั้ย? แต่บางที่ข้อมูลที่เราเก็บเนี่ยมันใหญ่มากๆๆๆๆเกินกว่าที่ computer เครื่องนึงจะรับไหว เลยต้องใช้ distributed system เข้ามา
    • มันเลยมีไอเดียที่จะต้องแบ่ง data ออกเป็น Partition หลายๆๆส่วน แล้วกระจายไปเก็บไว้ใน distributed system นั้นเอง
  7. Offset
    • sequence id ของ partition ที่มีความหมายตาม arrival ที่มาถึงก่อนหลังนั้นเอง
    • โดยหลักการของหาไฟล์ต่างๆเราจำเป็นต้องรู้ Topic Name,Partition Number, Offset เราก็จะได้ direct ไปตรงนั้นได้เลย
    • kafka-offset-partition-example
      kafka-offset-partition-example (https://www.youtube.com/watch?v=udnX21__SuU)
  8. Consumer Groups
    • กลุ่มของ consumer ที่รวมกันเพื่อทําหน้าที่เดียวกัน (งงใช่มั้ยล่ะ)
    • ลองดูที่ภาพนี้น่ะ
      kafka-consumer-group
      kafka-consumer-group(https://www.youtube.com/watch?v=udnX21__SuU)

      ลองจิตนการถึง 7-11 🙂 ปัจจุบันมี 7-11 อยู่ประมาณ 8,000 สาขา วันดีคืนดี เจ้าสัวของเราบอกเราต้องการ real time billing analytic ขึ้นมา …. ด้วยความที่เราเรียน Kafka มา เราก็เลยอยากใช้ และ เอา Producer ไปติดตั้งทุกๆสาขาที่ POS System หลังจากนั้นก็เลยออกมาเป็นภาพข้างบน ที่ Producer บน POS จะส่งข้อมูลมาที่ Broker แล้ว consumer ก็รับเอาไป write ลง data center …. ฟังแล้วถ้าไม่ได้ฉุกคิดอะไร ก็จะผ่านไปอย่างสงบ

    • แต่ถ้าลองนึกดีๆน่ะ Producer 8,000 ตัว ส่งข้อมูลมาที่ Broker แล้วให้ consumer  1 ตัว รับ messaging อันเดยีว … ไม่ต้องบอกเลยน่ะ ว่ามันจะตายแน่ๆอะ
      kafka-consumer-group
      kafka-consumer-group (https://www.youtube.com/watch?v=udnX21__SuU)

      ก็เลยเกิดออกมาเป็นรูปนี้ Distributed Broker เพื่อรองรับ 7-11 ทุกสาขาเนอะ กับ consumer group ! ที่ทําหน้าที่คล้ายๆ distributed system แต่เป็น consumer group ที่แชร์ Topic เดียวกันนั้นเอง!!! แบ่งงานกันทําแล้ว write ลง data center ด้วยกัน 🙂

Test Cases

เนื่องจากแก่แล้วเนอะ สิ่งที่เวลาคิด test cases สมัยนี้ก็ไม่ใช่แค่เรื่องของ functional test ของ feature แล้ว มันต้องคิดเรื่องของ Non-functional test ด้วย

  1. ถ้า Functional test ของ Kafka นี้ง่ายเลย
    • Positive case: Producer -> Broker -> Consumer แล้วเราก็ expected topic data ต้องมา
    • Negative case: Producer -> Broker (dead) แล้วเราก็ expected producer ต้องเตรียม exception handling ไว้ ไม่ใช่พังไปเลย
    • Negative case: Consumer -> Broker (dead) แล้วเราก็ expected consumer ต้องเตรียม exception handling ไว้ ไม่ใช่พังไปเลย
    • Positive case: Producer -> Broker (distributed) -> Consumer ทํางานกันไป แต่เราไปปิด Broker ใน cluster ออก ดูว่ามัน replicate ได้มั้ย ซึ่ง expected ว่ามันจะ replicate ตามคําโม้น่ะ
    • อื่นๆอีกเยอะแยะ
  2. ส่วน Non-Functional นี้ง่ายกว่า
    • ถ้าไม่ใช่เรื่องของ Log หรือ data อะไรแบบนั้นน่ะ เพื่อ replicate หรือ clear log บลาๆ
    • ก็น่าจะสนใจเรื่องของ Load test แบบเดียวกับ 7-11 ที่มี 8,000 สาขานั้นแหละ ว่าถ้าเราสร้าง Request ขนาดนั้นลงไปจะเกิดอะไรขึ้น Producer จะรับไหวมั้ย? consumer group? เพื่อสังเกตุเรื่องของ Response time ที่ได้กลับมาจากทํา Load test

สรุป

จริงๆหลังลองๆดูเนี่ย Kafka ไม่ได้เข้าใจยากเลยน่ะ 🙂 มันแค่ streaming platform ตัวนึงที่มีความสามารถ scale,อึด และ ทนมากๆตัวนึงแค่นั้นเอง ถ้าเราเข้าใจ 8 concept พวกนั้น ก็เข้าใจได้หมดแล้วว่า Kafka คืออะไร…. ทีนี้เวลาเอาไปปะติดปะต่อกับงานในบริษัทก็จะชิวๆล่ะ

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.