- 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:
- 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
- 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
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.
Đâ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.
Ý 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
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
/tmprồi dùngCode.compilesẽ cho thông báo lỗi tốt hơnDù 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
Tại kosmi.io, họ đang sử dụng hot code upgrade thành công
Chính Nerves và hot code reloading đã khiến họ quan tâm đến Erlang
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 đó
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
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ợ
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