12 คะแนน โดย GN⁺ 2024-11-21 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • หนึ่งในความสามารถอันทรงพลังของระบบนิเวศ Erlang คือ Hot Code Update
  • ความสามารถนี้แทบเป็นไปไม่ได้ในรันไทม์อื่น ๆ และถือว่าโดดเด่นมาก
  • Elixir ถูกสร้างขึ้นบน Erlang และรองรับความสามารถเดียวกัน

การนำ Hot Code Update มาใช้ใน Elixir

  • แนวทางมาตรฐานของ Elixir release (mix release) ไม่รองรับ Erlang Hot Code Update โดยค่าเริ่มต้น
  • หากต้องการใช้งาน Hot Code Update จำเป็นต้องอ้างอิงบล็อกโพสต์หลายชิ้น หรือศึกษาคู่มือทางการของ Erlang อย่างละเอียด
  • แหล่งข้อมูลที่เกี่ยวข้อง:

กรณีการใช้งานจริงของ Hot Code Update

  • ในงานจริง Hot Code Update แบ่งได้ใหญ่ ๆ เป็นสองแบบ:
    1. การรีโหลดโค้ดแบบง่าย
      • ตัวอย่าง: ระหว่างพัฒนาให้รันคำสั่ง r MyModule หรือ recompile ใน IEx
      • วิธีนี้เรียบง่ายและมีประโยชน์ แต่ก็ให้ความรู้สึกเหมือนเป็นส่วนหนึ่งของคอมไพเลอร์หรือบิลเดอร์แบบใหม่มากกว่า
    2. การประยุกต์ใช้งานที่ซับซ้อนขึ้น
      • โปรเจ็กต์ Nerves ใช้ Hot Code Update อยู่บ่อยครั้ง:
        • บนอุปกรณ์ Elixir แบบฝังตัว เมื่อต้องปรับค่าตัวเลขหรือแก้โมดูล แทนที่จะรออัปโหลดเฟิร์มแวร์และรีบูต ก็อัปเดตผ่าน IEx ได้เลย
        • สามารถเริ่ม/หยุดบางส่วนของแอปพลิเคชัน หรือปิด GenServer เพื่อรีเซ็ตสถานะ
      • ใช้ NervesHub เพื่อทำ Hot Code Update กับอุปกรณ์ระยะไกล:
        • ตัวอย่าง: ระหว่างดีบักนาฬิกาแบบเรียลไทม์ สามารถเรียกใช้ I2C โดยตรงเพื่อหาสาเหตุของปัญหาได้รวดเร็วขึ้น

เครื่องมือและข้อควรระวังของ Hot Code Update

  • หวังว่าจะมี tooling ที่รองรับ Hot Code Update เพิ่มขึ้นบน mix release ของ Elixir หรือเครื่องมือเดิมอย่าง distillery
  • Hot Code Update ต้องอาศัยความระมัดระวังอย่างมากเช่นเดียวกับ database migration:
    • ต้องเข้าใจว่า dependency ต่าง ๆ ตอบสนองต่อ Hot Code Update อย่างไร
    • ยังมีประเด็นอื่น ๆ อีกหลายเรื่องที่ต้องพิจารณา

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

 
bus710 2024-11-22

เนื้อหานี้ยังมีอธิบายไว้อย่างละเอียดใน Learning Elixir Programming ซึ่งเป็นหนังสือแปล Elixir เล่มเดียวในประเทศด้วย

 
papillon 2024-11-21

เป็นฟีเจอร์ที่ยอดเยี่ยมและทรงพลังมาก แต่ดูเหมือนว่าควรใช้เพื่อการดีบักและตรวจสอบแบบเรียลไทม์เท่านั้น

 
GN⁺ 2024-11-21
ความคิดเห็นบน Hacker News
  • ที่ Discord มีการใช้ BEAM hot code loading เพื่อลดรอบการ deploy ที่ยาวและใช้สำหรับอัปเดตฉุกเฉิน

    • ได้พัฒนาเครื่องมือที่สามารถแพตช์หลายโมดูลพร้อมกันและกระจายอัปเดตไปยังคลัสเตอร์
    • แจกจ่าย hot patch ผ่านความสามารถด้านการกระจายในตัวของ Erlang
  • การ reload โค้ดบนอุปกรณ์ Nerves มีประโยชน์มาก และสามารถทดสอบสิ่งที่แก้ไขได้แบบเรียลไทม์ จึงเหมาะกับ integration test

    • ทดสอบและอัปเดตเฟิร์มแวร์ใหม่จากระยะไกลได้ ทำให้ลูกค้าพึงพอใจ
    • การคัดลอกไฟล์ไปไว้ที่ /tmp แล้วใช้ Code.compile ให้ข้อความแสดงข้อผิดพลาดที่ดีกว่า
    • เขียน helper function สำหรับคอมไพล์และลบโค้ดทั้งหมดได้ไม่ยาก
  • ในโปรเจ็กต์ Elixir ไม่สามารถใช้ hot code update ได้ แต่คิดว่าน่าจะเป็นประโยชน์กับลูกค้า

    • สำหรับการเปลี่ยนแปลงที่ซับซ้อน hot code update อาจก่อปัญหามากขึ้น
    • สำหรับการเปลี่ยนแปลงที่เรียบง่าย ควรทำให้มีผลกระทบน้อยที่สุด
  • ที่ kosmi.io ใช้งาน hot code upgrade ได้สำเร็จอยู่

    • ทำให้พัฒนา แก้ไข และปล่อยอัปเดตได้รวดเร็ว
    • ใช้ Distillery และสคริปต์แบบคัสตอม แต่ก็น่าจะดีกว่าถ้ามีมาตรฐานกลาง
  • เริ่มสนใจ Erlang เพราะ Nerves และ hot code reloading

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

    • hot patching อาจไม่น่าพอใจนัก เพราะเป็นการรัน VM เดิมต่อไป
  • มีการ deploy Elixir บน embedded Linux โดย Nerves เข้ามาแทน systemd และบูต BEAM VM เป็น process 1

    • ทำให้วาง Elixir ไว้ใกล้กับฮาร์ดแวร์มากขึ้น
  • ในอดีต WhatsApp ใช้สคริปต์ SSH เพื่อทำ hot reloading บนทุกโหนด

  • hot code update มีประโยชน์ แต่ก็ทำให้พลาดได้ง่ายและการรองรับยังไม่มากพอ

    • ประโยชน์ของ hot code update สามารถได้มาผ่าน rolling restart ที่วางแผนอย่างรอบคอบ
    • สามารถใช้ความสามารถในการ reload โค้ดของ Erlang เพื่อสร้างเครื่องมือวินิจฉัยปัญหาแบบเรียลไทม์ได้
  • hot code update มีข้อได้เปรียบเมื่อเปลี่ยนโค้ดในสถานการณ์ที่มีไคลเอนต์เชื่อมต่ออยู่จำนวนมาก

    • เคยใช้ GNU Make เพื่อซิงก์โค้ดไปยัง production และโหลดโมดูลผ่าน debug shell