前言:
最近买了一本深入了解RabbitMQ的书,我的想法就是学习一个东西,我要把它所有的延伸点都看一看,
但是也会很快遗忘。
前阵子几乎刷了MySQL重要内容都看完了,刷了一遍但是现在忘得很多,不能系统想起来了。
所以东西要多看多做才能记得住。
我最近在想,RabbitMQ有什么好处呢:
解构,众所周知MQ是一个重要的中间件,可以分离系统ABC的代码。比如系统A如果要是直接调用B和C的代码的话,那么之后要是有D进来呢,A还要修改代码。那么让D自己接受这个消息不就好啦~
异步:(汗,最近伊布抓多了,输入法都开始伊布了)那么将消息放到消息队列,非必要的业务用伊布的方式去运行,加快响应速度。
PS:MQ的异步感觉更像是系统之间的调用,那么跟开一个线程的区别呢?个人感觉是因为异步线程的话,只能立刻进行执行。但是MQ的话可以扔到延迟队列等等吧~
削峰:并发量打的时候,所有请求都请求数据库是不行的,放到MQ里面在弄,秒杀系统什么的。
RabbitMQ有什么缺陷呢:
1.系统可用性,万一MQ挂了呢 2. 系统复杂性(要考虑消息的一致性,消息不能重复消费。消息的可靠传输)
1.exchange是什么?
谈到这个概念就会涉及到queue和channel。channel在上一篇已经写完了~
exchange 内部实现为保存 binding 关系的查找表
queue 具有自己的 erlang 进程;
channel 是实际进行路由工作的实体
这边有个概念,什么是路由什么是交换机?
exchange就是交换机,那么什么是路由呢?
在rabbitMQ中的绑定就是路由,就是一个概念。
1 每个消息都有一个称为路由键(routing key)的属性
2 交换机根据 [路由表] 和 [消息的 路由键] , 匹配他们, 将消息 放入一些队列里面
3 消息在队列里面, 等待被消费
exchange的作用就是类似路由器,routing key 就是路由键,服务器会根据路由键将消息从交换器路由到队列上去。
也就是上面123中的过程。
exchange有多个种类:direct,fanout,topic,header(非路由键匹配,功能和direct类似,很少用)。前三种类似集合对应关系那样,(direct)1:1,(fanout)1:N,(topic)N:1
那么直连交换机类似于一比一完全匹配才能消费消息。
fanout:1:N 可以把一个消息并行发布到多个队列上去,当多个队列绑定到fanout的交换器,那么交换器一次性拷贝多个消息分别发送到绑定的队列上,每个队列有这个消息的副本。
fanout业务上实现并行处理多个任务,比如,用户上传图片功能,当消息到达交换器上,它可以同时路由到积分增加队列和其它队列上,达到并行处理的目的,并且易扩展,以后有什么并行任务的时候,直接绑定到fanout交换器不需求改动之前的代码。
(这个还蛮有用的,可以并行处理,一个消息分发到不同的队列上面处理不同的事情。)
topic N:1 ,多个交换器可以路由消息到同一个队列。根据模糊匹配,比如一个队列的routing key 为*.test ,那么凡是到达交换器的消息中的routing key 后缀.test都被路由到这个队列上。(主题队列)
2. 不同exchange的使用场景?
主要针对于三种主要的exchange
2.1 Fanout exchange
如果把exchange比作门卫,那么这种exchange类型可以算是最清闲的门卫,它对任何消息均敞开大门,俗话说 "通吃",见下图。

适应场景:类似于广播,大家伙都能收到
所有发送到Fanout Exchange的消息都会被转发到与该Exchange 绑定(Binding)的所有Queue上。
Fanout Exchange 不需要处理RouteKey 。只需要简单的将队列绑定到exchange 上。这样发送到exchange的消息都会被转发到与该交换机绑定的所有队列上。类似子网广播,每台子网内的主机都获得了一份复制的消息。
Fanout Exchange 转发消息是最快的。
2.2 dircet exchange
Direct类型的exchange需要把每一条来到的消息路由到该消息希望进入的队列。(精准投放哈哈)
需要指定routeKey中的指定的queue
Direct模式,可以使用rabbitMQ自带的Exchange:default Exchange 。所以不需要将Exchange进行任何绑定(binding)操作 。消息传递时,RouteKey必须完全匹配,才会被队列接收,否则该消息会被抛弃。
2.3 topic exchange
所有发送到Topic Exchange的消息被转发到所有关心RouteKey中指定Topic的Queue上,(订阅了这个topic的queue才会收到)
Exchange 将RouteKey 和某Topic 进行模糊匹配。此时队列需要绑定一个Topic。可以使用通配符进行模糊匹配,符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“log.#”能够匹配到“log.info.oa”,但是“log.*” 只会匹配到“log.error”。
所以,Topic Exchange 使用非常灵活。
但是也最为复杂
参考:
https://www.cnblogs.com/zhangxue/p/7699698.html
https://blog.youkuaiyun.com/gaoxueyi551/article/details/89960466
本文深入探讨RabbitMQ的优势与缺陷,讲解其在系统解耦、异步处理、削峰填谷等方面的应用,以及exchange、queue和channel的概念。详细分析了direct、fanout和topic exchange的特性与使用场景。
177

被折叠的 条评论
为什么被折叠?



