2020/04/07 06-RabbitMQ选型和类封装

本质上是一种模式,虽然一直在换type,本质上都是路由,模式改成direct,这样就可以根据路由的key,来进行数据的分发和投递,两个queue绑定的key一样,这样数据就发两份,有点像fanout,但是不完全一样,queue上绑定什么,只要符合都发

在这里插入图片描述

对于生产者无非就是把type换成direct
在这里插入图片描述
publish只需要告诉交换机是谁,告诉它routing是谁就ok了

在这里插入图片描述
对于消费者来讲,链接到哪个服务器,也可以不写交换机,还可以创建queue和交换机链接在一起,如果queue跟交换机不链接在一起根本无法用,有的时候写是链接的缺省交换机
在这里插入图片描述
交换机有几个queue是你自己控制的,queue可以是一个也可以是多个,queue并没有限制客户端,客户端有几个没有太大问题
在这里插入图片描述
生产者生成数据经过 交换机,随机带上rk1,还是2,这样就能拿到数据
在这里插入图片描述

现在queue版本的已经做好了,第三方队列的该如何去做
在这里插入图片描述
可以把这里抽象成一个类

在这里插入图片描述
选择路由模型。topic,还是direct,fanout,现在为了简化,先试用direct路由模式,交换机的名字由你指定,交换机用一个即可,剩下的是queue的问题,之前的三个queue绑定上来即可
在这里插入图片描述
第一步先规划,交换机名词,选择什么方式,打过去的routing_key应该做什么事情,用同一个交换机和虚拟主机都关系不大
在这里插入图片描述
应该有routing_key,这样发给不同的人,routing_key可以是queue的名字,随机计算queue的名字
在这里插入图片描述
现在routing_key好像用的是queue的名称

在这里插入图片描述
这样就做好了规划
在这里插入图片描述
消费者代码可以在生产者代码基础上改
在这里插入图片描述
申明queue,用完不关,exclusive=False,断开之后不能删除,起个名字
在这里插入图片描述
routing_key不写试试
在这里插入图片描述
这里生产者20条数据routing_key都是urls

在这里插入图片描述
只要进到这里,就是确实可以通过queue的名称,把数据送给queue,并没有说一定要这个queue绑定这个routing_key

在这里插入图片描述
作为消费者把这三个创建了,应该各自消费各自的,如果多个消费者同时消费一个队列,都消费urls队列
在这里插入图片描述
现在是不管创建几个队列,只消费urls,现在消费者放的多了,queue也扛得住
在这里插入图片描述
但是一旦start_consuming就阻塞住了,callback是不同的消费者调用的,每个消费者在自己的进程或线程,自己的环境中调用这个函数
在这里插入图片描述
get是必须要做控制,拿到数据后不做限制,但是一旦返回数据带none,就歇一会再去拿(等有数据了再去拿)
在这里插入图片描述
生产者是给0,也就是urls打入数据,我们在1 上消费

在这里插入图片描述
运行一下
在这里插入图片描述
queue三个已经有了

在这里插入图片描述
新的交换机

在这里插入图片描述
三个routing_key都绑定了,routing_key默认就是名称
在这里插入图片描述
这里绑定没写,就是queue的名称
![eli
生产20条数据

在这里插入图片描述
消费的应该是上面的
在这里插入图片描述
把消费者停了,这里是退出不删除,这样消费者以外崩溃了,数据还在
在这里插入图片描述
再次启动消费者

在这里插入图片描述
一个生产者和消费者代码写好了,下一步就是如何封装的事情了

在这里插入图片描述
在生产中用到的rabbitmq就是这么多东西,除非业务很复杂,极少用到topic,大部分用到direct路由即可,如果想要把一份数据变成多份数据就fanout

下面看如何封装。,需要有生产的,和发送的,就这两件事,第一件事初始化建立实例,第二个发送什么告诉它
在这里插入图片描述
amqp高级消息队列协议,amqp://username,password@host,port,virtualhost
在这里插入图片描述
创建channel,类似会话,创建交换机
在这里插入图片描述
把queue名称也写一下,一般来讲找个producer专门为这个来服务
在这里插入图片描述
下面不设置routing_key,就使用queuename,现在就可以把数据发过去了
在这里插入图片描述
做成被导入模块了,底下的就不能执行了,下面部分就搬到 name=’__main__里’
在这里插入图片描述
再进行改动,要用上面的类
在这里插入图片描述
这样就搞定了,删除32行以下的
在这里插入图片描述
现在就需要测试了,producer(ip,端口,虚拟主机,用户名,密码,交换机名字,queue),,sendmsg的消息自己来定
在这里插入图片描述
这里应该是self.channel 在这里插入图片描述
消费者的代码几乎也一样,这些参数也够用了
在这里插入图片描述
改个名字
在这里插入图片描述
下面就是该如何消费的问题,先要接收数据,从self.channel。basic_get拿到数据,顺便就解构了
在这里插入图片描述
也可以这样,一定在第二个上,源码说的很清楚,此函数返回三元组
在这里插入图片描述
basic_get第一个参数是从哪个queue去那里
在这里插入图片描述

创建的时候肯定会有异常的时候,比如服务器断掉,需要try一下

在这里插入图片描述
** __main__里就需要消费**

在这里插入图片描述
测试代码需要把这些全部删除在这里插入图片描述
在这里插入图片描述
交换机也删除出干净

在这里插入图片描述
在这里插入图片描述
这里直接拿到就是msg,慢一点,执行一下
在这里插入图片描述
生产数据也运行

在这里插入图片描述
这两个类台相似了,既可以做生产者也可以做消费者
在这里插入图片描述
如果两个类几乎一模一样,继承就更好做,前面的都一样,只不过下面多两行
在这里插入图片描述
把交换机删除

在这里插入图片描述
queue也删除
在这里插入图片描述
现在只允许,producer,producer把自己的事情做完后就消亡了,关键是能否把queue和queue里的数据保留着。由它来做queue创建和queue绑定
在这里插入图片描述
执行一下,所谓的producer和consumer是我们自己来定义的,别人跟本没区分,调API想调什么调什么

在这里插入图片描述
现在有html
在这里插入图片描述
现在交换机绑定了,程序停了

在这里插入图片描述
40条数据还在

在这里插入图片描述
也就是init可以完全一样
在这里插入图片描述
可以做一个类,然后继承出一个生产者消费者,在做业务的时候能知道在干嘛

抽取一个基类试试

在这里插入图片描述
在这里插入图片描述
这样就成了
在这里插入图片描述
把consumer加进来,就抽取好了

在这里插入图片描述
目前类抽取成功,下面就是应用。把producer改成messagequeue
在这里插入图片描述
把这两个引入到这里
在这里插入图片描述

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

猜你喜欢

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