李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
RabbitMQ知识总结
Leefs
2020-03-21 PM
1730℃
0条
# RabbitMQ知识总结 ### 一、使用RabbitMQ有什么好处? **1.解耦:**系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦 **2.异步:**将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度 **3.削峰:**并发量大的时候,所有的请求直接存入数据库,造成数据库连接异常 ### 二、RabbitMQ中的broker是指什么?cluster又是指什么? broker是指一个或多个erlang node的逻辑分组,且node上运行着RabbitMQ应用程序。cluster是在broker的基础之上,增加了node之间共享元数据的约束。 ### 三、消息基于什么传输? 由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。 ### 四、消息如何分发? 若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。 ### 五、消息怎么路由? 从概念上来说,消息路由必须有三部分:**交换器、路由、绑定**。 生产者把消息发布到交换器上;绑定决定了消息如何从路由器路由到特定的队列;消息最终到达队列,并被消费者接收。 > 1. 1.消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。 > 2. 2.通过队列路由键,可以把队列绑定到交换器上。 > 3. 3.消息到达交换器后,RabbitMQ会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则)。如果能够匹配到队列,则消息会投递到相应队列中;如果不能匹配到任何队列,消息将进入 “黑洞”。 常用的交换器主要分为一下三种: + 1.direct:如果路由键完全匹配,消息就被投递到相应的队列 + 2.fanout:如果交换器收到消息,将会广播到所有绑定的队列上 + 3.topic:可以使来自不同源头的消息能够到达同一个队列。 使用topic交换器时,可以使用通配符,比如:“*” 匹配特定位置的任意文本, “.” 把路由键分为了几部分,“#” 匹配所有规则等。特别注意:发往topic交换器的消息不能随意的设置选择键(routing_key),必须是由"."隔开的一系列的标识符组成。 ### 六、如何保证数据不丢失 在整个发送消息,消费消息的过程中,可能三个地方存在问题: 1.发送时,消息由于网络问题,半路搞丢。 解决方法: a.同步。采用事务管理,开启事务,在发送消息的时候,如果mq没有接受到消息,则抛出异常,本地捕获异常并重试。 b.异步。写入时可以回调本地接口,确认机制。(建议使用) 2.MQ服务器本身的问题。如果他还没来得及把消息发送消费端就挂了,这个时候消息就丢失了。 解决方法:(持久化操作) a.创建队列时,设置其为持久化。 b.消息的deliveryMode为2。 3.在消费的时候,消息由于网络问题,半路搞丢。 解决方法:消费者在接收到消息先执行业务代码,等结束时,再告诉服务器已经执行完,再执行删除操作。 ### 七、如何避免数据重复消费 在消息中加入一个唯一Id,然后每次在消费之前拿这个唯一id到redis中去查询,如果查询到说明该消息已经被消费过,不再进行消费,如果没有查询到则进行消费,并将该唯一id存入到redis中。
标签:
微服务
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/762.html
上一篇
Redis事务简介
下一篇
Http协议简介【一】
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
6
标签云
ClickHouse
MyBatis
Hadoop
正则表达式
工具
Golang
序列化和反序列化
Netty
Java阻塞队列
Ubuntu
队列
前端
LeetCode刷题
Docker
JavaWeb
Nacos
Java工具类
Spark Streaming
ajax
Spark SQL
CentOS
设计模式
Elastisearch
Scala
Shiro
Typora
Git
并发编程
容器深入研究
查找
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