2020/04/06 03-发布订阅模式和路由模式编程

在这里插入图片描述
在这里插入图片描述
队列和工作队列模式本质上就是路由模式,只不过是简单的使用路由的方式,用的是默认的交换机,可以不定义使用哪个交换机,定义使用哪个queue队列,queue做了一个routing-key

routing-key用了queue的名字
在这里插入图片描述

这里交换机不写,就看链接的哪个虚拟主机,会创建一个缺省交换机的,这时候用的routing-key就是这一块queue的名字
在这里插入图片描述
工作队列就是把消费端整了好几个,多线程可以搞定,多进程也可以搞定。
进程是内存里的,程序是躺在磁盘里的,进程要把你的程序变成二进制,要么解释器要么编译器,最终要编译成某种程序可以用,这个程序能用就需要去加载,python就需要解释器加载,现场将源代码编译,编译之后形成字节码转换成你要起的进程。
c++/c,编译完是个EXE或者是可执行文件,可执行文件一旦被操作系统读入加载之后也是个进程。启动多次就是多进程,也不用每次都是multi processing,这是在一个进程中创建并管理。
现在是启动多个进程,各自读各自的队列不需要管理,写成这样就可以了。

这个代码运行多份就是多进程的概念了,这种称为工作队列,一个queue里面的一个消息只能提供给当前连在这个queue上某一个消费者来用,一旦这个消费者拿到这个数据,其他消费者就拿不到这个数据了
在这里插入图片描述

发布、订阅模式

**比如生产者是报社,把一份信息送给中间的x,就是exchange交换机,由交换机派往多个队列,就是一份变多份,x类似邮局,由邮局把数据分发给消费者邮箱里了。
也就是中间有个中介将你的消息投递到队列当中去,c1和c2都要看到数据,就由中间的exchange完成数据的转发。
**
发布、订阅模式和工作队列显著区别,特别画出了交换机,在交换机后有多个队列,和工作队列是两码事,消费者去订阅消息,c1和c3在同一个队列是轮循的拿。现在不同队列就是一份数据一变多了,一个数据变两个数据,两个数据分别进入不同的队列,c1和c2的处理速度可以不一样,每一个分析器消费速度实际上是不一样的,有的分析特别耗费时间

在这里插入图片描述
一份数据经过交换机,发给绑定交换机上的所有队列,典型的一对多,这种一对多是一对全部,是广播模式,这里的订阅者就是关注了哪个queue,只要订阅就发送。消费者只关心链接哪个,从哪个拿数据
在这里插入图片描述
需要申明一个交换机,创建个t3作为server。一般先要搞定链接,再来channel相当于会话,在channel里看你需要不需要交换机和queue,然后才是发布数据。现在需要写一个交换机

第一个参数str,交换机名字

在这里插入图片描述
交换机写完,就是它的类型,direct是默认的,普通的路由方式,这回是一对多的方式需要写fanout(英译,扇出,在这里可以作为广播)

在这里插入图片描述
有这一句在,生产者可以不去创建,由消费者也可以去创建一个队列
在这里插入图片描述
首先需要定义一个交换机,工作模式改成广播模式fanout
在这里插入图片描述
在这里插入图片描述
交换机和queue要建立一种关联关系,bing绑定

在这里插入图片描述
这种方式,不写名字,是生成随机名称的queue
在这里插入图片描述
exclusive=True的意思是当你的queue所在的链接断开之后则这个随机生成的queue,给了名字也一样,管你生成的什么queue,都给你删除掉.
也就是会话级别的这个会话就断了

在这里插入图片描述
从q1和q2拿method对象,再去拿queue,其实是个字符串,是queue的name,因为下面需要去绑定名字,随机生成的就需要去method.queue拿到名字,绑定在哪个交换机上,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在有交换机了,但是routing-key写什么都无所谓
在这里插入图片描述

定义一些常量
在这里插入图片描述
现在发数据就要用指定的交换机了,routing_key先不写,最后是要发的消息,现在服务端并不去管queue,queue放到消费者管

在这里插入图片描述

t4作为消费者
在这里插入图片描述
加上交换机的定义
在这里插入图片描述
现在创建queue,不指定名字,就是随机生成了随机名称队列,现在不但定义了两个queue,还把名字拿到了
在这里插入图片描述
但是queue现在跟交换机没关系,看一下basic_consume第二个参数
在这里插入图片描述
第二个要写queue名称
在这里插入图片描述
消费者其实最关心就是queue,但是消费者管不到生产者把数据打到哪里去,一般都是在前面写的
在这里插入图片描述
发送数据到交换机,交换机是fanout扇出的工作模式,交换机会把数据发送到所有绑定上面的queue

