Rabbitmq
[Rabbitmq] 에러 분석 - 1 Rabbitmq Publish 실패
개발조하
2023. 10. 20. 20:47
1. 개요
- 본 이슈는 대용량 트래픽, 데이터를 다루기 위한 프로젝트를 진행하면서 생긴 문제입니다.
- https://github.com/palinYEE/many_log_manage_project
2. 에러 발견
랜덤 로그를 생성하는 부분에서 나는 매 초마다 batch_count 의 개수만큼 rabbitmq queue 에 데이터를 넣었다. 물론 하나의 queue 에 넣었다.
그런데 왠걸 batch_count 가 최소 20046 일 때, Rabbitmq publish 가 안된다는 에러가 발생한 것이다.
왜 전송 실패가 뜨는걸까
3. 트러블 슈팅
먼저 에러가 나는 포인트를 확인해보자.
위 함수에서 resultFlag 값이 false 이기 때문에 발생한다. 그럼 this.channel.publish (이는 amqp.Channel.publish 이다)는 어떨 떄 false 를 반환하는가?
- amqp.Channel.publish 메소드가 False 를 반환하는 것은 Queue에 메시지를 publish 하기 전에 Channel 객체에서 내부적으로 메시지 버퍼를 가지고 있다고 한다. 해당 버퍼가 꽉차면 False 를 반환한다고 한다.
그러면 이를 해결하려면 어떻게 해야하는가. amqplib 공식 문서에서는 ‘drain’ 이라는 이벤트를 사용하라고 한다. 그래서 나는 코드를 아래와 같이 수정했다.
위와 같이 수정하니 버퍼가 꽉차도 조금 대기 후에 데이터를 보낼 수 있게 되었다.
4. 이게 정말 끝일까…??
버퍼 용량으로 인한 데이터 drop 은 해소할 수 있었다. 그런데 이를 적용해서 1초에 10만개의 데이터르 queue에 publish 해보았다 근데 아래와 같은 에러가 발생했다.
이 후에 mysql 컨테이너도 죽어버렸다…
이래서 쇼핑몰이나 티케팅 할때 서버가 죽나…싶다 다음에는 위 에러들에 대한 해결방안을 한번 모색해보자