TechNote: Reactive Programming

พอดีเมื่อวาน พี่บาส ถามเรื่อง Reactive Programming ใน Facebook

ซึ่งผมก็เพิ่งได้ดู vdo การสอนของ Reactive Programming

ของ Martin Odersky บน coursera พอดี

ก็เลยขออนุญาติ ถอดความสิ่งที่มาตินชี้แจงเป็นภาษาไทยดังนี้ครับ

ปัจจุบัน demand ของ Technology ไม่เหมือนก่อนแล้ว!!!

มาติน เปรียบเทียบให้ดูดังนี้

Server Node                               10 nodes => 1000 nodes

Response time                          seconds => milliseconds

Maintenance downtime         hours => none

Data volume                               GBs => TBs

จะเห็นว่า เทคโนโลยีวันนี้ chellenge เยอะกว่าตอนผมจบ เมื่อ 10 ปีก่อนมาก

แน่นอนครับ จากข้อมูลด้านบน ทุกอย่างเพิ่มขึ้น 100 เท่าตัวเป็นอย่างต่ำ

ดังนั้น เราต้องการ “power of processing” มากขึ้น

เพื่อที่จะตอบสนองต่อความต้องการได้มากขึ้น

Technology ในปัจจุบัน ไม่ใช่ส่วนเสริมของธุรกิจแล้ว

แต่ Technology เป็น core ไปทุกๆธุรกิจ

 

เรามีการเพิ่ม core, hardware ตามกฏของ moore เพิ่มขึ้นเรื่อยๆ

แต่แค่ core กับ hardware มันยังไม่ใช่การตอบโจทย์ทั้งหมด

ถ้าวิธีคิดในการทำ software ยังเหมือนเดิม

ถ้าเคยอ่านโพสของลูกพี่ Programming Model มันมี 2 มุมมอง

  • memory-oriented ซึ่งเป็นการเขียนโปรแกรมแบบ imperative programming ที่เราคุ้นเคย โดยการ store ค่าไว้ในตัวแปร แล้วแต่ละ thread ต่อคิวเข้าใช้ตัวแปรนั้นๆ
  • memoryless ซึ่งเป็นการเขียน ซึ่งเป็นการเขียนโปรแกรมแบบ functional programming ที่ไม่มีการเป็น state ของตัวแปรใน memory

ซึ่ง 10ปีที่ผ่านมา เราอยู่บน Programming model แบบ imperative ที่เป็น memory-oriented มาตลอด

ซึ่งการเป็น memory-oriented ก็ทำให้เราสามารถจัดการกับ resource ได้ง่าย

เพราะแต่ละ thread ที่จะใช้ resource ก็จะมารอเข้า queue ในการใช้ตัวแปร

แต่…

มันก็เปิดโอกาสให้เราพลาดได้ง่าย เพราะการทำงานที่ critical นั้นๆ

เราต้องคำนึงว่า operation ของเรานั้น thread-safe หรือไม่

คำว่า thread-safe แปลว่า ตัวแปรที่ใช้ร่วมกันในหลายๆ thread นั้นต้องเอา thread มาต่อคิวในการใช้

ซึ่งการนำ thread มาต่อ queue นี่แหละ เป็นการ block I/O หรือเป็นการ “รอ” นั่นเอง

พอรอแล้วทำให้การ processing ช้าลง เพราะต้อง “รอ”

ดังนั้น การที่จะตอบ demand ของการ processing ในยุคปัจจุบันได้

Programming Model ต้องส่งเสริมให้เรา ไม่ต้องมีการเก็บ state ของตัวแปรใน memory

ซึ่งมันก็คือ Functional Programming นั่นเอง

พอเราเปลี่ยน model ในการเขียนโปรแกรม

พวก thread ที่ต้องรอคอย resource ก็ไม่จำเป็นต้องรอ แล้วทำงานขนานกันได้เลย

แปลว่า core มหาศาลที่แถมมากับ cpu จะถูก utilize ได้เต็มที่

พอ utilize ได้เต็มที่ ก็ทำให้ power of processing ได้มาเพิ่มขึ้นอย่างมากมาย

(นี่เป็นเหตุผลว่า ทำไม run scala ทีนึง cpu จะขึ้นเกือบ 100%)

แล้วจากที่เราปรับ Programming Model แล้ว

เราก็ต้องปรับวิธีในการเก็บข้อมูล

จะเห็นได้ว่า Big Data นั้นเป็นกระแสมากๆในปัจจุบัน

ซึ่ง Big Data ที่เป็นกระแสมากๆนี้ เกิดจากเรื่องง่ายๆดังนี้ครับ

(อันนี้เอาวิธีอธิบายมาจากคนคิด Oriented DB)

  • ถ้า table มี relation กัน การจะ look up table 2 อันที่ join กันนั้น ต้องใช้ n x n ในการ traversal ไปในแต่ละ records เพื่อ filter
  • แต่ถ้าเราเก็บใน table เดียวกัน แต่มองเป็น key-value มันจะเหลือแค่ n ในการ traversal

แน่นอนครับ การเก็บเป็น key-value มันก็มีโอกาสที่ data จะ duplicate กัน

แล้วก็ consistency มันอาจะเสียไป