在这里插入图片描述
现在看不到跟queue相关的,生产者只看到跟交换机相关的
在这里插入图片描述
还是消费者关心queue,现在消费者也定义了交换机,和queue,但是交换机和queue没有关系
在这里插入图片描述
现在让生产者直接发送消息

在这里插入图片描述
多了一个logs

在这里插入图片描述
现在看queue,生产者没有创建queue,也就是queue不存在
在这里插入图片描述
交换机建好了,链接到了虚拟主机,把数据发往exchange交换机,现在路由规则是用fanout扇出,广播的方式,但是现在没人看,就把消息丢弃了,没有帮你攒

在这里插入图片描述
生产好了,这些数据就消亡了
在这里插入图片描述
交换机还在,交换机是做路由用的,不是保存数据用的,我们现实的路由器也是没路可走就丢包,只有queue才是容器

在这里插入图片描述
现在消费者从这两个queue拿数据,看是否能拿到

在这里插入图片描述
现在queue是有了

在这里插入图片描述
但是logs还是没有绑定

在这里插入图片描述
queue也跟什么都没绑定

在这里插入图片描述
现在绑定第一个

在这里插入图片描述
这两个类型都是string

在这里插入图片描述
绑定第二个,现在就绑定到logs上去了,执行看看能否拿到数据
在这里插入图片描述

在这里插入图片描述
绑定到logs上了
在这里插入图片描述
logs上就有两个绑定了
在这里插入图片描述
真正存数据的是queue,当数据经过交换机后,一定要投入到queue里去,否则后面还有数据,交换机只是必经的一个设备,经过的时候要选择路由,一旦目标没有,直接抛弃数据

现在消费者有两个,分别绑定两个queue,每一个绑定自己的queue
在这里插入图片描述
现在生产者发送10条数据看看
在这里插入图片描述
看回调函数t4打印,现在是各玩各自的queue,相当于把消费者分开了,现在是10条变20条
在这里插入图片描述
现在是广播模式只要链接上来都发,如果不是广播模式就不能用随机命名了,这就是fanout扇出模式或者广播模式
在这里插入图片描述
fanout模式可以将数据一变多
在这里插入图片描述
消费者现在是阻塞的,关不关无所谓,但是用随机名,下次创建,又是随机名字,如果不删除,这样随机名称的名字越来越多,没人清理,所以一般都要加exclusive=True,要求断开链接后,删除queue
在这里插入图片描述

这个name1就是我们要用的名称在这里插入图片描述
绑定用顺序传参或者关键字传参都可以,绑定之后就绑定给所有绑定的队列,已绑定队列就各自玩各自的

在这里插入图片描述
同一个queue还是轮循

在这里插入图片描述
绑定消费者,就是从哪里取
在这里插入图片描述
现在就相当于在name2上绑定4个消费者,name1就只有一个,可以理解为,name2的消费者者计算比较复杂,算的比较慢,name1的消费者比较快,1个就够了
在这里插入图片描述
这个如果改成通过命令行参数传进来就自由很多,参数解析了element,就可以追一个参数,往里面扔哪个queue,这样就由你启动控制,多进程链接哪些queue来处理,这样就解决处理能力不足的问题

在这里插入图片描述
交换机写在哪里都无所谓,生产者和消费者都可以,只发现同类型的就可以创建,有了就直接用,只要权限够

在这里插入图片描述
一个用位置传参一个用关键字传参

在这里插入图片描述
熟悉了原理,开5672和25672即可

在这里插入图片描述
扇出其实是特殊路由,不加判断,将所有数据路由给所有已经绑定的queue,也是路由模式,只不过是广播路由

路由模式Routing

在这里就是完全匹配,刚才扇出fanout,不需要routing_key,写了也白写,第一种模式,写了routing_key,就是后面写的queue的名称,要是随机的,每次名字都需要跟着变,所以没法写。
routing_key现在有两种方式,一种不写,一种是queue的名称

在这里插入图片描述
现在看到的这几个就是routing_key,每一个消息都可以带上routing_key,这个消息带上routing_key,就开始按照配置的交换机上的所谓的规则,按照routing_key去分发数据。
假如q1的routing_key是orange,消息在发布的时候可以带上routing_key,由routing_key决定消息走哪里去。
如果现在来两个routing_key是white的,经过交换机,问交换机往哪里发,没人管就丢弃了,所以诞生了一种匹配的方式,但是这个匹配就是全长匹配

在这里插入图片描述
新建个t5,t6.py作为路由模式的生产者和消费者,改成color颜色
在这里插入图片描述
t6也改下
在这里插入图片描述
现在要变成路由了

