Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 3797|Resposta: 0

Explicação detalhada do protocolo AMQP

[Copiar link]
Publicado em 14/08/2022 23:22:55 | | | |
Introdução ao protocolo AMQP

AMQP (Advanced Message Queuing Protocol) é um protocolo padrão de nível de aplicação que fornece serviços de mensagens unificadas e é um padrão aberto para protocolos de camada de aplicação projetados para middleware orientado a mensagens. AMQP é um protocolo de rede para a passagem de mensagens assíncronas entre processos.

Clientes e middleware de mensagens baseados nesse protocolo podem entregar mensagens sem serem limitados por diferentes produtos/middleware, linguagens de desenvolvimento diferentes, etc.

As principais características do AMQP são orientado a mensagens, enfileirado, roteamento (incluindo peer-to-peer e publicação/assinatura), confiabilidade e segurança. O AMQP reforça o comportamento dos provedores de mensagens e clientes, permitindo verdadeira interoperabilidade entre diferentes fornecedores.

AMQP e JMS

O JMS foi uma tentativa de padronizar middleware de mensagens antigas, era padronizado apenas no nível da API e estava longe de criar interoperabilidade.

Ao contrário do JMS, o AMQP é um protocolo em nível de fio que descreve o formato dos dados transmitidos por uma rede, fluindo em bytes. Como resultado, qualquer ferramenta que siga esse formato de dados, que crie e interprete mensagens, é interoperável com outras ferramentas compatíveis.

Composição do núcleo AMQP



Produtor

Notícias de produção.

ConnectionFactory

A fábrica que fabrica a Conexão.

Conexão

Conexão, conexão de rede de aplicações com Broker TCP/IP/Triple Handshake e Quad Wave.

Conexões AMQP geralmente são conexões longas. AMQP é um protocolo de camada de aplicação que utiliza TCP para fornecer entrega confiável. O AMQP utiliza mecanismos de autenticação e oferece proteção TLS (SSL). Quando um aplicativo não precisa mais se conectar ao proxy AMQP, ele precisa liberar a conexão AMQP de forma gradual, em vez de simplesmente desligar a conexão TCP.

Canal

Canal de rede é uma conexão leve construída sobre a Conexão. Quase todas as operações são realizadas em Canais, que são canais para ler e escrever mensagens, e os clientes podem estabelecer pares para cada canal, cada um representando uma tarefa de sessão.

Se a conexão for comparada a um cabo de fibra óptica, então o canal do canal é comparado a uma das fibras de um cabo de fibra óptica. Qualquer número de canais pode ser criado em uma Conexão.

A maior parte das nossas operações comerciais é feita na interface do Canal, incluindo:


  • queueDeclare
  • O exchangeDeclare para o switch
  • queueBind queueBind
  • Publique a mensagem básicaPublique
  • Notícias para consumidoresbasicbasicConsume, etc.



Corretor

Aceite a conexão do cliente para implementar serviços de entidade AMQP, como rabbitmq.

VirtualHost (hospedagem web)

Hospedagem virtual, usada para isolamento lógico, um host virtual pode ter várias exchanges e filas, e o mesmo host virtual não pode ter exchanges com o mesmo nome.

Para implementar múltiplos ambientes isolados (usuários, grupos de usuários, switches, filas, etc.) em um único proxy, o AMQP fornece o conceito de hosts virtuais (hosts virtuais - vhosts). Isso é muito semelhante ao conceito de hospedagem web para servidores web, que oferece um ambiente completamente isolado para entidades AMQP. Quando a conexão é estabelecida, o cliente AMQP especifica qual host virtual usar.

Troca

O switch aceita mensagens e envia mensagens para a fila vinculada com base na chave de roteamento (sem capacidade de armazenamento de mensagens).

Um switch é uma entidade AMQP usada para enviar mensagens. Depois que o switch recebe uma mensagem, ele a encaminha para uma ou nenhuma fila. O algoritmo de roteamento que ele utiliza é determinado pelo tipo de switch e pelas regras de vinculação.

Tipo de Interruptor:


  • Troca direta
  • Troca de fanout
  • Intercâmbio de temas
  • Troca de cabeçalhos



Propriedades do Comutador:

  • Nome: O nome do interruptor
  • Durabilidade: Uma bandeira de persistência que indica se essa chave está mantendo ou não
  • Exclusão automática: Flag de exclusão, indicandoQuando todas as filas são feitas usando essa troca, será que elas são excluídas
  • Argumentos: Dependentes do próprio agente


