본문 바로가기
Javascript/Node.js

Error (amqplib) : Channel closed by server: 406 (PRECONDITION-FAILED)

by v8rus 2022. 4. 12.
|Consul| Unregister service!
 
Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be configured, see consumers doc guide to learn more"
    at Channel.C.accept (C:\Users\Smart\Project\MSAexpress\node_modules\amqplib\lib\channel.js:422:17)
    at Connection.mainAccept [as accept] (C:\Users\Smart\Project\MSAexpress\node_modules\amqplib\lib\connection.js:64:33)
    at Socket.go    (C:\Users\Smart\Project\MSAexpress\node_modules\amqplib\lib\connection.js:478:48)
    at Socket.emit (events.js:315:20)
    at emitReadable_ (_stream_readable.js:555:12)
    at processTicksAndRejections (internal/process/task_queues.js:83:21) {
  code: 406,
  classId: 0,
  methodId: 0
} [ 'pay-service' ]
 
|Consul| Unregister service! 1 [ 'pay-service' ]
 
[nodemon] app crashed - waiting for file changes before starting...
 
 
현재 다수의 Node 서버와 Consul 서비스를 이용해 MSA를 구현하고 있다.
amqplib 패키지를 사용하여 mq 서비스를 구현하였으며 서버간 통신에 이용된다.
 
정상적으로 서버간 요청이 완료되었고 처리가지 완료된 상태에서 1800초, 약 30분이 지나면 이 오류가 뜨는것같다.
테스트 해본 결과, 오류는 다시 발생하지 않았다.
 
이번 오류는 완벽하게 처리되지 않은 결과에 의해 발생하게 된다고 한다.
아래 두 사이트를 참고하면 되겠다.
 

RabbitMQ: Unknown delivery tag 1 · Issue #50 · senecajs/seneca-amqp-transport

Hello, I just came across this error, the reason why I'm opening an issue is because it seems to have some sort of relation to the AMQP transport plugin, even though I'm not sure why it hap...

github.com

RabbitMQ amqplib - "Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - unknown delivery tag 1" (grzegorowski.com)

 

RabbitMQ amqplib - "Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - unknown deliv

docker Secure Docker Grafana container with SSL through Traefik proxy You are wondering how to auto-generate free and auto-renewable SSL certificate for you Grafana container? This was also my concern some time…

www.grzegorowski.com

 

나는 Replier, 요청을 수신하여 반환하고 처리하는 부분에서 설정을 잘못하여 발생하였다.

channel.consum(queue, msg => {...}) 함수 내부에 option으로 noAck: false 로 설정해놓았다. 이 설정은 처리도중 발생한 결과값을 정상적으로 요청한 서버에 반환하였는지 체크한다.

하지만 나는 msg 를 처리하는 코드에서 channel.ack(msg); 를 작성하지않아서 이런 오류가 발생했다.

처리 과정 마지막에 channel.ack(msg)를 작성하면 된다.

 

noAck 옵션 설정을 끝까지 잘보자...

댓글