2012-10-20 4 views
6

Erlang으로 개발 된 websocket 서버에서 클라이언트로부터 "ping"을받지 않고 시간 초과가 경과하면 각 연결마다 타이머 (start_timer/3)를 사용하여 연결을 종료하고 싶습니다.Erlang 타이머의 크기를 조정합니까?

Erlang 타이머는 클라이언트 연결 수가 많다고 가정하면 잘 조정됩니까?

답변

8

많은 수의 연결이 있습니까? Erlangs VM은 내부적으로 타이머 휠을 사용하여 타이머를 처리하므로 수천 개의 연결까지 잘 조정됩니다. 그러면 문제가 생길 수 있습니다.

일반적으로 트릭은 타이머에 pids를 그룹화하는 것입니다. 이것은 또한 커널이하는 경향이 있습니다. 예를 들어 200ms로 깨어 있어야하는 타이머가있는 경우 다음 시간이 아니라 미리 다음 200ms 타이머를 예약하십시오. 즉, 최소 200ms 및 400ms, 일반적으로 300ms를 기다립니다. 이와 같은 타이머를 근사화하면 한 번에 하나의 타이머가 대량의 프로세스를 한 번에 깨울 수 있으므로 더 많은 작업을 수행 할 수 있습니다. 그러나 타이머 빈도와 타이머 양에 따라 표준 send_after/3이면 충분할 수 있습니다.

어쨌든 위와 같은 대략적인 타이밍을 수행하지 못하면 문제를 처리하고 조정할 수 있다고 가정하여 시작할 것입니다.

0

이러한 유형의 서버에 대한 일반적인 패턴은 가벼운 무게의 Erlang 프로세스를 활용하고 연결 당 서버를 만드는 것입니다. 당신은 당신에게 두

  • 국가의 변수 (연결 대기, 로그인, ...) 연결을 관리 할 수있는 다른 상태,
  • 을 제공 gen_server 동작을 사용하여 예를 들어 서버를 구축 할 수 있습니다

  • 각 연결 및 각 상태에서 VM 및 OTP 동작에 의해 관리되는 개별 시간 초과.

멋진 점은 각 서버가 하나의 클라이언트를 돌봐야한다는 것이므로 작성하기가 더 쉽습니다.

초기화 단계는

그런 다음 연결 서버가 시작한다, 하나 개의 서버가 접속을 대기 시작해야 새 (이상적으로 감독자 시작 simple_one_for_one 아이를 통해) 다음 클라이언트에 대한 준비가 한 단계 또는 당신이 무엇을 로그인으로 이동 하고 싶다.

LearnYouSomeErlang 사이트에서 특히 흥미로운 내용은 http://learnyousomeerlang.com/supervisors 및 다음 내용을 참조하십시오.

관련 문제