Status da Troca:

  • Durável
  • Transitório


Switches persistentes existirão após a reinicialização do corretor, enquanto switches de staging não existirão (elas precisarão ser redeclaradas depois que o corretor estiver online novamente).


Interruptor padrão

A exchange padrão é, na verdade, uma exchange direta que é pré-declarada pelo message broker e não tem nome (o nome é uma string vazia).

Você pode pensar no interruptor padrão como um interruptor especial conectado diretamente.
Nome padrão do switch: Null string (padrão AMQP)
Tipo padrão de chave: Chave de ligação direta

Ao criar uma fila, desde que o switch a ser vinculado não seja especificado, ele será automaticamente vinculado ao switch padrão, e o nome da chave de roteamento do binding será o mesmo do nome da fila.

Conexão direta ao interruptor

Um switch conectado diretamente entrega mensagens para uma fila de chaves correspondentes de vinculação com base na chave de roteamento transportada pela mensagem. O roteamento unicast usado pelo comutador direto para lidar com a mensagem.

Ao criar uma Fila, se ela estiver vinculada a um switch direto, ela não precisa especificar o nome da chave de roteamento, pois ela terá um nome padrão da chave de roteamento, que é o mesmo nome da Fila.

Uma fila de switches conectados diretamente normalmente distribui tarefas para múltiplos consumidores em um loop (chamamos isso de polling).

Fluxo de Trabalho:


  • Ao vincular uma fila a um switch, dê uma chave de vinculação, assumindo R;
  • Quando uma mensagem com uma Chave de Roteamento é enviada para um switch conectado diretamente, o switch a encaminha para uma fila com uma Chave de Roteamento.





Interruptores de ventilador

O switch de ventilação encaminha mensagens para todas as filas vinculadas a ele, independentemente da chave de roteamento vinculada.

Se N filas estiverem vinculadas a um switch de setor, quando uma mensagem é enviada a esse switch de setor, o switch envia uma cópia da mensagem para todas as N filas separadamente. Interruptores de ventilador geralmente são usados para lidar com o roteamento de mensagens por broadcast.




Cenários de Aplicação:

transmitia mensagens;
Função de chat em grupo.

Mudança de tema

O tópico switch envia mensagens para uma ou mais filas de acordo com a chave de roteamento e o tipo de Exchange, e frequentemente o usamos para implementar várias assinaturas de publicação/assinatura, ou seja, publicação.

As regras de roteamento para switches conectados diretamente são estritamente combinadas, o que significa que a Chave de Roteamento deve corresponder à Chave de Vinculação antes de enviar uma mensagem para a Fila.
As regras de roteamento do tópico são partidas difusas que podem ser aplicadas ao satisfazer algumas regras por meio de coringas.

Ela estipula:

  • Podem existir dois caracteres especiais * e # na chave de vinculação para correspondência fuzzy. onde * é usado para corresponder a uma palavra, #用于匹配多个单词 (pode ser zero)
  • Uma chave de roteamento é uma string separada por pontos (chamamos cada string individual separada por uma marca de ponto de palavra)





  • Quando o produtor envia a mensagem Chave de Roteamento=A.A.A, apenas A.*.* é satisfeita, e ela será roteada apenas para a fila1.
  • Quando o produtor envia a mensagem Chave de Roteamento=A.B.A, satisfazendo A.*.* e *.B.* serão roteados para a fila1 e fila2.
  • Quando o produtor envia a mensagem Chave de Roteamento=A.B.C, então A.*.* e *.B.* e *.* são satisfeitos. C é direcionado para a fila 1, fila 2, fila 3.


Cenários de Aplicação:

  • atualizações de notícias envolvendo categorias ou tags;
  • Tarefas em segundo plano realizadas por múltiplos trabalhadores, cada um responsável por lidar com tarefas específicas.



Interruptor de cabeça

Os switches de cabeçalhos não dependem das regras de correspondência da chave de roteamento para vincular chaves para rotear mensagens, mas sim correspondem com base no atributo dos cabeçalhos no conteúdo da mensagem enviada.

Chaves de cabeça podem ser consideradas como outra manifestação de uma chave de ligação direta. No entanto, a chave de roteamento de um switch direto deve ser uma string, e os valores dos atributos do cabeçalho não são limitados por isso; podem até ser inteiros ou valores hash (dicionários), etc. Mais flexibilidade (mas na prática raramente usamos interruptores de cabeça).

