activemq入门,rabbitmq官方教程中文
另一方面,消息队列消息队列可以视为存储消息的容器。 如果需要使用消息,直接从容器中检索消息并自己使用即可。 中间件
二、为什么消息队列通过异步处理提高系统性能(减少响应所需时间)。
削峰/限流
降低系统耦合性。
三、为什么使用消息队列带来的一些问题系统可用性降低:系统的可用性在一定程度上下降了? 在加入MQ之前,不需要考虑信息丢失或MQ中断,但在引入MQ之后需要考虑。
加入33558www.Sina.com/MQ后,必须保证消息没有重复消耗、消息丢失时的处理、消息传递的顺序等问题。
系统复杂性提高:消息队列表示可以实现异步,但消息队列异步确实可以提高系统的响应速度。 但是万一信息真正的消费者没有正确消费信息怎么办? 这样会引起数据不一致!
四个jmsvsamqp 4.1 JMS JMS (javamessageservice,java消息服务)是java消息服务,允许JMS客户端通过JMS服务进行异步消息传输。
一致性问题:
4.2 AMQP AMQP,即高级消息排队协议,是提供统一消息服务的APP应用层标准的ActiveMQ 就是基于 JMS 规范实现的。(二进制APP协议,是APP方案)
4.3 JMS vs AMQP比较方向定义jmsamqpJavaAPI协议跨语言no跨平台no支持消息类型Peer-2-Peer; Pub/sub为:直接交换; fanout exchange; 主题变更; headers exchange; 系统交换。 本质上,后四种类型与JMS的pub/sub模型差别不大,而只在路由机制中进行更详细分类的消息类型支持多种消息类型。 上面介绍了byte[] (二进制)五、RabbitMQ核心概念
1.2.2交换(交换机) ) ) ) ) ) ) ) ) ) ) )。
在RabbitMQ中,消息并不直接传递到高级消息队列协议,中途必须经过Queue(消息队列)这一层,Exchange(交换器)是
3358www.Sina.com/用于接收生产者发送的消息并将其路由到服务器中的队列。 如果无法路由,它可能会返回到Exchange(交换器)或直接销毁。
http://www.Sina.com/: http://www.Sina.com/,http://www.Sina.com/,http://www.Sina.com /,http://www.Sina.com
生产者向交换机发送消息时,通常指定Queue(消息队列)来指定此消息的路由规则,但指定3358www.Sina.com/。
生产者向交换机发送消息时,需要路由密钥,如果绑定密钥和路由密钥匹配,则消息将路由到相应的队列。
1.2.3消息队列。
用于保存消息直到发送到Exchange(交换器)消费者。 它既是信息的容器,也是信息的终点。 消息可以放入一个或多个队列中。 消息一直在队列中,等待消费者连接到此队列并将其删除。
在Producer(生产者)这种情况下,队列中的消息不是所有消费者都接收并处理所有消息,而是平均分配(轮询)给多个消费者来处理
1.2.4消息中间件服务节点(broker )。
对RabbitMQ来说,RabbitMQ中介器可以仅仅被视为RabbitMQ服务节点或RabbitMQ服务实例。 在许多情况下,也可以将RabbitMQ中介程序视为RabbitMQ服务器。
1.2.5 Exchange Ty
pes(交换器类型)① fanout
fanout 类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中,不需要做任何判断操作,所以 fanout 类型是所有的交换机类型里面速度最快的。fanout 类型常用来广播消息。
② direct
direct 类型的Exchange路由规则也很简单,它会把消息路由到那些 Bindingkey 与 RoutingKey 完全匹配的 Queue 中。
③ topic
前面讲到direct类型的交换器路由规则是完全匹配 BindingKey 和 RoutingKey ,但是这种严格的匹配方式在很多情况下不能满足实际业务的需求。topic类型的交换器在匹配规则上进行了扩展,它与 direct 类型的交换器相似,也是将消息路由到 BindingKey 和 RoutingKey 相匹配的队列中,但这里的匹配规则有些不同,它约定:
RoutingKey 为一个点号“.”分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”;
BindingKey 和 RoutingKey 一样也是点号“.”分隔的字符串;
BindingKey 中可以存在两种特殊字符串“”和“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。
④ headers(不推荐)
headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配
六、实操 1.创建交换器 2.docker部署遇到的问题问题一:访问交换机时报错
Management API returned status code 500
问题二:访问channel时报错
Stats in management UI are disabled on this node
解决方法:
问题三、连接RabbitMQ异常: com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth
原因:权限不够。
解决方法:rabbitmqctl set_permissions -p "/" username "." "." ".*"
3.springboot整合rabbitmq
1.创建springboot项目,添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>2.配置文件
spring: rabbitmq: host: 192.168.36.131 username: root password: root 3.编写测试类 @SpringBootTestclass RabbitmqDemoApplicationTests { @Autowired private RabbitTemplate rabbitTemplate; @Test public void send(){ //使用的点对点发送:direct路由 ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>(); map.put("fd","hshahh"); map.put("duo",new String()); map.put("数组", Arrays.asList("fd",3)); //convertAndSend直接把对象序列化发送 rabbitTemplate.convertAndSend("exchanges.direct","jd",map); } @Test public void receive(){ //序列化接收 Object jd = rabbitTemplate.receiveAndConvert("jd"); System.out.println(jd.getClass()); System.out.println(jd); } @Test public void fanoutSend(){ rabbitTemplate.convertAndSend("exchanges.fanout","",new Book("fesf",33)); }} 4.编写序列化json的转换器 @Configurationpublic class MyConverter { @Bean public MessageConverter converter(){ return new 饱满的大船2JsonMessageConverter(); }}//按Ctrl+Alt+B 显示子类 5.启动rabbitmq 6.消息监听 @Servicepublic class BookService { //监听队列 @RabbitListener(queues="jd.emps") public void receive(Book book){ System.out.println("收到: "+book); } @RabbitListener(queues="jd") public void receive2(Message message){ System.out.println(message.getBody()); System.out.println(message.getMessageProperties()); }}//开启rabbit的注解配置@EnableRabbit@SpringBootApplicationpublic class RabbitmqDemoApplication { public static void main(String[] args) { SpringApplication.run(RabbitmqDemoApplication.class, args); }} 7.自动配置1.rabbitAutoConfiguration
2.有自动配置了连接工厂ConnectionFactory
3.RabbitProperties,封装了RabbitMQ配置
4.RabbitTemplate:给RabbitMQ发送和接收消息
5.AmqpAdmin系统管理功能组件
8.使用AmqpAdmin创建交换器和队列 @Testpublic void create(){ //创建交换器 //amqpAdmin.declareExchange(new DirectExchange("ampqadmin.exchange")); //创建队列 //amqpAdmin.declareQueue(new Queue("ampqadmin",true)); //绑定 amqpAdmin.declareBinding(new Binding("ampqadmin", Binding.DestinationType.QUEUE,"ampqadmin.exchange","amqpadmin.#",null)); //删除 amqpAdmin.deleteExchange(""); amqpAdmin.deleteQueue("");}