Elixir에서 분산 시스템 구축하기: 6부 — 명명된... 노트

Elixir에서 분산 시스템 구축하기: 6부 — 명명된 프로세스

이 텍스트는 프로세스 PID를 공개 인터페이스로 사용하는 것의 한계를 설명하고, 검색 가능한 주소를 위한 명명된 프로세스를 솔루션으로 소개합니다. 워커가 충돌하고 재시작되면 새로운 PID를 얻게 되어 이전 PID는 유효하지 않게 됩니다. 죽은 로컬 PID로 메시지를 보내는 것은 오류를 일으키거나 프로세스를 재시작하지 않습니다. 이를 해결하기 위해 클라이언트는 PID를 사용하는 대신 이름에 의존하고 메시지를 보낼 때 이름을 해석할 수 있습니다.이 글은 프로세스에 이름을 지정하는 두 가지 방법, 즉 로컬 등록과 전역 등록을 보여줍니다. Process.register/2는 현재 BEAM 노드에서 PID를 이름으로 등록하며, Process.whereis/1을 통해 접근할 수 있습니다. 등록된 이름으로 직접 메시지를 보낼 수 있으며, 런타임은 이를 현재 PID로 해석합니다. 그러나 Process.register/2는 노드 로컬이므로, 다른 노드에서 동일한 이름은 다른 프로세스를 참조합니다.클러스터 전체 조회를 위해 Erlang의 :global 모듈이 사용됩니다. :global.register_name/2와 :global.whereis_name/1은 연결된 노드 간에 이름을 등록하고 조회할 수 있게 합니다. 세 번째 예시는 워커가 자체를 등록하고 공개 이름을 반환하도록 하여 클라이언트로부터 PID를 숨기는 방법을 보여줍니다. 클라이언트는 PID가 아닌 이름으로 요청을 보냅니다.중요하게도, 프로세스에 이름을 지정하는 것은 감독 또는 라이프사이클 관리를 해결하지 않으며, 단지 검색만 해결합니다. 등록된 프로세스가 종료되면 등록이 제거되고, 대체 프로세스를 시작하고 다시 등록해야 합니다. 단일 이름은 일반적으로 단일 소유자를 참조하므로, 추가 라우팅 메커니즘 없이는 워커 풀에 적합하지 않습니다. 여러 요청이 진행 중인 클라이언트는 고유 참조를 사용하여 응답을 상관시키는 것이 좋습니다. 마지막으로, :global 등록은 분산 시스템을 용이하게 하지만 네트워크 분할 또는 동시 주장과 같은 문제를 제거하지는 않습니다. 제시된 핵심 아이디어는 복원력 있는 시스템을 구축하기 위해 임시 PID 대신 서비스 역할을 위해 프로세스 이름을 사용하는 것입니다.