Elixir / erlang은 마이크로 서비스 접근 방식에 적합합니까? [닫은]


109

최근에 여러 공동 작업 마이크로 서비스를 배포하기 위해 docker compose를 사용하여 몇 가지 실험을 수행했습니다. 마이크로 서비스가 제공하는 많은 이점을 볼 수 있으며, 이제이를 관리 할 수있는 좋은 도구 세트가 있으므로 마이크로 서비스 마차에 뛰어 드는 것이 그리 어렵지 않다고 생각합니다.

하지만 저는 Elixir도 실험 해 왔고, 그 자체로 제공되는 이점을 아주 좋아합니다. 코드를 여러 분리 된 애플리케이션으로 압축하고 핫 코드 업그레이드를 지원한다는 점을 감안할 때 docker와 elixir (또는 erlang)를 어떻게 혼합 할 수 있습니까?

예를 들어, dev-prod 패리티를 제공하기 때문에 docker를 사용하고 싶다면 elixir가 어떻게 적합합니까? 도커 컨테이너가 불변이라는 점을 감안할 때 핫 코드 업그레이드를 수행 할 수있는 기능을 잃어 버리죠? 블루 / 그린 배포 또는 카나리아 릴리스는 어떻습니까?

내 말은, Elixir로 마이크로 서비스를 작성하고 마치 다른 언어로 작성된 것처럼 사용할 수 있다는 뜻입니다. 다국어는 어쨌든 마이크로 서비스의 이점 중 하나이지만 OTP 플랫폼을 사용하는 모든 이점을 얻지는 못합니다. 순수한 협업 erlang 애플리케이션이 중간 대기열을 사용하여 서로 다른 (또는 그렇지 않은) 언어로 작성된 마이크로 서비스간에 통신하는 것보다 훨씬 더 최적이라고 생각합니다.


7
나는 그 질문이 "연구 노력을 보여주지 않는다"는 이유로 반대표를 던졌다는 것을 알고 있습니다. 그것은 사실이 아니기 때문에 슬프고, 물론 문제는 질문 자체에있을 수도 있지만, 최근에 내가하고있는 유일한 일이기 때문에 조사하지 않았다고 비난받을 수는 없습니다. 많이.
Papipo

1
이 질문은 너무 광범위합니다. stackoverflow에 대한 질문은 특정 문제를 포함하기위한 것입니다.
Paweł Obrok

4
다른 stackexchange 사이트로 이동해야합니까? 질문이 합법적 인 IMO이기 때문입니다.
Papipo

2
흥미로운 질문이라고 생각하지만 프로그래머 stackexchange에 속할 수 있습니까? 그 존재는 닫습니다 투표를하지 말했다
조지 마우어에게

1
그것은 굉장하고 완전히 일을 위해 만들어졌습니다.
브라이언 헌트

답변:


138

이것은 매우 공개 된 질문이지만 Elixir / Erlang이 분산 시스템 개발을위한 최고의 플랫폼이 될 수있는 이유를 설명하려고 노력할 것입니다 (마이크로 서비스로 작업하는 경우에 관계없이).

먼저 배경 지식부터 시작하겠습니다. Erlang VM과 표준 라이브러리는 분산 시스템을 구축하기 위해 미리 설계되었으며 실제로 나타납니다. 내가 아는 한,이 사용 사례를 위해 미리 설계된 프로덕션에서 널리 사용되는 유일한 런타임 및 VM입니다.

응용

예를 들어, "응용 프로그램"에서 이미 암시했습니다. Erlang / Elixir에서 코드는 다음과 같은 응용 프로그램 내부에 패키지됩니다.

  1. 단위로 시작 및 중지됩니다. 시스템을 시작하고 중지하는 것은 모든 응용 프로그램을 시작하는 문제입니다.
  2. 통합 된 디렉토리 구조 및 구성 API (XML이 아님)를 제공합니다. 이미 OTP 응용 프로그램으로 작업하고 구성한 경우 다른 응용 프로그램으로 작업하는 방법을 알고 있습니다.
  3. 모든 프로세스 (프로세스는 경량의 계산 스레드 인 "VM 프로세스"를 의미) 및 해당 상태와 함께 애플리케이션 감독 트리를 포함합니다.

이 디자인의 영향은 엄청납니다. 즉, Elixir 개발자는 응용 프로그램을 작성할 때 다음에 대한보다 명시적인 접근 방식을 사용합니다.

  1. 코드 시작 및 중지 방법
  2. 응용 프로그램의 일부를 구성하는 프로세스는 무엇이며 따라서 응용 프로그램 상태는 무엇입니까?
  3. 충돌 또는 문제 발생시 이러한 프로세스가 반응하고 영향을받는 방식

뿐만 아니라이 추상화를 둘러싼 도구는 훌륭합니다. Elixir가 설치되어 있다면 "iex"를 열고 다음을 입력하십시오 :observer.start().. 라이브 시스템에 대한 정보와 그래프를 표시하는 것 외에도 임의의 프로세스를 종료하고 메모리 사용량, 상태 등을 볼 수 있습니다. 다음은 Phoenix 애플리케이션에서이를 실행하는 예입니다.

Phoenix 애플리케이션으로 실행중인 Observer

여기서 차이점은 응용 프로그램과 프로세스 가 프로덕션에서 코드에 대한 추론을 추상화한다는 것 입니다. 대부분의 언어는 런타임 시스템에 반영되지 않은 코드 구성을위한 패키지, 개체 및 모듈을 제공합니다. 클래스 속성 또는 싱글 톤 객체가있는 경우이를 조작 할 수있는 엔티티에 대해 어떻게 추론 할 수 있습니까? 메모리 누수 또는 병목 현상이있는 경우 해당 개체를 어떻게 찾을 수 있습니까?

분산 시스템을 실행하는 사람에게 물어 보면 그것이 그들이 원하는 통찰이며 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.

더 나아갈 수도 있지만이 시점에서 당신을 설득했으면합니다. :)


사실 저는 Elixir와 OTP를 많이 좋아하는데, Elixir를 사용하면서 마이크로 서비스 (dev-prod 패리티, 카나리아 릴리스 등)의 이점을 얻는 방법에 대한 질문이 더 많았습니다.
Papipo

Docker에 대한 단락이 있지만 길을 잃었습니다. :) 요점은 노드 배포에 사용하므로 노드별로 적합한 응용 프로그램을 선택한다는 것입니다. 블루 / 그린 배포는 확실히 달성 가능하지만 프로토콜, 상태 종류 및 기타 요인에 따라 다릅니다.
José Valim

5
제가 언급 한 강연은 블루 / 그린 또는 카나리아에 사용할 수있는 라우팅 레이어를 다룹니다. 다시 말하지만, 선택한 프로토콜에 따라 다르지만 분산 된 Erlang의 전역 항목, consul을 사용하는 항목 또는 HTTP 기반 항목에 대한 haproxy에서 이동할 수 있습니다.
José Valim

서비스 검색 접근 방식이 합리적입니다. 나는 항상로드 밸런싱 용어를 생각하고 있었다고 생각합니다.
Papipo

1
특정 작업에 가장 적합한 언어 선택과 같은 마이크로 서비스의 다른 이점 중 하나는 어떻습니까? 나는 elixir를 좋아하지만 모든 작업에 가장 적합한 언어는 아닙니다. 내 말은 특정 마이크로 서비스가 엘릭서 대신 다른 언어를 사용하기 위해 필요할 수 있다는 것입니다. 그렇다면 여전히 전통적인 마이크로 서비스 아키텍처를 따라야합니까?
Jeancarlo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.