Visão geral
Conceitos básicos
Corretor
Entidade do servidor de fila de mensagens usada para processar dados
vhost
O host de mensagem virtual criado pelo servidor RabbitMQ possui seu próprio mecanismo de permissão. Vários VHOSTs podem ser abertos em um corretor para isolamento de permissão para diferentes usuários, e os VHOSTs também são completamente isolados.
Productor
Gerar dados para comunicação de mensagens
canal
Canal de mensagem, vários canais podem ser estabelecidos no AMQP, cada canal representa uma tarefa de sessão.
intercâmbio
direto
Mensagens encaminhadas para a fila especificada pela chave de roteamento
fanout
fanout
O encaminhamento de mensagens para todas as filas vinculadas é semelhante a uma maneira de transmitir.
tópico
tópico
Mensagens encaminhadas de acordo com as regras. Essa regra é principalmente a correspondência de padrões e também parece mais flexível.
fila
fila
vinculativo
Representa a relação entre o interruptor e a fila. Ao vincular, ele vem com uma chave de ligação de parâmetro adicional para corresponder à chave de roteamento.
Consumidor
Ouça a fila de mensagens para ler os dados da mensagem
Três modos de troca (FANOUT, DIRECT, Tópico) Implementação em Springboot
Referência Spring-Boot-Starter-AMQP em pom.xml
<Depencency> <PuerpId> org.springframework.boot </frugiD> <ArtifactId> Spring-boot-starter-amqp </artifactId> </dependency>
Adicione a configuração do RabbitMQ
Primavera: RabbitMQ: Host: Localhost Porta: 5672 Nome de usuário: Guest Senha: Guest
direto
No modo direto, apenas a fila é necessária para defini -la em geral. Use o interruptor interno (defaultExchange) sem ligar o comutador.
@ConfigurationPublic Classe rabbitp2pconfigure {public static final string fileue_name = "p2p-beue"; @Bean Public Queue Queue () {retorna nova fila (fila_name, true); }} @Runwith (springrunner.class) @springboottest (classes = bootCorEteStApplication.class)@slf4jpublic classe rabbittest {@aUTowired private amqptemplate amqptemplate; / *** send*/ @test public void sendLazy () lança interruptedException {City City = New City (2345566666l, "Direct_Name", "Direct_Code"); amqptemplate.convertandsend (rabbitlazyconfigure.queue_name, cidade); } / *** Receber* / @test public void Recender () lança interruptedException {object obj = amqptemplate.receiveandAndConvert (rabbitlazyConfigure.queue_name); Assert.NotNull (OBJ, ""); log.debug (obj.toString ()); }}Cenários aplicáveis: ponto a ponto
fanout
O modo de fanout requer vincular várias filas ao mesmo interruptor
@ConfigurationPublic Classe rabbitfanoutConfigure {public static final String Exchange_name = "Fanout-Exchange"; public static final string fanout_a = "fanout.a"; public static final string fanout_b = "fanout.b"; public static final string fanout_c = "fanout.c"; @Bean public fila amessage () {return nova fila (fanout_a); } @Bean public fila bMessage () {return new fila (fanout_b); } @Bean public fila cmessage () {return New fila (fanout_c); } @Bean public fanoutExchange fanoutExchange () {return new FanOutExchange (Exchange_name); } @Bean Public Binding bindingExchangea (fila amessage, fanoutExchange fanoutExchange) {return bindingbuilder.bind (amessage) .to (fanoutExchange); } @Bean Public Binding bindingExchangeB (fila bMessage, fanoutExchange fanoutExchange) {return bindingbuilder.bind (bMessage) .to (fanoutExchange); } @Bean Public Binding BindingExchanGec (fila cmessage, fanoutExchange fanoutExchange) {return bindingbuilder.bind (cmessage) .to (fanoutExchange); }}Remetente
@Slf4jpublic classe remetente {@aUTowired Private AMQPTEMPLAT RABBITTEMPLATE; public void sendfanout (mensagem de objeto) {log.debug ("Inicie a mensagem de envio de fanout <" + message + ">"); rabbittemplate.convertandsend (rabbitfanoutConfigure.exchange_name, "", mensagem); }}Podemos usar @rabbitListener para ouvir várias filas para consumir
@Slf4j @rabbitListener (filas = {rabbitfanoutConfigure.fanout_a, rabbitfanoutconfigure.fanout_b, rabbitfanoutConfigure.fanout_c}) public }} Cenários aplicáveis
-Os jogos online de vários usuários em larga escala (MMO) podem usá-lo para lidar com eventos globais, como atualizações de classificação
- Os sites de notícias esportivas podem usá -lo para distribuir atualizações de pontuação para clientes móveis quase em tempo real
- O sistema de distribuição o usa para transmitir vários estados e atualizações de configuração
- Durante o bate -papo em grupo, ele é usado para distribuir mensagens para os usuários que participam do bate -papo em grupo.
tópico
Esse padrão é relativamente complexo. Simplificando, cada fila tem seu próprio tópico de preocupação. Todas as mensagens têm um "título". O Exchange encaminhará as mensagens para filas cujos tópicos estão preocupados com o RouteKey de Matches Fuzzy.
Ao vincular, forneça um tópico com o qual a fila se preocupa, como "tópico.# ("# "Significa 0 ou várias palavras -chave e"*"significa uma palavra -chave.)
@ConfigurationPublic Classe rabbittopicConfigure {public static final string Exchange_name = "tópico-Exchange"; public static final string tópico = "tópico"; public static final string tópico_a = "tópico.a"; public static final string tópico_b = "tópico.b"; @Bean Public Queue QueuEtopic () {return New Fileue (RabbitticicConfigure.topic); } @Bean Public fila Queuetopica () {return New fila (rabbittopicConfigure.topic_a); } @Bean Public fileeue QueuEtopicb () {retorna nova fila (rabbittopicConfigure.topic_b); } @Bean public topicexchange Exchange () {topicexChange topicexChange = new TopicexChange (Exchange_name); topicexchange.setDelayed (true); retornar novo topicexchange (Exchange_name); } @Bean Public Binding BindingExChangetopic (fila queuetópica, troca topicexchange) {return bindingbuilder.bind (queuetópica) .to (troca) .with (rabbittopicConfigure.topic); } @Bean Public Binding BindingExchangetopics (fila queuetopica, TopicexChange Exchange) {return bindingbuilder.bind (Queuetopica) .to (Exchange) .with ("tópico.#"); }}Ao mesmo tempo, ouça três filas
@Slf4j @rabbitListener (filas = {rabbittopicConfigure.topic, rabbittopicconfigure.topic_a, rabbiticicconfigure.topic_b}) public }}Através do teste, podemos encontrar
@Runwith (springrunner.class) @springboottest (classes = bootCorETEstApplication.class) classe pública rabbittest {@aUTowired Private AmqPtemplate rabitemplate; @Test public void sendall () {rabbittemplate.convertandSend (rabbittopicConfigure.exchange_name, "tópico.test", "send all"); } @Test public void sendtopic () {rabbittemplate.convertandSend (rabbittopicconfigure.exchange_name, rabbittopicconfigure.topic, "Enviar tópico"); } @Test public void sendtopica () {rabbittemplate.convertandSend (rabbittopicconfigure.exchange_name, rabbittopicconfigure.topic_a, "Send topica"); }} Cenários aplicáveis
- Distribua dados sobre locais geográficos específicos, como ponto de venda
- Tarefas nos bastidores concluídos por vários trabalhadores, cada trabalhador responsável por lidar com determinadas tarefas específicas
- Atualizações de preços das ações (e outros tipos de atualizações de dados financeiros)
- Atualizações de notícias envolvendo categorias ou tags (por exemplo, para esportes ou equipes específicas)
- Coordenação de diferentes tipos de serviços na nuvem
- Pacote de software baseado em arquitetura/sistema distribuído, onde cada construtor pode lidar com apenas uma arquitetura ou sistema específico.
Fila de atraso
Consumo tardio:
Repetir atrasado:
Defina a propriedade Switch Atrasy como true
@ConfigurationPublic Classe rabbitlazyConfigure {public static final string fileue_name = "Lazy-quêue-t"; public static final String Exchange_name = "Lazy-Exchange-T"; @Bean Public Queue Queue () {retorna nova fila (fila_name, true); } @Bean public DirectExChange DefaultExchange () {DirectExChange DirectExChange = new DirectExChange (Exchange_Name, True, false); DirectExChange.SetDelayed (true); return DirectExChange; } @Bean public binding binding () {return bindingbuilder.bind (fileue ()). Para (defaultExchange ()). Com (Queue_name); }}Defina o tempo de atraso ao enviar
@Slf4jpublic classe remetente {@aUTowired Private AMQPTEMPLAT RABBITTEMPLATE; public void sendLazy (objeto msg) {log.debug ("BEGN ENVIR MENSAGEM LAZY <" + msg + ">"); rabbittemplate.convertandsend (rabbitlazyconfigure.exchange_name, rabbitlazyconfigure.queue_name, msg, message -> {message.getMessageProperties (). Setheader ("x -delelay", 10000); mensagem de retorno;}); }}Terminar
Verifique os documentos oficiais diretamente para vários casos de uso
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.