12P by neo 10일전 | favorite | 댓글 3개
  • Erlang 생태계의 강력한 기능 중 하나는 핫 코드 업데이트임
  • 이 기능은 거의 다른 런타임에서는 불가능하며 매우 독특함
  • Elixir는 Erlang 위에서 빌드되었으며 동일한 기능을 지원함

Elixir에서 핫 코드 업데이트 적용

  • 표준적인 Elixir 릴리스(mix release) 방식은 Erlang 핫 코드 업데이트를 기본적으로 지원하지 않음
  • 핫 코드 업데이트를 구현하려면 여러 블로그 포스트를 참고하거나 Erlang 공식 문서를 세부적으로 연구해야 함
  • 관련 자료:

핫 코드 업데이트의 실제 활용 사례

  • 핫 코드 업데이트는 실무에서 크게 두 가지로 나뉨:
    1. 간단한 코드 리로드
      • 예: 개발 중 IEx에서 r MyModule 또는 recompile 명령을 실행하는 것
      • 이는 간단하고 유용하지만, 새로운 컴파일러나 빌더의 일부처럼 느껴짐
    2. 더 복잡한 응용
      • Nerves 프로젝트에서 핫 코드 업데이트를 자주 활용:
        • 내장 Elixir 디바이스에서 숫자를 튜닝하거나 모듈을 수정할 때, 펌웨어 업로드 및 재부팅을 기다리는 대신 IEx로 업데이트
        • 애플리케이션의 특정 부분을 시작/중지하거나, GenServer를 종료하여 상태를 초기화
      • NervesHub를 통해 원격 디바이스에 핫 코드 업데이트 적용:
        • 예: 실시간 클럭 디버깅 시 I2C 호출을 직접 실행하며 문제를 빠르게 파악

핫 코드 업데이트의 도구 및 주의사항

  • Elixir의 mix release나 기존 distillery 도구 위에 핫 코드 업데이트를 지원하는 툴링이 늘어나길 희망
  • 핫 코드 업데이트는 데이터베이스 마이그레이션처럼 세심한 주의가 필요:
    • 종속성들이 핫 코드 업데이트에 어떻게 반응하는지 이해해야 함
    • 기타 고려해야 할 다양한 주제 존재

이 내용은 국내 유일 엘릭서 번역서인 처음 배우는 엘릭서 프로그래밍에 자세히 실려 있기도 합니다.

멋지고 강력한 기능이긴 합니다만,
실시간 디버깅 및 확인 용으로만 사용하는게 좋을거 같습니다

Hacker News 의견
  • Discord에서 BEAM 핫 코드 로딩을 사용하여 긴 배포 주기를 단축하고 긴급 업데이트에 활용했음

    • 여러 모듈을 동시에 패치할 수 있는 도구를 개발하여 클러스터에 업데이트를 전파했음
    • Erlang의 내장 분배 기능을 통해 핫 패치를 배포했음
  • Nerves 장치에서 코드 리로딩이 유용하며, 실시간으로 수정 사항을 테스트할 수 있어 통합 테스트에 좋음

    • 원격에서 새로운 펌웨어를 테스트하고 업데이트하여 고객을 만족시켰음
    • 파일을 /tmp에 복사한 후 Code.compile을 사용하는 것이 더 나은 오류 메시지를 제공함
    • 모든 코드를 컴파일하고 삭제하는 헬퍼 함수를 작성하는 것이 간단함
  • Elixir 프로젝트에서 핫 코드 업데이트를 사용할 수 없었지만, 고객에게 도움이 되었을 것이라고 생각함

    • 복잡한 변경 사항에는 핫 코드 업데이트가 문제를 더 일으킬 수 있음
    • 간단한 변경 사항에는 최소한의 영향을 주는 것이 좋음
  • kosmi.io에서 핫 코드 업그레이드를 성공적으로 사용하고 있음

    • 빠른 개발과 수정, 업데이트 배포가 가능함
    • Distillery와 커스텀 스크립트를 사용하지만 표준화되었으면 좋겠음
  • Nerves와 핫 코드 리로딩을 통해 Erlang에 관심을 가지게 되었음

    • 생산 환경에서 실용적이지는 않지만, 신뢰할 수 있는 시스템 구축에 유용한 도구임
  • 릴업 준비 시 매우 주의해야 하며, Linux에서는 새로운 서버를 실행하고 세션 데이터를 전송하는 방법도 있음

    • 핫 패칭은 동일한 VM을 계속 실행하기 때문에 만족스럽지 않을 수 있음
  • Elixir를 임베디드 Linux에 배포하며, Nerves가 systemd를 대체하고 BEAM VM을 프로세스 1로 부팅함

    • Elixir를 하드웨어에 가깝게 배치함
  • WhatsApp은 과거에 SSH 스크립트를 사용하여 모든 노드에서 핫 리로딩을 수행했음

  • 핫 코드 업데이트는 유용하지만 쉽게 실수를 유발할 수 있으며 지원이 부족함

    • 핫 코드 업데이트의 이점은 신중한 롤링 재시작을 통해 얻을 수 있음
    • Erlang의 코드 리로딩 기능을 활용하여 실시간 문제 진단 도구를 만들 수 있음
  • 핫 코드 업데이트는 많은 클라이언트가 연결된 상황에서 코드 변경을 수행할 때 유리함

    • GNU Make를 사용하여 코드를 프로덕션에 동기화하고 디버그 셸을 통해 모듈을 로드했음