Rabbitmq

[Rabbitmq] 에러 분석 - 1 Rabbitmq Publish 실패

개발조하 2023. 10. 20. 20:47

1. 개요

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 를 반환한다고 한다.

[출처] https://amqp-node.github.io/amqplib/channel_api.html#channel_publish

그러면 이를 해결하려면 어떻게 해야하는가. amqplib 공식 문서에서는 ‘drain’ 이라는 이벤트를 사용하라고 한다. 그래서 나는 코드를 아래와 같이 수정했다.

위와 같이 수정하니 버퍼가 꽉차도 조금 대기 후에 데이터를 보낼 수 있게 되었다.

4. 이게 정말 끝일까…??

버퍼 용량으로 인한 데이터 drop 은 해소할 수 있었다. 그런데 이를 적용해서 1초에 10만개의 데이터르 queue에 publish 해보았다 근데 아래와 같은 에러가 발생했다.

이 후에 mysql 컨테이너도 죽어버렸다…

이래서 쇼핑몰이나 티케팅 할때 서버가 죽나…싶다 다음에는 위 에러들에 대한 해결방안을 한번 모색해보자