2017-12-01 21 views
1

websocket 피드의 이벤트를 사용하는 앱이 있습니다. Registry.dispatch/3을 호출하여 가입 한 genservers에 메시지를 보내면 genservers가 콘솔로 출력됩니다. 파이프 라이닝은 genstage에서 처리합니다. 프로듀서는 소켓에 앉아 수신 호출로 이벤트를 생성합니다. 그런 다음 상태가 특정 방식으로 영향을받는 경우 소비자는 상태를 관리하고 레지스트리의 프로세스에 이벤트를 전달합니다. 레지스트리에 등록 된 프로세스는 handle_info/2을 통해 메시지를 받으면 이벤트를 기록합니다.누구든지 Registry.dispatch를 무작위로 이벤트 발송을 중지 시켰습니까?

~ 20 분 동안 앱을 실행하면 이벤트가 아무 일도 일어나지 않고 콘솔에 기록되는 것을 멈 춥니 다. 콘솔에서 레지스트리 프로세스를 살펴본 결과 해당 키가있는 레지스트리가 없으므로 프로세스가 구독 취소되었지만 오류가 발생하지 않았으며 모든 것이 자동으로 발생했습니다. 나는 또한 여전히 이벤트를 받고 있었기 때문에, 소비자는 여전히 이벤트를 소비하고 있었고, 레지스트리 디스패치 포인트를 깨고 있었다. websocket 연결이 닫히지 않았고 이벤트가 여전히 읽혀지고 있는지 확인할 수 있습니다.

이것은 복제 할 수있는 문제입니다. 이벤트는 매 실행마다 거의 동일한 지연 후에 인쇄가 중단됩니다. 이는 당혹 스럽습니다. 그게 어딘가에 어떤 종류의 누수가 있다고 생각하게 만들지 만, 관찰자의 부하 그래프는 모두 괜찮다고 나타냅니다.

면책 조항 : 나는 Elixir에서 총 초보자이며 분명하고 사소한 것이지만 내 지식 범위를 벗어날 수 있습니다.

답변

0

파이프 라이닝은 GenStage으로 처리됩니다.

이것은 주로 GenStage 처리에서 교착 상태처럼 보입니다. 소비자이 요청을 보내고 프로듀서handle_demand에서 빈 이벤트 목록을 반환하면 소비자 은 요청 전송을 중단합니다.

done on purpose이며 요청 수요 를 수집하고 나중에을 제공하기 위해 생산의 의무입니다.

+0

안녕하세요. 따라서 GenStage 소비자는 실제로 두 가지 작업을 수행합니다. 즉, ets 테이블에 쓰고 Registry.dispatch를 통해 이벤트를 전달합니다. ets 테이블은 아직 쓰여지고 있지만 레지스트리에 등록 된 프로세스는 디스패치 이벤트를받지 못하고 있음을 알 수 있습니다. 그것이 내가 GenStage 이슈라고 생각하지 않는 이유입니다. –