2 คะแนน โดย GN⁺ 2023-07-07 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

"คุณทราบไหมว่าแบ็กเอนด์ของ #MetaThreads สร้างขึ้นด้วย #Python 3.10?

โดยมันทำงานอยู่บนฟอร์ก #Cinder ของ Instagram และฟอร์กนี้มีฟีเจอร์ที่น่าสนใจหลายอย่างซึ่งแตกต่างจาก Python 3.10 ทั่วไป เช่น JIT compiler, โมดูล lazy loading และ static module ที่คอมไพล์ล่วงหน้า"

1 ความคิดเห็น

 
GN⁺ 2023-07-07
ความเห็นจาก Hacker News
  • ฟังดูค่อนข้างย้อนแย้งสำหรับคนที่บอกว่า “Python ไม่เร็วพอสำหรับ production backend” เพราะบริษัทเดียวกันนี้ก็เคยรันโซเชียลเน็ตเวิร์กขนาดใหญ่ที่สุดด้วย PHP + MySQL มาก่อน

    • ก็จริงในเชิงเทคนิค แต่พวกเขาไม่ได้รัน PHP เพียว ๆ แบบดั้งเดิมมานานแล้ว พวกเขาใช้ HHVM JIT แปลงเป็นโค้ด x86 เพื่อให้รันแบบเนทีฟบนเครื่อง และใส่การปรับแต่งไว้มากพอสมควร
      ตัว virtual machine ที่ทำ JIT ก็เขียนด้วย C++ ทั้งหมด และ MySQL distribution ก็เป็น internal fork ที่แก้ไขหนักมากเพื่อการสเกล ระบบมีทั้งการแยก storage/compute, sharding, storage engine บน RocksDB แทน InnoDB, และ Raft สำหรับ synchronous replication
      มีงานวิศวกรรมระดับยอดเยี่ยมถูกใส่เข้าไปมากจริง ๆ เพื่อทำให้ backend infrastructure สเกลได้
      แหล่งอ้างอิงที่น่าอ่าน:
      [1] https://engineering.fb.com/2016/08/31/core-data/myrocks-a-sp...
      [2] https://research.facebook.com/file/529018501538081/hhvm-jit-...
      [3] https://research.facebook.com/file/700800348487709/HHVM_ICPE...
    • ผมเคยเป็นวิศวกรยุคแรกของ Facebook และ PHP ของ Facebook ในช่วงแรก ๆ ก็ไม่เหมือน PHP ที่ใช้ทำเว็บเทมเพลตทั่วไปเลย มันมี ไลบรารีเฉพาะทาง อยู่เต็มไปหมดที่ทำให้เขียนโปรแกรมได้ซับซ้อนกว่ามาก
      ให้นึกถึงพวก functional helper, การรันแบบ asynchronous บนหลายพันคอร์, และ spanning tree ที่พาดข้ามดาต้าเซ็นเตอร์ผ่าน SSH เป็นต้น พูดนอกเรื่องนิดหนึ่ง ของดีหลายอย่างที่ผมใช้ตอนนั้น Evan Priestley เป็นคนทำ และเขายังเป็นคนสร้าง Phabricator กับระบบทรงพลังอีกหลายตัวด้วย
    • ใช่เลย Python แบบดั้งเดิมไม่เร็วพอ จึงต้องมีงานเพิ่มอีกพอสมควร
      “รันอยู่บน Cinder fork ของ Instagram ซึ่งมีทั้ง JIT, โมดูลแบบ lazy-loading, static module ที่ precompile แล้ว และการเปลี่ยนแปลงที่น่าสนใจอีกหลายอย่างเมื่อเทียบกับ Python 3.10 แบบดั้งเดิม”
      นี่คือสิ่งที่อยู่ในทวีต
      ส่วนตัวผมไม่ค่อยสนว่าคนจะใช้ภาษาอะไร ถ้ามีเงินก็แค่เพิ่มเซิร์ฟเวอร์ ทุกคนก็รู้กันอยู่แล้ว อย่างน้อยก็จนกว่า CFO กับ CTO จะตั้งเป้าโปรเจกต์ใหญ่ถัดไปเป็น “ลดต้นทุน” โดยอ้างภาวะเศรษฐกิจถดถอย
      น่าแปลกที่ในปี 2023 เรายังมานั่งเถียงกันเรื่อง “ความพร้อมสำหรับ production” ของภาษาโปรแกรมกระแสหลักอยู่ มันเหมือนการแข่งขันว่าใครเป็น “เด็กคูล” มากกว่า
    • หมายถึงบริษัทเดียวกับที่ต้องสร้าง PHP implementation สองตัว กับตัวแปลงไป C++ เพื่อให้มันสเกลได้จริง ๆ ใช่ไหม?
    • การเลือกภาษามักเป็นการมองต้นไม้จนไม่เห็นป่า การเลือก C++ แทน Python เพื่อประหยัดระดับนาโนวินาทีหรือจำนวน cycle นั้น แทบไม่มีน้ำหนักเมื่อเทียบกับการเสียเวลาเป็นมิลลิวินาทีตรง network boundary เพื่ออ่านจาก cache service หรือฐานข้อมูล
  • ส่วนที่ต้องการประสิทธิภาพสูงมากจริง ๆ อยู่ในบริการฝั่ง aggregate และ recommendation ที่ทำด้วย C++ หลายตัว แต่ตัวเว็บเซิร์ฟเวอร์เองก็คือ Django อย่างเหมาะสม

    • ผมสนใจเรื่องนี้มาก อยากรู้ว่าเขารู้ได้อย่างไรว่าตัวเว็บเซิร์ฟเวอร์คือ Django ผมหาดูแล้วแต่ไม่เจอ
      แล้วทำไมถึงเลือก Django? ผมเคยใช้กับโปรเจกต์เล็ก ๆ แต่รู้สึกว่ามันไม่ได้เร็วมาก เลยคิดว่าคงไม่เหมาะกับแอปใหญ่แบบนี้ อยากรู้ข้อดีข้อเสีย
      ทำไมไม่ทำด้วย C++ หรือ Rust ไปเลย? ถึงจะเอาส่วนหนักไปทำด้วยภาษาคอมไพล์แล้ว Python จะไม่กลายเป็นตัวจำกัดเวลา response เหรอ? ผมเป็นมือใหม่ คำถามอาจจะใสซื่อไปหน่อย
    • น่าสนใจและก็น่ายินดีที่เขาเลือกใช้ Django แต่ผมอยากรู้ แหล่งที่มา
    • Django ไม่ใช่เว็บเซิร์ฟเวอร์ แต่เป็น เฟรมเวิร์ก WSGI/ASGI ผมสงสัยว่าจริง ๆ แล้วเขาใช้ตัวอะไรจัดการ HTTP termination
    • ผมสงสัยว่าใน codebase เขาใช้ type annotation และ type checking กันมากแค่ไหน
    • ถ้าผมเข้าใจผิดก็ช่วยแก้ให้ที แต่ Django ไม่ใช่เว็บเซิร์ฟเวอร์ มันเป็น เฟรมเวิร์ก ที่ใช้ร่วมกับ app server อย่าง gunicorn และเว็บเซิร์ฟเวอร์อย่าง nginx
  • “รันอยู่บน Cinder fork ของ Instagram ซึ่งมีทั้ง JIT, โมดูลแบบ lazy-loading, static module ที่ precompile แล้ว และการเปลี่ยนแปลงที่น่าสนใจอีกหลายอย่างเมื่อเทียบกับ Python 3.10 แบบดั้งเดิม”
    เพราะงั้นมันก็ไม่ใช่แค่ Python 3.10 ล้วน ๆ เสียทีเดียว

    • ผมเคยพอร์ตโค้ดจาก Cinder ไป CPython มาแล้ว ใน fork นี้มี optimization บางอย่างที่เอาเข้า CPython ได้ไม่ยากนัก และ Facebook ก็เปิดกว้างกับการพอร์ตฟีเจอร์เหล่านี้
      ผมไม่รู้ว่า Facebook ยังอยากแบก fork นี้ต่อไปเรื่อย ๆ ไหม แต่ฝั่ง CPython เองก็เปิดรับการ merge ฟีเจอร์ลักษณะนี้ถ้ามันสมเหตุสมผล
    • อย่าลืมด้วยว่า Python 3.10 ก็ ใหม่กว่า 3.1 อยู่ 9 เมเจอร์เวอร์ชัน
    • ว่ากันตามจริงแล้ว Python เป็น สเปก มากกว่าจะเป็น implementation
  • มันช่างประชดดีที่บทความเกี่ยวกับ backend ของ Threads ไปโผล่อยู่บน Twitter

    • ถ้าจะหาอะไรที่ประชดกว่านั้น ก็ตรงนี้แหละ แอปชื่อ Threads แต่กลับรันด้วย Python ที่มี global interpreter lock ซึ่งทำให้ทำ threading ได้ยาก
      เข้าใจมุกใช่ไหม? Threads, threading…? โอเค ผมไปเองก็ได้
    • Threads เป็น แอปมือถือเท่านั้น เหมือน Instagram บนเดสก์ท็อปเบราว์เซอร์ยังใช้ Threads จริง ๆ ไม่ได้ นั่นคงเป็นเหตุผลว่าทำไมถึงแชร์เป็นโพสต์ Twitter
      ต่อให้มันเป็นโพสต์บน Threads ก็คงส่งเข้า HN ไม่ได้อยู่ดี
    • ยังไม่มีเว็บแอป ดูเหมือนว่าจะลิงก์ตรงไปที่ Thread ได้ แต่จะแสดงแค่โพสต์ที่ลิงก์ไว้ และไม่มีพวก discussion tree ให้ดู
      มันยังไม่เปิดกว้างบนเว็บ แต่บอกว่าในอนาคตจะมี
    • ทำไมถึงโดนโหวตลบ? มันเป็นข้อสังเกตที่ยุติธรรมนะ
    • ตอนนี้ Threads มี เวอร์ชันเว็บ แล้วหรือยัง หรือยังเป็นแอปอย่างเดียว?
  • เห็นได้ชัดว่าแบ็กเอนด์มีส่วนที่ทับซ้อนกันพอสมควร https://www.threads.net/t/C เป็นโพสต์แรกของ Instagram แต่ก็แสดงใน Threads ด้วย และมีจำนวนไลก์เท่ากับบน Instagram ทุกประการ
    แต่ https://www.threads.net/@kevin กลับบอกว่าไม่มี threads

  • Python ก็เป็นแค่เว็บเซิร์ฟเวอร์เท่านั้น องค์ประกอบที่อ่อนไหวต่อประสิทธิภาพจริง ๆ อย่าง edge proxy, load balancer, backend service, database, cache และ storage service ส่วนใหญ่เป็น C++

    • มองว่าเว็บเซิร์ฟเวอร์ที่จัดการทุกคำขอหรือเกือบทุกคำขอเป็นส่วนที่อ่อนไหวต่อประสิทธิภาพของระบบ แค่เขียนใหม่จาก Python เป็น Go ก็ให้ ประสิทธิภาพดีขึ้น 2~3 เท่า ได้บ่อย ๆ และในสเกลระดับ FAANG มันสร้างความต่างด้านต้นทุนฮาร์ดแวร์ได้มาก
    • นั่นก็เป็นวิธีการใช้งาน Python ที่ตั้งใจไว้ตั้งแต่แรก และก็ถูกใช้แบบนั้นมาโดยตลอด
  • เคยทำงานกับ Cinder และงานฝั่งเว็บเซิร์ฟเวอร์ ถ้ามีคำถามเชิงเทคนิคก็ตอบได้ :)

    • สงสัยว่า Cinder จะช่วยเรื่องการปรับแต่ง การสตรีมแบบเรียลไทม์ ได้ไหม เรารับสตรีม UDP แล้วผ่าน gstreamer หลายตัวกับมนตร์ของ nvidia deepstream เพื่อทำ machine learning inference กับสตรีมแบบเรียลไทม์ รู้มาว่านักพัฒนาอาวุโสเป็นคนทำไว้ด้วย Python
      แต่ในกรณีนี้ latency เป็นปัญหาใหญ่ และตามปกติแล้วก็ลดลำดับความสำคัญของการ optimize ลงเพื่อให้ไปถึง MVP ก่อน
      เลยสงสัยว่า Cinder ใช้กับการ optimize การสตรีมข้อมูลแบบเรียลไทม์ได้ไหม หรือจริง ๆ แล้วการถามแบบนี้หมายความว่าผมยังไม่เข้าใจ use case เอง
      อนึ่ง เราใช้ Django ด้วย และตอนนี้ก็แอบคิดว่าควรเปลี่ยนไป FastAPI ตั้งแต่แรกไหม แต่นั่นเป็นอีกคำถามหนึ่ง
    • อยากรู้ว่าฟีเจอร์ไหนที่หวังว่าจะถูกรวมเข้า CPython โดย มีผลกระทบมากที่สุดและมีโอกาสมากที่สุด
    • อยากรู้ว่าจะแนะนำให้ใช้ Cinder กับสแตก Django, Cython, Numpy หรือไม่
    • ช่วยอธิบายฝั่งเว็บเซิร์ฟเวอร์ให้ละเอียดกว่านี้ได้ไหม มัน implement WSGI หรือเปล่า?
    • Cinder เหมาะกับใคร ใครจะได้ประโยชน์บ้าง และเหมาะกับ workload แบบไหน แค่อ่าน README แล้วยังรู้สึกไม่ค่อยพอ
  • อยากรู้รายละเอียดเรื่องการ rollout มากกว่านี้ ตอนนี้มี ผู้ใช้ใหม่มากกว่าหนึ่งล้านคนต่อชั่วโมง เพิ่มเข้ามา ซึ่งค่อนข้างมหาศาล

    • ตอนนี้น่าจะมีการ จัดสรรทรัพยากรเกินความจำเป็น ไว้มาก เพื่อรองรับการเติบโตในช่วงสองสามสัปดาห์แรก หรืออาจจะสองสามเดือนแรกตามที่คาดไว้
      ถึงอย่างนั้นก็น่าจะยังมีรายละเอียดน่าสนใจอีกมากที่อยากฟัง
    • จำนวนผู้ใช้งานต่อเดือนของผลิตภัณฑ์ Meta ทั้งหมดคือ 3.8 พันล้านคน
      ผู้ใช้ใหม่เพิ่มขึ้นไม่กี่ล้านคนยังไม่ถึง 0.1% ของทั้งหมดเลย อยู่ในช่วงความผันผวนที่คาดการณ์ได้สบาย ๆ
    • มันก็แค่รันอยู่บน โครงสร้างพื้นฐาน Meta ที่ใช้ร่วมกัน ซึ่งถูกสร้างมาให้รองรับสเกลระดับนั้นอยู่แล้ว
  • https://github.com/twitter/the-algorithm/pull/447 อันนี้ห้ามลืมเด็ดขาด

    • ในที่สุดก็มีความต่างระหว่างสองฝั่งเพิ่มมาอีกอย่างหนึ่งแล้ว
  • Threads คือการนำแบ็กเอนด์/API ของ Instagram มาใช้ซ้ำ Instagram เองก็ พัฒนาบน Python มาตั้งแต่แรก เพราะงั้น Threads เลยใช้ Python ไปด้วย
    แต่นั่นไม่ได้แปลว่าถ้าจะสร้างแอปใหม่แบบนี้ คุณควรเลือก Python ทั้งที่มีทางเลือกอื่นซึ่งไม่ต้องพึ่ง internal fork อยู่แล้ว ถ้าอ่านโพสต์เต็มจะเข้าใจได้ค่อนข้างง่าย แต่ UI ของ Hacker News ที่ชวนให้อ่านแค่หัวข้อน่าจะทำให้ประเด็นบิดเบือนไป

    • ใจเย็น ๆ Python เป็นภาษาที่ดีพออยู่แล้ว