이것은 매우 공개 된 질문이지만 Elixir / Erlang이 분산 시스템 개발을위한 최고의 플랫폼이 될 수있는 이유를 설명하려고 노력할 것입니다 (마이크로 서비스로 작업하는 경우에 관계없이).
먼저 배경 지식부터 시작하겠습니다. Erlang VM과 표준 라이브러리는 분산 시스템을 구축하기 위해 미리 설계되었으며 실제로 나타납니다. 내가 아는 한,이 사용 사례를 위해 미리 설계된 프로덕션에서 널리 사용되는 유일한 런타임 및 VM입니다.
응용
예를 들어, "응용 프로그램"에서 이미 암시했습니다. Erlang / Elixir에서 코드는 다음과 같은 응용 프로그램 내부에 패키지됩니다.
- 단위로 시작 및 중지됩니다. 시스템을 시작하고 중지하는 것은 모든 응용 프로그램을 시작하는 문제입니다.
- 통합 된 디렉토리 구조 및 구성 API (XML이 아님)를 제공합니다. 이미 OTP 응용 프로그램으로 작업하고 구성한 경우 다른 응용 프로그램으로 작업하는 방법을 알고 있습니다.
- 모든 프로세스 (프로세스는 경량의 계산 스레드 인 "VM 프로세스"를 의미) 및 해당 상태와 함께 애플리케이션 감독 트리를 포함합니다.
이 디자인의 영향은 엄청납니다. 즉, Elixir 개발자는 응용 프로그램을 작성할 때 다음에 대한보다 명시적인 접근 방식을 사용합니다.
- 코드 시작 및 중지 방법
- 응용 프로그램의 일부를 구성하는 프로세스는 무엇이며 따라서 응용 프로그램 상태는 무엇입니까?
- 충돌 또는 문제 발생시 이러한 프로세스가 반응하고 영향을받는 방식
뿐만 아니라이 추상화를 둘러싼 도구는 훌륭합니다. Elixir가 설치되어 있다면 "iex"를 열고 다음을 입력하십시오 :observer.start()
.. 라이브 시스템에 대한 정보와 그래프를 표시하는 것 외에도 임의의 프로세스를 종료하고 메모리 사용량, 상태 등을 볼 수 있습니다. 다음은 Phoenix 애플리케이션에서이를 실행하는 예입니다.
여기서 차이점은 응용 프로그램과 프로세스 가 프로덕션에서 코드에 대한 추론을 추상화한다는 것 입니다. 대부분의 언어는 런타임 시스템에 반영되지 않은 코드 구성을위한 패키지, 개체 및 모듈을 제공합니다. 클래스 속성 또는 싱글 톤 객체가있는 경우이를 조작 할 수있는 엔티티에 대해 어떻게 추론 할 수 있습니까? 메모리 누수 또는 병목 현상이있는 경우 해당 개체를 어떻게 찾을 수 있습니까?
분산 시스템을 실행하는 사람에게 물어 보면 그것이 그들이 원하는 통찰이며 Erlang / Elixir를 사용하면이를 빌딩 블록으로 사용할 수 있습니다.
통신
이 모든 것은 시작에 불과합니다. 분산 시스템을 구축 할 때 통신 프로토콜과 데이터 시리얼 라이저를 선택해야합니다. 많은 사람들이 실제로 RPC 호출을 수행하는 데 매우 장황하고 값 비싼 조합 인 HTTP와 JSON을 선택합니다.
Erlang / Elixir를 사용하면 이미 통신 프로토콜과 직렬화 메커니즘을 즉시 사용할 수 있습니다. 두 대의 컴퓨터가 서로 통신하도록하려면 이름 만 제공하고 동일한 비밀을 가지고 있는지 확인하면됩니다.
Jamie는 Erlang Factory 2015에서 이에 대해 이야기했으며이를 활용하여 게임 플랫폼을 구축하는 방법은 다음과 같습니다. https://www.youtube.com/watch?v=_i6n-eWiVn4
HTTP 및 JSON을 사용하려는 경우에도 괜찮습니다. Plug와 같은 라이브러리와 Phoenix와 같은 프레임 워크는 여기서도 생산성을 보장합니다.
마이크로 서비스
지금까지 마이크로 서비스에 대해서는 언급하지 않았습니다. 그 이유는 지금까지는 중요하지 않기 때문입니다. 이미 격리 된 매우 작은 프로세스를 중심으로 시스템과 노드를 설계하고 있습니다. 원한다면 나노 서비스라고 부르세요!
뿐만 아니라, 하나의 단위로 시작 및 중지 할 수있는 엔티티로 그룹화하는 애플리케이션으로 패키지화됩니다. 응용 프로그램 A, B 및 C가 있고이를 [A, B] + [C] 또는 [A] + [B] + [C]로 배포하려는 경우 그렇게하는 데 거의 문제가 없습니다. 고유 한 디자인에. 또는 더 나은 방법은 마이크로 서비스 배포의 복잡성을 시스템에 추가하지 않으려는 경우 동일한 노드에 모두 배포하면됩니다.
그리고 하루가 끝날 때 Erlang Distributed Protocol을 사용하여이 모든 것을 실행하는 경우 다른 노드에서 실행할 수 있으며 . {:node@network, :name}
대신에서 참조하는 한 다른 노드에 도달 할 수 있습니다 :name
.
더 나아갈 수도 있지만이 시점에서 당신을 설득했으면합니다. :)