แต่มันก็นำมาซึ่ง power of processing ที่มากขึ้นมหาศาล

เพราะจาก n x n เหลือแค่ n นี่ speed ที่ได้มามันอีกมากมายนัก

ดังนั้น การยอมให้ data ไม่ consistence กันบ้าง แต่นำมาซึ่ง power of processing ย่อมดีกว่า

(ทำยังกะทำ relational database แล้ว data consistence กันตลอดนั้นแหละ

ไม่เคยเห็นที่ไหน data quality ถึง 90% เลย นี่ขนาด relational database นะ)

ดังนั้น การปลด lock ทั้ง programming model และวิธีการ store ข้อมูล

มันสอดคล้องกันแนวคิด “reactive programing”

react แปลว่า ตอบสนอง

reactive programming ก็แปลว่า โปรแกรมมิ่งที่ตอบสนอง

แต่มันตอบสนองกับอะไรบ้างมาดูกัน

1. react to Event ตอบสนองต่อเหตุการณ์ที่เกิดขึ้น

ไม่ว่าอะไรเกิดขึ้นก็ตอบสนองได้อัตโนมัติทันที

คำว่า เหตุการณ์ นี้อาจจะมาจาก sensor บน IoT

หรือการ analytic ใน Big Data ก็ได้

ดังนั้น reactive programming เลยเป็น event-driven

2. react to Load ตอบสนองต่อปริมาณ request หรือ load ที่เข้ามา

แปลว่า reactive programming จะ auto-scale ได้เอง

โดยเมื่อ responsive เริ่ม drop ก็จะ split node เอง

ซึ่งการ split node ได้อัตโนมัติและรวดเร็วตาม response time ที่ drop นั้น

แต่ละ node ต้องเล็กและ boot ได้เร็ว

มันจึงเป็นที่มาของแนวคิดแบบ micro services นั่นเอง

ซึ่งซอยย่อย service ต่างๆให้เป็น modula ของมันเอง

พอซอยย่อย service เป็น modula แล้ว

ก็จะสอดคล้องกับการที่เราไม่ต้อง maintain relation ระหว่าง module

ซึ่งมันก็คือ big data นั่นเอง

ซึ่งเราเรียกว่า scalable (บางที่ใช้คำว่า elastic)

3. react to failure ตอบสนองต่อความล้มเหลว

คือเมื่อ event หรือ node ตายไป ก็สามารถ restore ใหม่ได้อย่างรวดเร็ว

ซึ่งมันก็อาศัยคุณสมบัติของ micro service ตามข้อด้านบนนั่นเอง

ซึ่งเราเรียกว่า resilient

4. react to users ตอบสนองต่อความต้องการของ user

เช่น user ส่งประโยคมา เราสามารถ rewrite ประโยคเป็นคำตอบที่ user ต้องการได้

โดยคำตอบนั้น อาจจะไม่ได้มี data structure ที่แน่นอน

อาจจะอยู่แค่ใน format json เหมือนเราคุยกับ siri

ซึ่งเราเรียกว่า responsive

คงพอเห็นภาพคร่าวๆของ reactive programming นะครับ

พอดีรีบเขียนเพราะต้องไปทำงานแล้ว

ไว้วันหลังจะวาดภาพให้เข้าใจง่ายกว่านี้

อันนี้ reference vdo สอน reactive programming ของ martin บน youtube ครับ –> https://www.youtube.com/watch?v=7D9QfMj_KwI

และอันนี้ manifesto ของ reactive ครับ —> http://www.reactivemanifesto.org

สวัสดีครับ

 

 

 

About champillon

Enterprise Opensource Implementer
This entry was posted in TechnologyNote and tagged . Bookmark the permalink.

6 Responses to TechNote: Reactive Programming

  1. อ่านแล้วมีน้ำตาซึมนิดๆ (ปล. ซาบซึ้งรสชาติ ของ Re-Active ครับผม)
    1) Update Moore on Present เอยยย…
    2) None Blocking I/O เอยยย…
    3) Auto-Scale in Micro-Sevice เอยยย…
    สรุป ปัจจุบัน Software ถ้าอยากจะใช้ Hardware ให้เต็มประสิทธิภาพ ต้อง React หรือ Dynamic Scale(None Blocking I/O, Scalable, Resilient และ Responsive) ได้ด้วยตัวเอง

  2. อ่านสนุก เข้าใจได้ง่าย ^^

    • champillon says:

      อธิบายเพิ่มเติมง่ายๆ
      react => “ตอบสนอง”
      reactive => “ตอบสนองอยู่เสมอ”
      reactive programming => “การเขียนโปรแกรมให้โปรแกรมนั้นตอบสนองอยู่เสมอ” ซึ่งจะทำให้โปรแกรมนั้นตอบสนองได้เสมอๆ ต้องลดการ “รอ” กันให้น้อยที่สุด ดังนั้น non-blocking I/O หรือ micro-service จึงถูกนำมาประยุกต์ใช้

  3. champillon says:

    ช่วงนี้ข้องข้างยุ่งครับ อยากเล่าเรื่อง scala ต่อ แต่ก็ยังไม่ว่างไป review เนื้อหาซักที

Leave a comment