Uma conexão é um link físico TCP entre sua aplicação e o ApsaraMQ for RabbitMQ. Um canal é uma conexão virtual leve multiplexada nesse link TCP. Todas as operações do Advanced Message Queuing Protocol (AMQP) — declaração de filas, publicação de mensagens e consumo de mensagens — ocorrem nos canais, não diretamente na conexão.
Conexões
A conexão gerencia tarefas de rede subjacentes, como resolução de endereços IP, handshake TCP, negociação do protocolo AMQP, autenticação e roteamento. Estabelecer uma conexão requer aproximadamente 15 pacotes TCP. Devido a essa sobrecarga, crie conexões consome muitos recursos; portanto, elas devem ser duradouras.
Um grande volume de conexões de curta duração consome recursos significativos de rede e do servidor. Em altas taxas, a criação frequente de conexões pode acionar a proteção contra SYN flood e fazer com que a instância do ApsaraMQ for RabbitMQ pare de responder.

Canais
Um canal é uma conexão virtual estabelecida sobre uma conexão física TCP. Cada conexão pode transportar múltiplos canais. Ao fechar uma conexão, todos os seus canais também são encerrados.
Para conectar muitas aplicações ao ApsaraMQ for RabbitMQ visando o envio e o recebimento de mensagens, estabeleça uma quantidade razoável de conexões e reutilize múltiplos canais em cada uma. Essa abordagem reduz o uso de recursos do sistema em comparação à abertura de uma nova conexão TCP para cada operação.

Notas de uso
Utilize conexões persistentes
Abra as conexões na inicialização da aplicação e mantenha-as durante todo o ciclo de vida dela. Não abra e feche conexões para cada operação de publicação ou consumo.
Se sua carga de trabalho exigir criação frequente de canais, reutilize um conjunto estável de conexões e crie múltiplos canais dentro delas. Para verificar os limites nas taxas de abertura de conexões e canais, consulte Limites.
Separe as conexões de produtores e consumidores
Use pelo menos uma conexão para produzir mensagens e outra distinta para consumir. O ApsaraMQ for RabbitMQ aplica controle de fluxo (back pressure) às conexões que publicam mais rápido do que a instância consegue processar. Se produtores e consumidores compartilharem a mesma conexão, o controle de fluxo no lado da publicação pode atrasar os acknowledgments do consumidor e degradar o throughput de consumo.
Use um canal por thread
Várias threads podem compartilhar uma conexão. No entanto, os canais não são thread-safe na maioria das bibliotecas cliente. Atribua um canal exclusivo a cada thread em vez de compartilhar um canal entre várias threads.
// Anti-pattern: sharing a channel across threads
Channel shared = connection.createChannel(); // Not thread-safe
// Recommended: one channel per thread
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 4; i++) {
executor.submit(() -> {
Channel ch = connection.createChannel();
// Use ch for this thread's publish/consume operations
});
}
Quando vários processos compartilham uma conexão, evite abri-la e fechá-la frequentemente. Caso contrário, pode ocorrer um erro ChannelNotFind.
Evite desbalanceamento no consumo
Quando apenas algumas conexões lidam com um grande volume de mensagens, o consumo pode ficar distribuído de forma desigual entre os consumidores. Para evitar isso:
Aumente o número de conexões por consumidor ou adicione mais consumidores.
Garanta que cada consumidor estabeleça o mesmo número de conexões.
Mantenha pelo menos 30 conexões totais de consumidores como diretriz geral.
Evite criação e fechamento frequentes de canais
Não crie e feche canais frequentemente dentro de uma única conexão. Mantenha a soma do TPS de channelOpen e channelClose abaixo de 1.000. Exceder esse limiar causa carga excessiva no broker.
Referência rápida
|
Diretriz |
Detalhes |
|
Ciclo de vida da conexão |
Persistente. Abra na inicialização e feche no encerramento. |
|
Ciclo de vida do canal |
Abra por thread ou por lote de operações. Feche quando não for mais necessário. |
|
Produtor vs. consumidor |
Use conexões separadas para isolar o controle de fluxo. |
|
Thread safety |
Compartilhe conexões entre threads. Não compartilhe canais. |
|
Conexões mínimas de consumo |
Mais de 30 no total para evitar desbalanceamento no consumo. |
|
Limites de taxa |
Consulte Limites. |