- หนึ่งในความสามารถอันทรงพลังของระบบนิเวศ 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 แบ่งได้ใหญ่ ๆ เป็นสองแบบ:
- การรีโหลดโค้ดแบบง่าย
- ตัวอย่าง: ระหว่างพัฒนาให้รันคำสั่ง
r MyModule หรือ recompile ใน IEx
- วิธีนี้เรียบง่ายและมีประโยชน์ แต่ก็ให้ความรู้สึกเหมือนเป็นส่วนหนึ่งของคอมไพเลอร์หรือบิลเดอร์แบบใหม่มากกว่า
- การประยุกต์ใช้งานที่ซับซ้อนขึ้น
- โปรเจ็กต์ 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 ความคิดเห็น
เนื้อหานี้ยังมีอธิบายไว้อย่างละเอียดใน Learning Elixir Programming ซึ่งเป็นหนังสือแปล Elixir เล่มเดียวในประเทศด้วย
เป็นฟีเจอร์ที่ยอดเยี่ยมและทรงพลังมาก แต่ดูเหมือนว่าควรใช้เพื่อการดีบักและตรวจสอบแบบเรียลไทม์เท่านั้น
ความคิดเห็นบน Hacker News
ที่ Discord มีการใช้ BEAM hot code loading เพื่อลดรอบการ deploy ที่ยาวและใช้สำหรับอัปเดตฉุกเฉิน
การ reload โค้ดบนอุปกรณ์ Nerves มีประโยชน์มาก และสามารถทดสอบสิ่งที่แก้ไขได้แบบเรียลไทม์ จึงเหมาะกับ integration test
/tmpแล้วใช้Code.compileให้ข้อความแสดงข้อผิดพลาดที่ดีกว่าในโปรเจ็กต์ Elixir ไม่สามารถใช้ hot code update ได้ แต่คิดว่าน่าจะเป็นประโยชน์กับลูกค้า
ที่ kosmi.io ใช้งาน hot code upgrade ได้สำเร็จอยู่
เริ่มสนใจ Erlang เพราะ Nerves และ hot code reloading
ต้องระมัดระวังอย่างมากเมื่อเตรียม relup และบน Linux ก็มีวิธีรันเซิร์ฟเวอร์ใหม่แล้วส่งต่อข้อมูลเซสชันได้เช่นกัน
มีการ deploy Elixir บน embedded Linux โดย Nerves เข้ามาแทน systemd และบูต BEAM VM เป็น process 1
ในอดีต WhatsApp ใช้สคริปต์ SSH เพื่อทำ hot reloading บนทุกโหนด
hot code update มีประโยชน์ แต่ก็ทำให้พลาดได้ง่ายและการรองรับยังไม่มากพอ
hot code update มีข้อได้เปรียบเมื่อเปลี่ยนโค้ดในสถานการณ์ที่มีไคลเอนต์เชื่อมต่ออยู่จำนวนมาก