Quando um cliente do ApsaraMQ for RabbitMQ chama um método AMQP 0-9-1, o broker retorna um código de resposta e texto de resposta para indicar sucesso ou falha. Use as tabelas a seguir para identificar a causa raiz de um erro e aplicar a solução recomendada.
Como interpretar uma resposta de erro
Cada resposta de erro contém os seguintes campos:
|
Campo |
Descrição |
Exemplo |
|
|
O código numérico de erro. |
|
|
|
O identificador de erro. |
|
|
|
Um ID de solicitação único para rastreamento. |
|
|
|
Metadados de resolução de problemas, incluindo nomes de recursos relacionados e um link para esta referência. |
|
|
|
O ID de classe AMQP. Combina com o RabbitMQ de código aberto. |
|
|
|
O ID de método AMQP. Combina com o RabbitMQ de código aberto. |
|
Quando uma chamada de basicPublish falha, ErrorHelp retorna apenas o msgId para reduzir a sobrecarga de desempenho. A estrutura de chave-valor não é incluída. Use o msgId para rastrear a publicação com falha.
Exemplo de rastreamento de pilha
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>
(reply-code=404, reply-text=ExchangeNotExist, ReqId:5FB4C999314635F952FCBFF6, ErrorHelp[dstQueue=XXX_test_queue,
srcExchange=Producer.ExchangeName,routingKey=XXX_test_bk, http://mrw.so/6rNqO8], class-id=50, method-id=20)
at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:516)
at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346)
at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:672)
at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:599)
at java.lang.Thread.run(Thread.java:748)
Severidade dos erros
Os erros do ApsaraMQ for RabbitMQ se dividem em duas categorias:
Erros de nível de canal (leves) fecham apenas o canal afetado. A conexão permanece aberta, e você pode abrir um novo canal para tentar novamente. A maioria dos erros nas tabelas abaixo são de nível de canal.
Erros de nível de conexão (graves) fecham toda a conexão. Todos os canais nessa conexão são perdidos. Erros como
320 ProtocolVersionMismatche541 InternalErrorsão de nível de conexão.
Erros de protocolo e autenticação
| Código de resposta | Texto de resposta | Descrição | Solução |
|---|---|---|---|
| 320 | ProtocolVersionMismatch | O cliente usa uma versão de protocolo não suportada. Apenas o protocolo AMQP 0-9-1 é suportado. | Use o protocolo AMQP 0-9-1. |
| 403 | AccessDeniedByRamPolicy | O usuário RAM não tem as permissões necessárias. | Conceda as permissões necessárias ao usuário RAM. Para detalhes, consulte RAM access policies. |
| 530 | AccessAccountDataError | A autenticação falhou com o nome de usuário e senha fornecidos. | Certifique-se de que:
|
Erros de recurso não encontrado
Esses erros ocorrem quando uma operação de basicPublish, BasicConsume, bind ou declare faz referência a um recurso que não existe.
| Código de resposta | Texto de resposta | Descrição | Solução |
|---|---|---|---|
| 200 | no route has mandatory | O método basicPublish foi chamado com mandatory definido como true, mas a exchange não encontrou nenhuma fila correspondente para a chave de roteamento. O broker devolveu a mensagem ao produtor através de basic.return. |
Verifique as ligações da exchange. Certifique-se de que uma fila está ligada a uma chave de roteamento que corresponda à mensagem publicada. |
| 404 | ExchangeNotExist | A exchange especificada não existe. |
|
| 404 | QueueNotExist | A fila especificada não existe. |
|
Erros de declaração e validação
Esses erros ocorrem quando você declara ou liga exchanges e filas, geralmente devido a nomes inválidos ou incompatibilidade de propriedades.
|
Código de resposta |
Texto de resposta |
Descrição |
Solução |
|
405 |
QueueExclusive |
A fila é exclusiva para a conexão que a criou. |
Acesse a fila apenas a partir da conexão que a declarou. Outras conexões não podem consumir ou declarar uma fila exclusiva. |
|
406 |
ExchangeNameEmpty |
Nenhum nome de exchange foi fornecido. |
Especifique um nome de exchange não vazio. Para requisitos de nomenclatura, consulte Limits. |
|
406 |
ExchangeInBuilt |
Exchanges com nomes começando com |
Escolha um nome de exchange diferente que não comece com |
|
406 |
QueueNameInvalid |
O nome da fila contém caracteres inválidos ou excede os limites de comprimento. |
Corrija o nome da fila. Para requisitos de nomenclatura, consulte Limits. |
|
406 |
QueueConsumerNameInvalid |
O nome do consumidor contém caracteres inválidos ou excede os limites de comprimento. |
Corrija o nome do consumidor. Para requisitos de nomenclatura, consulte Limits. |
|
406 |
BindingNameInvalid |
A chave de roteamento contém caracteres inválidos ou excede os limites de comprimento. |
Corrija a chave de roteamento. Para requisitos de nomenclatura, consulte Limits. |
|
406 |
QueueHasDiffField |
As propriedades na declaração da fila não correspondem à fila existente no servidor. |
Atualize os parâmetros de declaração para corresponder às propriedades da fila existente. Para detalhes, consulte QueueHasDiffField. |
|
530 |
ExchangeHasDiffFields |
As propriedades na declaração da exchange não correspondem à exchange existente no servidor. |
Atualize os parâmetros de declaração para corresponder às propriedades da exchange existente. Para detalhes, consulte ExchangeHasDiffFields. |
Erros de mensagem
|
Código de resposta |
Texto de resposta |
Descrição |
Solução |
|
311 |
MessageBodyLengthExceeded |
O corpo da mensagem excede o tamanho máximo permitido. |
Reduza o tamanho da mensagem. Para limites de tamanho, consulte Limits. |
|
406 |
MessageBodyEmpty |
O corpo da mensagem está vazio. |
Inclua conteúdo no corpo da mensagem. |
Erros de exchange de mensagens atrasadas
|
Código de resposta |
Texto de resposta |
Descrição |
Solução |
|
503 |
ExchangeTypeNotSupport[x-delayed-message] |
A exchange |
Defina o tipo de exchange como |
Erros de canal e conexão
| Código de resposta | Texto de resposta | Descrição | Solução |
|---|---|---|---|
| 504 | ChannelNotFind | O canal foi liberado enquanto uma mensagem estava em trânsito. Isso geralmente acontece quando várias threads compartilham uma conexão e frequentemente abrem e fecham conexões. | Se você estiver usando o Spring Boot com a fábrica de conexões no modo CONNECTION, aumente spring.rabbitmq.cache.connection.size para reduzir a taxa de rotatividade de conexões. |
| 530 | ChannelNumExceeded | O número de canais em uma única conexão excede o limite. | Feche canais de produtor ou consumidor não utilizados. |
| 530 | ConnectionNumExceeded | O número de conexões em uma única instância excede o limite. |
|
| 530 | QueueConsumerAlreadyExist | Um consumidor com a mesma tag de consumidor já existe na fila. | Especifique um valor único para ConsumerTag quando chamar BasicConsume no mesmo canal. |
Erros de cota de recursos
Esses erros ocorrem quando uma instância, vhost ou recurso atinge sua cota. Para aumentar cotas, upgrade the instance configuration. Para limites padrão, consulte Limits.
| Código de resposta | Texto de resposta | Descrição | Solução |
|---|---|---|---|
| 530 | denied for too many requests | O pico de TPS para envio ou recebimento de mensagens excede o limite da instância. A solicitação é limitada. |
|
| 530 | VhostNumExceeded | O número de vhosts na instância excede o limite. |
|
| 530 | ExchangeNumExceeded | O número de exchanges em um único vhost excede o limite. |
|
| 530 | QueueNumExceeded | O número de filas na instância excede o limite. |
|
| 530 | VHostTotalBindingNumExceeded | O número de ligações em um único vhost excede o limite. |
|
| 530 | ExchangeBindingNumExceeded | O número de filas vinculadas a uma única exchange excede o limite. | Remova ligações de filas não utilizadas da exchange. |
| 530 | QueueConsumerNumExceeded | O número de consumidores em uma única fila excede o limite. |
|
Erros internos
| Código de resposta | Texto de resposta | Descrição | Solução |
|---|---|---|---|
| 541 | InternalError | Ocorreu um erro interno do servidor. | Verifique o reply-text para obter detalhes e abra um tíquete para entrar em contato com o suporte técnico do ApsaraMQ for RabbitMQ. |