고전-Erlang 분포 의 핵심 기술 분석
본 고 는 Erlang 시스템 의 핵심 기술 과 몇 가지 중요 한 특성 을 간단하게 소개 했다.분포,다 핵심 지원,fp.그리고 erlang 의 가장 강력 한 특성 인 분포 특성 에 대해 중점 적 으로 소개 했다.
Erlang 시스템 은 내 가 보기에 세 가지 특성 이 있다.1.분포 2.다 중 핵심 지원 3.fp.이 세 가지 특성 중 분 포 는 erlang 이 가장 강력 하 다 고 생각 합 니 다.첫 번 째 버 전부터 지금까지 지원 되 었 고 상대 적 으로 성숙 하 며 다 중 핵심 지원 은 몇 년 동안 추가 되 었 습 니 다.erlang 의 분포 시스템 은 2 시 까지 만 들 었 습 니 다.
1.노드 의 위치 무관 성;
2.사용자 분포 식 투명.
구체 적 으로 보면 node 는 이름 으로 식별 되 고 프로 세 스 도 pid 로 식별 된다.분포 시스템 은 노드 간 통신 을 실현 해 야 하고 erlang 도 열 외 에 있 지 않다.erlang 의 노드 통신 미디어 는 현재 공식 버 전 으로 tcp,ssl 통신 을 지원 합 니 다.
사용 가능-protodist xxxx 에서 채널 을 선택 합 니 다.현재 inet 지원ssl inet_tcp 사용 자 는 이 두 개의 통신 프로 토 콜 을 모방 하여 자신의 전송 채널 을 쓰기 쉽다.즉,이 채널 이 신뢰 할 수 있 고 정 보 를 잃 어 버 리 지 않도록 요구 하 는 것 이다.
이 몇 가 지 는 방화벽 의 우 호 를 실현 한다.
{inet_dist_use_interface, ip_address()}
//If the host of an Erlang node has several network interfaces,
//this parameter specifies which one to listen on.
See inet(3) for the type definition of ip_address().
{inet_dist_listen_min, First}
See below.
{inet_dist_listen_max, Last}
Define the First..Last port range for the listener socket of a distributed Erlang node.
erlang 의 커 널 에 분포 와 관련 된 erl 모듈 은 주로 net 가 있 습 니 다.kernel inet_tcp_dist inet_ssl_dist inet_tcp dist_util erlang.사용자 가 erl-sname xxxx 를 실행 하여 erlang 시스템 을 시작 할 때 kernel 모듈 은 net 를 시작 합 니 다.kernel 과 epmd 모듈.
epmd 의 역할 은 감청 주소 포트 에 node 이름 을 제공 하 는 맵 입 니 다.epmd 는 유명 포트 4369 를 지 키 고 있 습 니 다.netkernel 은 proto 를 시작 합 니 다.dist 예 를 들 면 inettcp_dist 감청 포트,동시에 포트 를 epmd 에 보고 합 니 다.
이때 erts 는 노드 통신 을 준비 했다.이때 다른 노드 가 우리 와 통신 하려 고 할 때 먼저 연결 해 야 한다.절 차 는 대략 이렇다.1.노드 이름 에 따라 노드 주 소 를 찾는다.2.노드 의 4369 포트,즉 epmd 를 조회 하여 노드 에 대응 하 는 inettcp_dist 감청 포트.3.연결,악수,쿠키 인증 을 시작 하고 권한 이 부여 되 지 않 으 면 실패 합 니 다.4.노드 이름과 응답 정 보 를 기록 합 니 다.
따라서 노드 가 정상 적 인 통신 을 하려 면 firewall 과 nat 의 영향,그리고 쿠키 가 정상 적 인 것 을 고려 해 야 합 니 다.
노드 에 메 시 지 를 보 내 려 면 먼저 우리 가 노드 와 연락 한 것 을 확보 해 야 한다.즉,우리 의 노드 표 에서 이 노드 를 찾 을 수 있다 는 것 이다.net_kernel 은 노드 의 가용성 을 원 합 니 다.정기 적 으로 tick 메 시 지 를 보 내 고 노드 의 접근 성 을 유지 합 니 다.엔 드 노드 에 도 nodeup,nodeup 등 메 시 지 를 주동 적 으로 보 내 유지 에 협조 합 니 다.
net_ticktime = TickTime
Specifies the net_kernel tick time. TickTime is given in seconds. Once every TickTime/4
second,all connected nodes are ticked (if anything else has been written to a node) and if
nothing has been received from another node within the last four (4) tick times that node is
considered to be down. This ensures that nodes which arenot responding, for reasons such as
hardware errors, are considered to be down.
노드 는 두 가지 유형 으로 볼 수 있 는 것 과 보이 지 않 는 것 이 있다.erlang 노드 는 볼 수 있 습 니 다.cinterface 가 쓴 노드 는 보이 지 않 습 니 다.c 모듈 이 제공 하 는 노드 능력 이 유한 하기 때 문 입 니 다.
erlang 프로 세 스 는 통신 을 통 해 1.pid 를 통과 할 수 있 습 니 다. 2.프로 세 스 이름 으로 진행 합 니 다.erlang 시스템 의 큰 위력 은 elang 으로 이름과 pid 의 전체적인 유 지 를 실현 하고 있 습 니 다.즉,erlang 은 명칭 의 실 효 를 해결 하기 위해 상당히 복잡 한 모듈 을 만 들 었 다.정상 적 인 상황 에서 이름 은 전역 적 인 것 이다.즉,erlang 의 노드 는 모두 연결 되 어 있어 서 조정 할 수 있다.
auto_connect = Value
Specifies when no will be automatically connected. If this parameter is not specified,
a node is always automatically connected, e.g when a message is to be sent to that node.
Value is one of:
never
Connections are never automatically connected, they must be explicitly connected.
See net_kernel(3).
once
Connections will be established automatically, but only once per node. If a node goes
down,
it must thereafter be explicitly connected. See net_kernel(3).
erlang 투명 프로 세 스 통신 을 실현 하 는 관건 은 pid 의 변환 에 있 습 니 다.pid{X,Y,Z}이 네트워크 에 보 낼 때 보 내 는 형식 은{sysname,Y,Z}입 니 다.노드 전에 서로 연락 을 했 기 때문에 상대방 의 sysname 을 알 고 sysname 은 dist 에 있 습 니 다.entry 에 저장,쌍 끝 에서 dec 받 으 면pid 를 사용 할 때 peer sysname 으로 자신의 dist 를 찾 습 니 다.entry 안의 색인,그리고 이 index 로 새로운 pid,즉{index,Y,Z}를 구성 합 니 다.erlang 이 pid 에 메 시 지 를 보 낼 때 먼저 Pid 가 로 컬 인지 외부 인지 확인 하고 외부 라면 위의 변환 을 한 다음 inettcp_dist 모듈,inet 를 따라tcp, inet_drv 이 선 을 보 냅 니 다.이 소식 이 끝 에 도 착 했 을 때 inetdrv 는 먼저 이 소식 을 받 았 습 니 다.이치 대로 inet 에 제출 해 야 합 니 다.tcp,그리고 inettcp_dist, net_kernel 이 처리 합 니 다.하지만 erlang 은 효율 적 인 고려 를 위해 절충 을 했 습 니 다.inetdrv 안쪽 driveroutput*에서 메시지 의 유형 을 검사 합 니 다.dist 에서 온 메시지 라면 ertsnet_메시지 로 처리 합 니 다.이 ertsnet_message 는 다음 과 같은 몇 가지 중요 한 정 보 를 처리 합 니 다.
#define DOP_SEND 2
#define DOP_EXIT 3
#define DOP_UNLINK 4
#define DOP_NODE_LINK 5
#define DOP_REG_SEND 6
#define DOP_GROUP_LEADER 7
#define DOP_EXIT2 8
#define DOP_SEND_TT 12
#define DOP_EXIT_TT 13
#define DOP_REG_SEND_TT 16
#define DOP_EXIT2_TT 18
#define DOP_MONITOR_P 19
#define DOP_DEMONITOR_P 20
#define DOP_MONITOR_P_EXIT 21
DOP 라면SEND 는 변 경 된 프로 세 스 의 대기 열 에 message 를 넣 습 니 다.이 핵심 기능 은 beam 의 c 모듈(dist.c,erlnode_tables.c,io.c)와 netkernel 모듈 과 함께 구현 합 니 다.그리고 이 밑바닥 의 원 어 에서 rpc 와 같은 상부 모듈 을 한층 더 실현 하여 사용 자 를 더욱 편리 하 게 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Instalando o Elixir e o Erlang com o gerenciador de versões asdfEsse tutorial usa o gerenciador de versões asdf, mas fique a vontade para utilizar outros se preferir. Infelizmente o as...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.