: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 모듈은 각 노드의 연결 정보를 이용해 이 이름이 유일하도록 보장합니다.
즉, 분산 환경에서 여러 노드가 있을 때 동일한 이름으로 프로세스를 중복 등록하는 일이 없도록 합니다.
Atom의 정의:
Atom은 Elixir (그리고 Erlang)에서 상수 데이터 타입으로, 고유하고 불변한 값을 나타냅니다.
예를 들어, :ok, :error, :global, :my_atom 등은 모두 atom입니다.
Atom은 무엇인가요?
Atom과 모듈:
모듈 이름도 내부적으로는 atom입니다. 예를 들어, MyModule이라는 모듈은 실제로 :"Elixir.MyModule"라는 atom으로 표현됩니다.
하지만 모든 atom이 모듈은 아닙니다. 모듈은 특별한 역할(함수, 콜백, 등)을 가지는 코드 집합이고, atom은 단순한 상수입니다.
:ets와의 관계:ets는 무엇인가요?
:ets (Erlang Term Storage)는 메모리 내에 데이터를 저장하는 테이블로, 고속 접근 및 동시성을 지원하는 저장소입니다.
이를 통해 프로세스 간의 공유 상태를 관리할 수 있습니다.
:global과 :ets의 차이:
:global은 분산 시스템에서 전역 프로세스 이름 등록에 사용되는 모듈입니다.:ets는 데이터를 저장하고 조회하기 위한 테이블을 관리하는 모듈입니다.분산 환경 구성:
코드에서 name: {:global, __MODULE__} 와 같이 전역 등록을 사용하면, 해당 프로세스는 노드 간에 고유한 이름으로 등록됩니다.
이를 이용하면, 여러 터미널(또는 여러 노드)에서 IEx를 실행하고 Node.connect/1, Node.ping/1 등과 같은 함수로 노드 간 연결을 맺어 메시지를 주고받을 수 있습니다.
예시:
iex --sname node1 -S mix이때 Node.self()는 :"node1@hostname"와 같이 나타납니다.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 등으로 노드들을 연결하고, 전역 등록된 프로세스에 메시징을 수행할 수 있습니다.