Fluxo de Trabalho:


  • Quando uma fila está vinculada a um switch de cabeçalho, múltiplos cabeçalhos são vinculados ao mesmo tempo para correspondência.
  • Mensagens recebidas carregam um cabeçalho e um parâmetro "x-match". Quando "x-match" é definido como "any", qualquer valor do cabeçalho pode ser combinado, e quando "x-match" está definido como "all", todos os valores do cabeçalho devem ser combinados.



Resumo do Switch



Ligação

Conexão virtual entre Exchange e Fila.

BindingKey é uma descrição de regra para vinculações de Exchange e Queue. A chave de vinculação especifica que tipo de Chave de Roteamento será atribuída à Fila atualmente vinculada sob a troca atual.

Chave de Roteamento

Regras de roteamento, que a máquina virtual pode usar para determinar como rotear uma mensagem específica.

Chave de Vinculação vs. Chave de Roteamento


  • A chave de vinculação é a chave de vinculação entre a fila e o switch;
  • A Chave de Roteamento é uma informação enviada pelo produtor ao comutador;
  • Quando a Chave de Vinculação e a Chave de Roteamento corresponderem, coloque a mensagem na fila correspondente.



Chave de Vinculação é a descrição da regra de vinculação de Exchange e Fila, usada para analisar quando a Exchange recebe uma mensagem; a mensagem recebida pelo Exchange terá um campo de Chave de Roteamento, e a Exchange corresponde a essa Chave de Roteamento com todas as Chaves de Vinculação da Troca atual, e se os requisitos forem atendidos, ela será enviada para a Vinculação A chave está vinculada à Fila para enviar a mensagem.

Chave de Vinculação vs. Chave de Roteamento em vários switches


Interruptor padrão: Chave de Vinculação é o nome da Fila, que não pode ser personalizado. A Chave de Roteamento também é o nome da fila antes de poder ser roteada com sucesso para a fila
Troca de conexão direta: Chave de Vinculação é o nome da Fila, que pode ser personalizado. Chaves de Roteamento só podem ser roteadas com sucesso para a fila quando a Chave de Vinculação for a mesma
Interruptor do ventilador: Sem chave de vinculação; Claro, não existe uma Chave de Roteamento. Roteamento automático para todas as filas vinculadas ao switch
Interruptor de tema: Chave de Vinculação personalizada; Personalize a chave de roteamento. Chave de Roteamento==Chave de Vinculação, e a correspondência difusa deve ser roteada com sucesso para a fila
Interruptor de cabeça: sem chave de binding; Claro, não existe uma Chave de Roteamento. Correspondências com base no atributo de cabeçalhos no conteúdo da mensagem enviada


Fila

Armazena mensagens que estão prestes a ser consumidas pelo app.

Propriedades da Fila:

  • Nome: O nome da fila
  • Durável: A fila ainda existe depois que o corretor de mensagens é reiniciado
  • Exclusivo: Usado por apenas uma conexão, e a fila é excluída quando a conexão é fechada
  • Exclusão automática: Excluída quando o último consumidor cancela a inscrição
  • Argumentos: Alguns brokers de mensagens o usam para realizar funções extras semelhantes ao TTL


Criação de fila:
Filas só podem ser usadas após serem declaradas. Se uma fila ainda não existe, declarar uma fila a cria. Se a fila declarada já existir e os atributos forem idênticos, a declaração não tem efeito sobre a fila original. Se os atributos na declaração diferirem daqueles na fila existente, uma exceção em nível de canal com código de erro 406 é lançada.

Persistência na fila:
A fila de persistência é armazenada no disco e permanece lá quando o corretor é reiniciado. Filas que não são persistidas são chamadas de filas transitórias. Nem todos os cenários e casos exigem persistência na fila.

Uma fila persistente não torna as mensagens roteadas para ela persistentes. Se o agente de mensagens desligar e for reiniciado, a fila de persistência será redeclarada durante o reinício e, em qualquer caso, apenas mensagens persistentes podem ser restauradas.

Consumidor

Notícias sobre Consumo do Consumidor. No AMQP, existem duas maneiras para os consumidores receberem mensagens pendentes:

Middleware de mensagens entrega mensagens aos consumidores (API push)
Os consumidores recebem mensagens ativamente (pull API)
Nota: Quando vários consumidores ouvem a mesma fila, as mensagens na fila serão consumidas apenas por um dos consumidores (não uma vez para cada consumidor)

Mensagem

