RabbitMQ
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了RabbitMQ,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6967字,纯文字阅读大概需要10分钟。
内容图文
![RabbitMQ](/upload/InfoBanner/zyjiaocheng/1024/0282bfe827154cef87114d1fe76a8a87.jpg)
一、简介
RabbitMQ 是使用Eelang语言开发的开源消息队列系统,基于AMQP协议来实现,AMQP主要的特征是面向对象、队列、路由(包括点对点和发布订阅、可靠性、安全、)。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求比较高的场景,对性能和吞吐量的要求其次。
AMQP协议 是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受客户端中间件的不同产品,不同的开发语言等条件限制,Erlang中的实现有RabbitMQ等。
二、RabbitMQ 的五种模型
(1)直连模型(hello world)
生产者将消息发送到消息队列中,消费者一直等待消息队列中的消息。一个生产者对应一个消费者,比较容易造成消息的堆积。
package com.ldc.demo.SpringBoot_RabbitMQ;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
//默认创建的队列是:持久化的、非独占的、非自动删除
@RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "false",autoDelete = "false")) //没有队列创建队列
public class Hello_consumer { //第一种模型:直连 (消费者)
@RabbitHandler //当从消息队列中取出消息的是回调方法是这个方法(进行方法的处理)
public void get(String message){
System.out.println(message);
}
}
(2)任务队列模型(work queue)
多个消费者会绑定同一个消息队列,共同消费队列中的消息。默认在分配消息的时候是平均分配的,可以通过配置实现能者多劳。
package com.ldc.demo.SpringBoot_RabbitMQ;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class work_consumer { //第二种模型:工作队列 (消费者)
@RabbitListener(queuesToDeclare = @Queue("work")) //第一个消费者
public void receive1(String message){
System.out.println(message);
}
@RabbitListener(queuesToDeclare = @Queue("work")) //第二个消费者
public void receive2(String message){
System.out.println(message);
}
}
(3)广播模型(Publish/Subscribe)
可以有多个消费者,每个消费者都有自己的队列,每个队列都到绑定到交换机,生产者只能发送消息到交换机,发送给那个队列其无法决定,交换机把消息发送给绑定过的所有队列,队列的消费者都能拿到消息,实现一条消息被多个消费者消费。
package com.ldc.demo.SpringBoot_RabbitMQ;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class fanout_consumer { //第三种模型:广播 (fanout)绑定同一个交换机的都会收到消息
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue, //不声明名称的话代表生成一个临时队列
exchange = @Exchange(value = "logs",type = "fanout") //绑定交换机
)
})
public void receive1(String message){ //消费者1
System.out.println(message);
}
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue, //不声明名称的话代表生成一个临时队列
exchange = @Exchange(value = "logs",type = "fanout") //绑定交换机
)
})
public void receive2(String message){ //消费者2
System.out.println(message);
}
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue, //不声明名称的话代表生成一个临时队列
exchange = @Exchange(value = "logs",type = "fanout") //绑定交换机
)
})
public void receive3(String message){ //消费者3
System.out.println(message);
}
}
(4)路由模型(Routing)
消息被不同的队列消费,需要用到Direct类型的队列,生产者向交换机发送消息时会指定一个routing key ,然后交换机把消息传递给与routing key完全匹配的队列。
package com.ldc.demo.SpringBoot_RabbitMQ;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class route_consumer { //第四种模型:路由 交换机类型为:direct
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue, //临时队列
exchange = @Exchange(value = "route_exchage",type = "direct"), //指定交换机名称和类型
key = {"error"} //指定路由key ,可以以数组的形式匹配多个路由key
)
})
public void receive1(String message){ //第一个消费者
System.out.println(message);
}
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue, //临时队列
exchange = @Exchange(value = "route_exchage",type = "direct"), //指定交换机名称和类型
key = {"info"} //指定路由key ,可以以数组的形式匹配多个路由key
)
})
public void receive2(String message){ //第二个消费者
System.out.println(message);
}
}
(5)动态路由(Topics)
topic类型的交换机与direct相比,都是可以更具routing key把消息路由到不同的队列,只不过topic类型的交换机可以让队列绑定routing key的时候使用通配符。这种模型routing key 都是由一个或多个单词组成,多个单词之间以“ . ”分割,例如:item.insert
通配符:
(1) * :匹配一个词
(2) # :匹配一个或多个词
package com.ldc.demo.SpringBoot_RabbitMQ;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;
@Component
public class topic_consumer { //第五种模型:动态路由 交换机类型:topic
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue, //临时队列
exchange = @Exchange(value = "topic_exchange",type = "topic"),
key = {"*.error"}
)
})
public void receive1(String message){ //第一个消费者
System.out.println(message);
}
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue, //临时队列
exchange = @Exchange(value = "topic_exchange",type = "topic"),
key = {"*.error"}
)
})
public void receive2(String message){ //第二个消费者
System.out.println(message);
}
}
三、集群环境
(1)普通集群
RabbitMQ代理操作所需要得所有数据/状态都将跨所有节点复制,这方面得一个例外是消息队列,默认情况下,消息队列位于一个节点上,尽管他们可以从所有节点上看到和访问。
解决问题:防止再主节点宕机时消息丢失得情况,从节点没有办法变成主节点,只是将主节点的信息复制到从节点上,主节点回复之后再从从节点复制过来,复制的只是交换机中的内容,并不能复制消息队列。
(2)镜像集群
镜像队列机制就是将队列在三个节点之间设置主从关系,消息会在三个节点之间自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的的情况,提升MQ集群的整体高可用性。
四、应用场景
(1)异步处理
业务场景:用户注册后需要发送注册邮件和注册短信
消息队列:把发送邮件,短信这些不必要的业务逻辑进行异步处理,因当写入数据库种就立即返回客户端
(2)应用解耦
业务场景:双11,用户下单后,订单系统需要通知库存系统,传统方法是订单系统调用库存系统的接口,订单系统和库存系统存在高耦合,库存系统出现问题订单就会失败。
消息队列:用户下订单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。库存系统订阅下单得消息,获取下单得信息,进行库操作。就算库存系统出现故障,消息队列也能保证消息得可靠投递,不会导致消息丢失.
(3)流量削峰
业务场景:秒杀活动,流量过大会导致应用挂掉
消息队列:服务器收到用户请求后,先写入消息队列中,超过队列最大长度得直接抛弃用户请求,秒杀业务再根据队列中得请求进行处理
内容总结
以上是互联网集市为您收集整理的RabbitMQ全部内容,希望文章能够帮你解决RabbitMQ所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。