Erlang의 경량 프로세스와 메시지 전달에 관한 것이 아닌 본질 (2023)
(stevana.github.io)배경
- Erlang은 신뢰할 수 있는 분산 시스템을 구축하기 위해 개발된 언어로, 처음에는 Prolog 라이브러리로 시작하여 독립적인 언어로 발전함.
- Ericsson에서 전화 교환기를 프로그래밍하는 데 사용되었으며, 1998년에는 오픈 소스로 전환됨.
- Joe Armstrong는 Erlang의 주요 설계자 중 한 명으로, 그의 박사 논문은 소프트웨어 오류가 있는 상태에서 신뢰할 수 있는 분산 시스템을 만드는 방법에 대해 다룸.
행동(Behaviours)
- Erlang의 행동은 Java나 Go의 인터페이스와 유사하며, 여러 구현을 가질 수 있는 타입 서명 모음임.
- 행동은 프로그램의 비즈니스 로직을 정의하는 코드만 작성하면 되고, 인프라 코드는 자동으로 제공됨.
- 행동은 전문가에 의해 작성되며, 최선의 실천을 기반으로 함.
일반 서버 행동
-
gen_server
는 키-값 저장소를 구현하는 예제로 설명됨. -
handle_call
은 상태를 업데이트하거나 키를 조회하는 역할을 하며, 모든 동시성은gen_server
구성 요소에 숨겨져 있음.
이벤트 관리자 행동
-
gen_event
는 이벤트 관리자로, 이벤트 핸들러를 등록하고 메시지가 도착하면 실행함. - 오류 로깅에 유용하며, 간단한 로거 예제가 제공됨.
상태 기계 행동
-
gen_fsm
은gen_statem
으로 이름이 변경되었으며, 프로토콜 구현에 적합함.
감독자 행동
- 감독자는 다른 프로세스가 정상적으로 작동하는지 확인하며, 실패 시 미리 정의된 전략에 따라 재시작함.
-
one_for_one
전략은 실패한 프로세스만 재시작하며,one_for_all
전략은 하나의 프로세스가 실패하면 모든 자식을 재시작함.
애플리케이션 및 릴리스 행동
- 애플리케이션은 감독자 트리와 필요한 모든 것을 포함하며, 릴리스는 하나 이상의 애플리케이션을 패키징함.
- 업그레이드 실패 시 롤백 가능해야 함.
행동의 구현
- Erlang의 경량 프로세스와 메시지 전달보다 행동의 구조가 신뢰할 수 있는 소프트웨어로 이어짐.
- 다른 언어에서 행동을 구현하려면 인터페이스 서명을 사용하여 시작할 수 있음.
행동의 정확성
- 시뮬레이션 테스트는 분산 시스템의 테스트를 용이하게 하며,
gen_server
행동의 구조를 사용하여 문제 해결을 간소화할 수 있음.
기여
- Martin Thompson의 작업에서 아이디어를 도용하여 빠른 이벤트 루프를 만들고, 비동기 I/O를 추가하는 등의 아이디어가 있음.
- 관심이 있거나 의견, 제안, 질문이 있는 경우 연락 가능.
Hacker News 의견
-
Erlang과 BEAM의 놀라운 점은 그 기능의 깊이임. OP에게는 Erlang의 Behavior/Interface가 가장 큰 수확이었음. 개인적으로는 복잡한 시스템을 구축하는 데 필요한 개발 자원이 다른 언어보다 훨씬 적다는 점이 중요하다고 생각함. 많은 사람들에게는 경량 프로세스와 프로그래밍 모델이 매력적임
- OTP는 매우 많은 기능을 포함하고 있음. 우리는 Elixir를 iOS 장치에서 실행할 수 있도록 컴파일하는 작업을 진행 중임. Erlang의 ei 라이브러리를 사용하여 C에서 노드를 컴파일하고, 다른 Erlang 노드와 인터페이스할 수 있음. Erlang의 rpc 라이브러리를 통해 C에서 함수 호출과 Elixir 애플리케이션과의 인터페이스가 가능함
- Erlang은 현대 기술 스택이 고군분투하는 많은 문제를 해결해왔으며, 확장성과 구현 비용 문제를 수십 년 전에 해결했음. 그러나 HN에서는 Erlang/Elixir에 대한 관심이 실제 채택으로 이어지지 않았고, 많은 회사들이 Erlang 스택에서 무료로 제공되는 것을 구현하려고 돈을 낭비하고 있음
-
몇몇 관리자와 함께 경험을 바탕으로 책을 쓰려는 사람들과 일했음. 우리는 성공의 요인에 대해 항상 의견이 달랐음. 어떤 사람들은 경량 프로세스와 메시지 전달이 비밀 소스가 아니라고 주장하지만, Erlang의 Communicating Sequential Processes는 이러한 특성과 분리할 수 없음을 놓치고 있음
- 예시: 애플리케이션 프로그래머는 순차 코드를 작성하고, 모든 동시성은 행동에 숨겨져 있음
- 새로운 팀원이 시작하기 쉬움: 비즈니스 로직은 순차적이며, 이전에 본 적이 있을 수 있는 유사한 구조임
- 감독자와 "충돌 시 방치" 철학은 신뢰할 수 있는 시스템을 만드는 데 기여함
-
경량 프로세스와 메시지 전달 때문에 Erlang에 다시 관심을 갖게 되었음. 현재까지는 행동이 부차적이었음
- 프로젝트는 시각적 Flow Based Programming(FBP)을 Erlang에 도입하는 것임. FBP는 Erlang에 적합해 보이며, 이미 존재하는 것이 놀라웠음
- Node-RED를 FBP의 도구로 사용하고 있으며, 기본 아이디어는 Node-RED 프론트엔드를 Erlang 백엔드에 연결하고 모든 노드를 프로세스로 만드는 것임
-
Ericsson이 왜 Erlang 사용을 중단했는지, Joe의 해고에 대한 정보를 찾고 있었음
- 간단한 답변은 새로운 프로젝트에 Java로 전환하면서 Erlang이 소외되었기 때문임. Joe와 동료들은 1998년에 Bluetail을 설립했고, Nortel에 인수되었음. Nortel은 통신 거대 기업으로, 2000년 주가가 $125에 도달했지만, 2002년에는 $1 이하로 떨어졌음. 이는 닷컴 버블 붕괴와 통신 지출 감소와 관련이 있음
-
Erlang/Elixir의 힘은 Actor 모델 구현, Prolog의 매칭, 불변성, 행동 등이 아니라, Joe가 적은 자원으로 더 많은 것을 할 수 있음을 보여주려는 열망임
- 잘 설계된 일관성 있는 시스템이며, 다른 언어에서는 드물게 목격되는 일관성을 가짐. 완벽하지는 않지만 인상적임
- 소프트웨어 세계에서 단순함이 주는 힘에 대한 인식과 수용이 부족하다고 생각함
-
Erlang, OTP, BEAM은 행동 이상의 것을 제공함. VM은 가상 커널과 유사하며, 감독자, 격리된 프로세스, 분산 모드를 제공함. OTP는 Mnesia(데이터베이스), 원자적 카운터/ETS 테이블(캐싱) 등 유용한 모드를 제공함
- 1년 전, 개인 컨설팅 회사에서 Erlang을 백엔드 언어로 채택했음. BEAM의 내부를 탐색하여 TCP 기반 스택을 QUIC으로 교체하고 Rust 패치를 통합함
-
Erlang/BEAM에서 가장 흥미로운 개념은 부분 복구가 기본적으로 내장되어 있다는 것임. 예기치 않은 상태가 발생하면 전체 프로세스를 종료하거나 손상을 초래할 위험을 감수하는 대신, 가능한 가장 세분화된 수준에서 알려진 좋은 상태로 롤백함
-
Erlang의 행동 구조를 다른 언어와 라이브러리 설계자가 도용하지 않는 이유는 Erlang의 행동 함수 서명이 Erlang의 다른 기능, 특히 불변성의 독특한 사용과 밀접하게 연결되어 있기 때문임
- 다른 언어에서 동일한 목표를 달성하려면 Erlang의 방식을 직접 복사해서는 안 됨. Erlang의 신뢰할 수 있는 소프트웨어에 대해 배우는 것은 추천하지만, 다른 언어에 Erlang의 방식을 그대로 포팅하는 것은 강력히 반대함
-
이 글의 내용에 동의하지 않음. 행동은 시스템의 기본 아키텍처 덕분에 가능함. 행동은 인터페이스가 아니라 Java와 같은 언어의 추상 객체와 유사함
- Joe의 논문은 주어진 레고 블록 세트를 사용하여 신뢰할 수 있는 시스템을 구축하는 방법을 보여줌
-
행동은 그다지 흥미롭지 않음. 다른 프로그래밍 언어에도 존재함. BEAM의 흥미로운 점은 오류를 던지는 것이 매우 우아하다는 것임. 오류를 던지는 것과 행동의 힘은 오류를 포착하고 컨텍스트 정보 보고를 쉽게 하고 일반적으로 구성 가능하게 만듦