distributed process

eesope·2025년 3월 6일

elixir

목록 보기
4/5

1. :global에 대한 이해

  • :global은 모듈인가요?
    :global은 Erlang/OTP에서 제공하는 표준 모듈입니다.
    Elixir에서도 동일하게 사용할 수 있으며, 이 모듈은 분산 환경에서 프로세스 이름의 전역 등록(global registration) 을 지원합니다.
    공식 문서에서는 Erlang :global 모듈에서 확인할 수 있습니다.
    즉, :global은 단순히 이름을 갖는 atom이 아니라, Erlang 모듈의 이름(즉, 모듈 식별자로서 atom)을 의미하며, 이 모듈의 API를 통해 노드 간에 고유한 이름을 보장할 수 있습니다.

  • 어떻게 작동하나요?
    예를 들어,

    GenServer.start_link(__MODULE__, state, name: {:global, MyProcessName})

    이렇게 하면, 해당 프로세스는 모든 노드에 걸쳐 :global 등록소에 "MyProcessName"이라는 이름으로 등록됩니다.
    내부적으로 :global 모듈은 각 노드의 연결 정보를 이용해 이 이름이 유일하도록 보장합니다.
    즉, 분산 환경에서 여러 노드가 있을 때 동일한 이름으로 프로세스를 중복 등록하는 일이 없도록 합니다.


2. Elixir에서 Atom의 역할

  • Atom의 정의:
    Atom은 Elixir (그리고 Erlang)에서 상수 데이터 타입으로, 고유하고 불변한 값을 나타냅니다.
    예를 들어, :ok, :error, :global, :my_atom 등은 모두 atom입니다.

  • Atom은 무엇인가요?

    • 상수:
      atom은 한 번 만들어지면 변경되지 않는 고정된 값입니다.
    • 식별자:
      종종 함수, 모듈, 프로세스 등록 등의 이름을 표현하는 데 사용됩니다.
    • 가볍고 빠름:
      다른 데이터 타입에 비해 메모리 사용량이 적으며, 비교 연산이 빠릅니다.
  • Atom과 모듈:
    모듈 이름도 내부적으로는 atom입니다. 예를 들어, MyModule이라는 모듈은 실제로 :"Elixir.MyModule"라는 atom으로 표현됩니다.
    하지만 모든 atom이 모듈은 아닙니다. 모듈은 특별한 역할(함수, 콜백, 등)을 가지는 코드 집합이고, atom은 단순한 상수입니다.


3. :ets와의 관계

  • :ets는 무엇인가요?
    :ets (Erlang Term Storage)는 메모리 내에 데이터를 저장하는 테이블로, 고속 접근 및 동시성을 지원하는 저장소입니다.
    이를 통해 프로세스 간의 공유 상태를 관리할 수 있습니다.

  • :global:ets의 차이:

    • :global은 분산 시스템에서 전역 프로세스 이름 등록에 사용되는 모듈입니다.
    • :ets는 데이터를 저장하고 조회하기 위한 테이블을 관리하는 모듈입니다.
      이 둘은 목적이 다르지만, 둘 다 Erlang/OTP의 핵심 기능이며, atom을 테이블 이름이나 프로세스 이름 등으로 활용할 수 있습니다.

4. 분산 환경과 Node 모듈

  • 분산 환경 구성:
    코드에서 name: {:global, __MODULE__} 와 같이 전역 등록을 사용하면, 해당 프로세스는 노드 간에 고유한 이름으로 등록됩니다.
    이를 이용하면, 여러 터미널(또는 여러 노드)에서 IEx를 실행하고 Node.connect/1, Node.ping/1 등과 같은 함수로 노드 간 연결을 맺어 메시지를 주고받을 수 있습니다.

  • 예시:

    • 터미널 1:
      iex --sname node1 -S mix
      이때 Node.self():"node1@hostname"와 같이 나타납니다.
    • 터미널 2:
      iex --sname node2 -S mix
      그리고 터미널 1에서:
      Node.connect(:"node2@hostname")
      Node.list()  # node2가 표시되어야 합니다.
    • 전역 등록된 프로세스(예: :global에 등록된 Chat.Server)가 있다면, 이 노드들 사이에서 고유한 이름으로 접근할 수 있습니다.

결론

  • :global은 atom이 아니라 Erlang의 표준 모듈로, 분산 환경에서 프로세스 이름을 전역적으로 관리하는 기능을 제공합니다.
    공식 문서는 Erlang :global documentation을 참고하세요.

  • Atom은 상수 데이터 타입이며, 모듈 이름, 프로세스 이름, 상태값 등 여러 용도로 사용됩니다.
    모든 atom이 모듈은 아니지만, 모듈 이름도 내부적으로 atom입니다.

  • :ets는 데이터를 저장하기 위한 테이블 관리 시스템이고, :global은 전역 프로세스 이름 등록을 위한 모듈입니다.

  • 분산 환경 구성:
    만약 코드에 name: {:global, __MODULE__}와 같이 되어 있다면, compile 후 IEx를 여러 터미널에서 실행하여 Node.connect, Node.ping 등으로 노드들을 연결하고, 전역 등록된 프로세스에 메시징을 수행할 수 있습니다.

profile
go simple 🧑🏻‍💻

0개의 댓글