개발자 블로그

PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR 에러 해결 본문

프로그래밍/Node.js

PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR 에러 해결

로이드.Roid 2021. 12. 21. 22:22

완전한 해결 방법은 아니지만 혹시나 도움이 될까 싶어서 공유한다.

Node.js 환경에서 MySQL(mariaDB)에 연결할 때 발생하는 에러인데, 아래는 전체 에러 로그 캡처 화면이다.

메시지는 이렇다: Error: Cannot enqueue Query after fatal error.

치명적인 오류가 발생 한 뒤에는 쿼리를 큐에 넣을 수 없다.. 정도로 번역이 가능할 것 같은데, 왜 치명적인 오류가 발생한건지는 모르겠다.

Node.js와 MySQL(mariaDB)를 이용해서 서비스를 운영하고 있다면 잘 알테지만 일정시간동안 서비스 요청이 없으면 DB connection이 끊긴다. 그러면서 node.js 서비스도 종료가 되고. 그래서 많이들 이용하는게 아마 PM2가 아닐까 싶다. 나 역시 PM2를 사용하고 있고.

PM2에 대해서 자세한 내용이 궁금하다면 아래 링크를 클릭!

https://g.co/kgs/1Qtpph

 

PM2

 

www.google.com

 

그럼 얼마동안 서비스 요청이 없을 때 DB 커넥션이 끊기느냐가 중요한데, 이 시간은 php admin의 "환경설정값" 탭에서 쉽게 변경이 가능하다. 중요한 것은 이 시간이 너무 짧게 설정되어 있으면 위 에러가 발생할 수 있다는거다. 왜 에러가 발생하는지는 모르겠다. 설정한 시간이 짧다고 항상 에러가 발생하는건 아니고, PM2가 자동으로 서비스를 띄워주는데 어쩌다 한 번씩 이렇게 에러가 나면서 서비스가 죽는 경우가 생긴다.

그럼 해결 방법은 뭐냐? "서비스 요청이 없을 때 DB 커넥션을 끊는 시간". 이 시간을 매우 길게 설정하면 에러 발생하는 경우가 확 줄어든다. 아니, 지금까지 내 경험으로는 발생한 적이 한 번도 없다. 서버마다 설정이 다르겠지만, 내 경우에 디폴트로 잡혀있는 시간이 10분이었던 것 같다. 이 상태로 서비스 하면서 위 에러가 한 번 발생했었고, 시간을 24시간이었나? 그정도로 늘리니깐 그 뒤로는 에러가 발생하지 않았다.

근데 리눅스를 재부팅하고 설정 값이 다시 디폴트 값으로 돌아간건지.. 암튼 다시 10분으로 변경이 된 적이 있었는데, 그 뒤로 저 에러가 다시 발생했었다. 그리고 지금은 이 시간을 7일로 늘려놓고 서비스 중이다. 지금까지 약 3개월 정도 돌아가고 있는데, 아직까지 저 에러가 다시 발생한 적은 없다.

사실 원인을 제대로 파악하고 깔끔하게 해결한게 아니라서 약간 찝찝한 느낌은 들지만.. 구글링 해봐도 딱히 깔끔한 해결 방법은 없는 것 같더라. 일단은 뭐 중단 없이 서비스 하는게 중요하니깐~

참고로 php admin에서 변경한 속성 값은 아래 두 가지고, 모두 604,800으로 값을 셋팅했다.

  • interactive timeout
  • wait timeout

 

Comments