라거를 사용할 때 문제가 발생합니다. 라거 소스 코드에서 lager_backend_throttle.erl 파일.왜 이런 방식으로 디자인합니까?
handle_event({log, _Message},State) ->
{message_queue_len, Len} = erlang:process_info(self(), message_queue_len),
case {Len > State#state.hwm, State#state.async} of
{true, true} ->
%% need to flip to sync mode
lager_config:set(async, false),
{ok, State#state{async=false}};
{false, false} ->
%% need to flip to async mode
lager_config:set(async, true),
{ok, State#state{async=true}};
_ ->
%% nothing needs to change
{ok, State}
end;
message_queue_len이 임계 값을 초과하면 동기화 모드로 전환됩니다.
message_queue_len이 Thershold보다 작 으면 비동기 모드로 전환됩니다.
너무 많은 메시지가있을 때 메시지를 더 빨리 처리하기 위해 비동기 모드로 변경해야한다고 생각합니다. 왜 라거 디자인 이런 식으로?
내가 추측하는 이유는 message_queue에 제한 길이가 있다는 것입니다. 너무 많은 메시지가있는 경우 프로세스가 중단 될 수 있습니다. 그래서 lager는 보내는 모드를 변경하여 메시지를 보내는 속도를 조절합니까?
단 한 노트. 메시지 큐 (시스템 메모리 제외)에 제한이 있다고 생각하지 않습니다. – mpm
@mpm 아마 그들이 말하는 것처럼. 들어오는만큼 빠르게 프로세스 메시지를 작성합니다. 너무 많은 메시지가있는 경우 사용자가 lager : notice()를 호출하면이 로그를 인쇄하는 데 오랜 시간이 걸립니다. 이것은 사용자 친화적 인 경험이 아닙니다. – baotiao
mpm은 시스템 메모리에 의해 제한되는 메시지 큐에 대해 정확합니다. 이것은 사서함을 모니터링하는 주요 이유입니다. 처리 할 수있는 것보다 빠르게 프로세스 메시지를 보내면 사서함이 채워지고 Erlang VM에 메모리가 부족합니다. 이렇게하면 프로세스뿐 아니라 전체 VM이 종료되므로 치명적인 오류가 발생합니다. –