Os dados transmitidos entre mensagens, serviços e aplicações consistem em Propriedades e corpos.

Atributos modificam mensagens, como prioridade de mensagem, atraso e outros recursos avançados, e o corpo principal é o conteúdo do corpo da mensagem.

Propriedades da Mensagem:

  • Tipo de conteúdo
  • Codificação de conteúdo
  • Chave de roteamento
  • Modo de entrega (persistente ou não)
  • Modo de entrega (persistente ou não persistente)
  • Prioridade de mensagem
  • Carimbo de data de publicação de mensagens
  • Período de validade
  • ID da aplicação do editor


Corpo da mensagem:
Além dos atributos, as mensagens AMQP também contêm uma carga útil (os dados que a mensagem realmente transporta), que é tratada pelo proxy AMQP como um array opaco de bytes.

O corretor de mensagens não inspeciona nem modifica a carga útil. Mensagens podem conter apenas atributos sem carregar uma carga útil. Normalmente, utiliza dados em formato serializado como JSON e, para economizar dinheiro, buffers de protocolo e MessagePacks serializam os dados estruturados para publicação como uma carga útil de mensagens. O AMQP e seus pares normalmente usam os campos "tipo de conteúdo" e "codificação de conteúdo" para se comunicar com mensagens e identificar cargas úteis, mas isso é baseado apenas em convenções.

Persistência da mensagem:
As mensagens são publicadas de forma persistente, e o agente AMQP armazena essa mensagem no disco. Se o servidor for reiniciado, o sistema confirma que a mensagem de persistência recebida não foi perdida.

Simplesmente enviar uma mensagem para um switch persistente ou roteá-la para uma fila persistente não torna a mensagem persistente: a persistência da mensagem depende inteiramente do modo de persistência da própria mensagem.

Publicar mensagens de forma persistente pode impactar o desempenho.

Processo de trabalho do AMQP

O Editor publica uma mensagem através da Exchange.

O switch distribui as mensagens recebidas para a fila vinculada ao switch de acordo com as regras de roteamento.

Por fim, o agente da AMQP entregará a mensagem ao consumidor que assinou essa fila, ou o consumidor a receberá por conta própria conforme necessário.

Mecanismo de mensagens AMQP

Confirmação da mensagem

Os consumidores ocasionalmente falham em processar mensagens ou às vezes travam diretamente. E motivos de rede também podem causar vários problemas.
Isso nos coloca na questão de quando é o momento correto para os agentes da AMQP deletar mensagens.

Os dois modos de confirmação de mensagens do AMQP:

Modo de Confirmação Automática: Exclua a mensagem assim que ela for enviada ao consumidor pelo middleware da mensagem. (Usando o método AMQP: basic.deliver ou basic.get-ok)
Modo de confirmação explícito: Espere que o consumidor envie um confirmante antes de excluir a mensagem. (Usando o método AMQP: basic.ack)
Se um consumidor desligar sem enviar o recibo de confirmação, o agente da AMQP reentrega a mensagem para outro consumidor. Se não houver consumidores disponíveis nesse momento, o corretor de mensagens espera o próximo consumidor se registrar nessa fila e então tenta entregar novamente.

Mensagens de rejeição

Quando um consumidor recebe uma mensagem, o processo de processamento pode ter sucesso ou falhar. O consumidor pode indicar ao corretor de mensagens (middleware de mensagens) que a mensagem não foi processada (ou não foi concluída neste ponto) devido a uma "mensagem rejeitada".
Quando uma mensagem é rejeitada, o consumidor pode dizer ao corretor de mensagens o que fazer com a mensagem – destruí-la ou colocá-la de volta na fila.

Quando houver apenas um consumidor nessa fila, certifique-se de não rejeitar a mensagem e escolher colocá-la de volta na fila, fazendo com que a mensagem fique repetida indefinidamente no mesmo consumidor.

No AMQP, o método básico.reject é usado para realizar a operação de rejeição de mensagens. No entanto, o basic.reject tem uma limitação: você não pode usá-lo para rejeitar múltiplas mensagens com confirmações. Mas se você estiver usando o RabbitMQ, pode usar a extensão AMQP 0-9-1 chamada de confirmações negativas (também chamadas de nacks) para resolver esse problema.


Original:O login do hiperlink está visível.





Anterior:Os arrays JS são a diferença e o uso de todos e alguns
Próximo:Explicação detalhada da arquitetura de mensagens AMQP do RabbitMQ
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com