12 điểm bởi GN⁺ 2024-11-21 | 3 bình luận | Chia sẻ qua WhatsApp
  • Một trong những tính năng mạnh mẽ của hệ sinh thái Erlang là hot code update
  • Tính năng này gần như không thể có ở các runtime khác và rất độc đáo
  • Elixir được xây dựng trên Erlang và cũng hỗ trợ cùng tính năng này

Áp dụng hot code update trong Elixir

  • Cách phát hành Elixir tiêu chuẩn (mix release) không hỗ trợ hot code update theo mặc định
  • Để triển khai hot code update, cần tham khảo nhiều bài viết blog hoặc nghiên cứu kỹ tài liệu chính thức của Erlang
  • Tài liệu liên quan:

Các trường hợp sử dụng thực tế của hot code update

  • Hot code update trong thực tế chủ yếu chia thành hai nhóm lớn:
    1. Reload mã đơn giản
      • Ví dụ: khi phát triển, chạy lệnh r MyModule hoặc recompile trong IEx
      • Cách này đơn giản và hữu ích, nhưng giống như một phần của trình biên dịch hoặc công cụ build mới hơn
    2. Các ứng dụng phức tạp hơn
      • Dự án Nerves thường xuyên tận dụng hot code update:
        • Khi tinh chỉnh các con số hoặc sửa module trên thiết bị Elixir nhúng, có thể cập nhật qua IEx thay vì chờ upload firmware và khởi động lại
        • Khởi động/dừng một phần cụ thể của ứng dụng, hoặc tắt GenServer để đặt lại trạng thái
      • Áp dụng hot code update cho thiết bị từ xa thông qua NervesHub:
        • Ví dụ: khi debug đồng hồ thời gian thực, có thể trực tiếp chạy các lệnh gọi I2C để nhanh chóng xác định vấn đề

Công cụ và lưu ý khi dùng hot code update

  • Tác giả hy vọng sẽ có thêm tooling hỗ trợ hot code update trên mix release của Elixir hoặc công cụ distillery hiện có
  • Hot code update đòi hỏi sự cẩn trọng tương tự như database migration:
    • Cần hiểu các dependency phản ứng với hot code update như thế nào
    • Còn nhiều chủ đề khác cần cân nhắc

3 bình luận

 
bus710 2024-11-22

Nội dung này cũng được trình bày chi tiết trong Làm quen với lập trình Elixir, bản dịch sách về Elixir duy nhất trong nước.

 
papillon 2024-11-21

Đây đúng là một tính năng tuyệt vời và mạnh mẽ,
nhưng có lẽ chỉ nên dùng nó cho mục đích gỡ lỗi và kiểm tra theo thời gian thực.

 
GN⁺ 2024-11-21
Ý kiến trên Hacker News
  • Tại Discord, họ đã dùng tính năng hot code loading của BEAM để rút ngắn chu kỳ triển khai dài và áp dụng cho các bản cập nhật khẩn cấp

    • Họ đã phát triển một công cụ có thể vá nhiều module cùng lúc để phân phối bản cập nhật tới cluster
    • Họ đã phân phối hot patch thông qua tính năng phân tán tích hợp sẵn của Erlang
  • Việc reload code trên thiết bị Nerves rất hữu ích, và có thể kiểm thử các thay đổi theo thời gian thực nên rất phù hợp cho kiểm thử tích hợp

    • Họ đã thử nghiệm firmware mới từ xa và cập nhật để làm khách hàng hài lòng
    • Sao chép tệp vào /tmp rồi dùng Code.compile sẽ cho thông báo lỗi tốt hơn
    • Việc viết một hàm helper để biên dịch rồi xóa toàn bộ code là khá đơn giản
  • Dù không thể sử dụng hot code update trong dự án Elixir, họ cho rằng nó sẽ hữu ích cho khách hàng

    • Với các thay đổi phức tạp, hot code update có thể gây thêm nhiều vấn đề hơn
    • Với các thay đổi đơn giản, nên ưu tiên cách tác động ở mức tối thiểu
  • Tại kosmi.io, họ đang sử dụng hot code upgrade thành công

    • Có thể phát triển, sửa lỗi và triển khai cập nhật nhanh chóng
    • Họ dùng Distillery và script tùy chỉnh, nhưng mong điều này được chuẩn hóa hơn
  • Chính Nerves và hot code reloading đã khiến họ quan tâm đến Erlang

    • Dù không thực sự thực tiễn trong môi trường production, đây vẫn là công cụ hữu ích để xây dựng hệ thống đáng tin cậy
  • Cần cực kỳ cẩn thận khi chuẩn bị relup, và trên Linux cũng có cách chạy một server mới rồi chuyển dữ liệu phiên sang đó

    • Hot patching có thể không thỏa đáng vì cùng một VM sẽ tiếp tục chạy
  • Họ triển khai Elixir lên embedded Linux, nơi Nerves thay thế systemd và khởi động BEAM VM ở tiến trình 1

    • Điều này đưa Elixir đến gần phần cứng hơn
  • Trước đây, WhatsApp đã dùng script SSH để thực hiện hot reloading trên tất cả các node

  • Hot code update hữu ích, nhưng cũng dễ dẫn tới sai sót và thiếu hỗ trợ

    • Những lợi ích của hot code update có thể đạt được bằng cách rolling restart cẩn thận
    • Có thể tận dụng tính năng code reloading của Erlang để tạo công cụ chẩn đoán sự cố theo thời gian thực
  • Hot code update đặc biệt có lợi khi cần thay đổi code trong lúc có nhiều client đang kết nối

    • Họ đã dùng GNU Make để đồng bộ code lên production và nạp module thông qua debug shell