本质上是一种模式,虽然一直在换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的名称
![e
生产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
把这两个引入到这里