在这里插入图片描述
现在交换机的类型应该选direct,指定路由的key

在这里插入图片描述
交换机叫什么,采用什么方式工作,在发布的时候出了一定交换机,还要告诉用什么routing_key,也就是现在的消息带上了routing_key这个值(以前是默认的routing_key就是queue的名字),现在routing_key才发挥作用,是用来做路由的,是来匹配之后去哪个queue的
在这里插入图片描述
设定一个常量值
在这里插入图片描述
在生产者或者消费者里绑定都没关系
在这里插入图片描述
加入随机数模拟一下
在这里插入图片描述
randint就是range

在这里插入图片描述
所以这里写0和2

在这里插入图片描述

在这里插入图片描述
现在每一次发消息就要随机伴随一个routing_key,这个routing_key就发给交换机去了,
在这里插入图片描述
在color这个交换机上绑定2个queue

在这里插入图片描述
现在绑定了,说明交换机和queue这两条路打通了,数据可以到queue,下面就是要如何消费
在这里插入图片描述
绑定的时候有个routing_key

在这里插入图片描述
消费的时候就没有routing_key

在这里插入图片描述
在这里插入图片描述
这里绑定的routing_key是string

在这里插入图片描述
绑定两个routing_key就写两次

在这里插入图片描述

在这里插入图片描述
消费者先启动
在这里插入图片描述
交换机多了个color

在这里插入图片描述
orange是单独一份,black和green,在此交换机绑定了三个queue
在这里插入图片描述

把hello删除掉

在这里插入图片描述
这时候有exclusive的意思就是,当连接断掉,则queue被删除

在这里插入图片描述
一个数据产生,这个数据怎么走要看routing_key了,假如routing_key写的是orange,就发给q1,假如每一条消息都是不同的routing_key,分给两个不同的queue,这两个消费者就去分别拿数据消费。
所以输入数据10条,消费的数据总数也是10条

在这里插入图片描述
这样就是有不合适的数据可以丢弃,犯不着publish,不必要到routing_key这里丢弃掉
在这里插入图片描述
在这里插入图片描述
路由方式要改,交换机用不用新的无所谓,交换机重复利用是要这两个参数一模一样

在这里插入图片描述
路由模式routing_key很重要,没有routing_key就没办法路由了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在消费者代理里,绑定归绑定,不同的routing_key绑定写多条即可

在这里插入图片描述
消费者数目你想在哪个queue下有几个就几个,现在是不同的queue上写了一个,也就是绑定归绑定,绑定是用来解决路由的问题,这相当于同一个queue绑定了两次,也就是认两个routing_key,但是消费者有几个随你

在这里插入图片描述
在这里插入图片描述
现在准备发送数据,运行t5,总共10条数据
在这里插入图片描述
可以在回调函数中处理了几个,也可以在method里打印看看

在这里插入图片描述
先进先出

在这里插入图片描述
这就是路由模式,需要你用routing_key
在这里插入图片描述
有了routing_key就可以解决路由的问题,前提是吧routing_key定义好
在这里插入图片描述

在这里插入图片描述
现在有一个数据,routing_key=black,消息本身body是100,这个消息经过这个路由
在这里插入图片描述
第一个把生产者定死了,颜色定死了
在这里插入图片描述
现在就是两个不同的queue都认routing_key

在这里插入图片描述
消费者在不同的queue上消费

在这里插入图片描述
首先将消费者运行起来
在这里插入图片描述
现在生产者发送一条数据

在这里插入图片描述
现在两个不同的都接收了

在这里插入图片描述
现在就 类似于一种广播的方式出现了,一对多,也称多播,一对全部就是广播
在这里插入图片描述
现在,这里也写black,但是没必要,直接fanout扇出,就是特殊的路由模式
在这里插入图片描述
现在以前的笨重的一对多方式,完全可以交给路由或者广播的方式都可以解决,效率很高

如果绑定的时候是black,跟fanout类似,但是是1对多,fanout是1对全部。
在fanout扇出的时候,exchange不做数据过滤的,1个消息,所有绑定的全部发;
。路由的时候,还需要做一次routing_key匹配,匹配上了才发,这种路由模式可以看做多播,经过选择发给谁

在这里插入图片描述
发布订阅模式用的比较多,(广播,一对所有),路由模式用的也比较多(一对多)
在这里插入图片描述
在这里插入图片描述
我们一般用的工作队列模式+路由模式,其实就是路由模式,只是消费者多了

发布了243 篇原创文章 · 获赞 6 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_42227818/article/details/105337107