位置: 编程技术 - 正文

利用Python学习RabbitMQ消息队列(用python学算法)

编辑:rootadmin

推荐整理分享利用Python学习RabbitMQ消息队列(用python学算法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python learn,python learn,python learning,python learn,python learning,python可以这样学,python learn,python learn,内容如对您有帮助,希望把文章链接给更多的朋友!

RabbitMQ可以当做一个消息代理,它的核心原理非常简单:即接收和发送消息,可以把它想象成一个邮局:我们把信件放入邮箱,邮递员就会把信件投递到你的收件人处,RabbitMQ就是一个邮箱、邮局、投递员功能综合体,整个过程就是:邮箱接收信件,邮局转发信件,投递员投递信件到达收件人处。

RabbitMQ和邮局的主要区别就是RabbitMQ接收、存储和发送的是二进制数据----消息。

rabbitmq基本管理命令:

一步启动Erlang node和Rabbit应用:sudo rabbitmq-server

在后台启动Rabbit node:sudo rabbitmq-server -detached

关闭整个节点(包括应用):sudo rabbitmqctl stop

Demo:

producer.py

consumer.py

一、概念:

Connection: 一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQ Server的。程序的起始处就是建立这个TCP连接。

Channels: 虚拟连接。建立在上述的TCP连接中。数据流动都是在Channel中进行的。一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。

二、队列:

首先建立一个Connection,然后建立Channels,在channel上建立队列

建立时指定durable参数为真,队列将持久化;指定exclusive为真,队列为临时队列,关闭consumer后该队列将不再存在,一般情况下建立临时队列并不指定队列名称,rabbitmq将随机起名,通过result.method.queue来获取队列名:

result = channel.queue_declare(exclusive=True)

result.method.queue

区别:durable是队列持久化与否,如果为真,队列将在rabbitmq服务重启后仍存在,如果为假,rabbitmq服务重启前不会消失,与consumer关闭与否无关;

而exclusive是建立临时队列,当consumer关闭后,该队列就会被删除

三、exchange和bind

Exchange中durable参数指定exchange是否持久化,exchange参数指定exchange名称,type指定exchange类型。Exchange类型有direct,fanout和topic。

Bind是将exchange与queue进行关联,exchange参数和queue参数分别指定要进行bind的exchange和queue,routing_key为可选参数。

Exchange的三种模式:

Direct:

任何发送到Direct Exchange的消息都会被转发到routing_key中指定的Queue

1.一般情况可以使用rabbitMQ自带的Exchange:””(该Exchange的名字为空字符串);

2.这种模式下不需要将Exchange进行任何绑定(bind)操作;

3.消息传递时需要一个“routing_key”,可以简单的理解为要发送到的队列名字;

4.如果vhost中不存在routing_key中指定的队列名,则该消息会被抛弃。

利用Python学习RabbitMQ消息队列(用python学算法)

Demo中虽然声明了一个exchange='yanfa'和queue='anheng'的bind,但是在后面发送消息时并没有使用该exchange和bind,而是采用了direct的模式,没有指定exchange,而是指定了routing_key的名称为队列名,消息将发送到指定队列。

如果一个exchange 声明为direct,并且bind中指定了routing_key,那么发送消息时需要同时指明该exchange和routing_key.

Fanout:

任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上

1.可以理解为路由表的模式

2.这种模式不需要routing_key

3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。

4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。

Demo中创建了一个将一个exchange和一个queue进行fanout类型的bind.但是发送信息时没有用到它,如果要用到它,只要在发送消息时指定该exchange的名称即可,该exchange就会将消息发送到所有和它bind的队列中。在fanout模式下,指定的routing_key是无效的 。

Topic:

任何发送到Topic Exchange的消息都会被转发到所有关心routing_key中指定话题的Queue上

1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(routing_key),Exchange会将消息转发到所有关注主题能与routing_key模糊匹配的队列。

2.这种模式需要routing_key,也许要提前绑定Exchange与Queue。

3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个routing_key为”MQ.log.error”的消息会被转发到该队列)。

4.“#”表示0个或若干个关键字,“*”表示一个关键字。如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。

5.同样,如果Exchange没有发现能够与routing_key匹配的Queue,则会抛弃此消息。

四、任务分发

1.Rabbitmq的任务是循环分发的,如果开启两个consumer,producer发送的信息是轮流发送到两个consume的。

2.在producer端使用cha.basic_publish()来发送消息,其中body参数就是要发送的消息,properties=pika.BasicProperties(delivery_mode = 2,)启用消息持久化,可以防止RabbitMQ Server 重启或者crash引起的数据丢失。

3.在接收端使用cha.basic_consume()无限循环监听,如果设置no-ack参数为真,每次Consumer接到数据后,而不管是否处理完成,RabbitMQ Server会立即把这个Message标记为完成,然后从queue中删除了。为了保证数据不被丢失,RabbitMQ支持消息确认机制,即acknowledgments。为了保证数据能被正确处理而不仅仅是被Consumer收到,那么我们不能采用no-ack。而应该是在处理完数据后发送ack。

在处理数据后发送的ack,就是告诉RabbitMQ数据已经被接收,处理完成,RabbitMQ可以去安全的删除它了。如果Consumer退出了但是没有发送ack,那么RabbitMQ就会把这个Message发送到下一个Consumer。这样就保证了在Consumer异常退出的情况下数据也不会丢失。

这里并没有用到超时机制。RabbitMQ仅仅通过Consumer的连接中断来确认该Message并没有被正确处理。也就是说,RabbitMQ给了Consumer足够长的时间来做数据处理。

Demo的callback方法中ch.basic_ack(delivery_tag = method.delivery_tag)告诉rabbitmq消息已经正确处理。如果没有这条代码,Consumer退出时,Message会重新分发。然后RabbitMQ会占用越来越多的内存,由于RabbitMQ会长时间运行,因此这个“内存泄漏”是致命的。去调试这种错误,可以通过一下命令打印un-acked Messages:

sudo rabbitmqctl list_queues name messages_ready messages_unacknowledged

4.公平分发:设置cha.basic_qos(prefetch_count=1),这样RabbitMQ就会使得每个Consumer在同一个时间点最多处理一个Message。换句话说,在接收到该Consumer的ack前,他它不会将新的Message分发给它。

五、注意:

生产者和消费者都应该声明建立队列,网上教程上说第二次创建如果参数和第一次不一样,那么该操作虽然成功,但是queue的属性并不会被修改。

可能因为版本问题,在我的测试中如果第二次声明建立的队列属性和第一次不完全相同,将报类似这种错, "PRECONDITION_FAILED - parameters for queue 'anheng' in vhost '/' not equivalent"

如果是exchange第二次创建属性不同,将报这种错, "PRECONDITION_FAILED - cannot redeclare exchange 'yanfa' in vhost '/' with different type, durable, internal or autodelete value"

如果第一次声明建立队列也出现这个错误,说明之前存在名字相同的队列且本次声明的某些属性和之前声明不同,可通过命令sudo rabbitmqctl list_queues查看当前有哪些队列。解决方法是声明建立另一名称的队列或删除原有队列,如果原有队列是非持久化的,可通过重启rabbitmq服务删除原有队列,如果原有队列是持久化的,只能删除它所在的vhost,然后再重建vhost,再设置vhost的权限(先确认该vhost中没有其他有用队列)。

以上内容是小编给大家介绍的利用Python学习RabbitMQ消息队列,希望大家喜欢。

python抓取网页中图片并保存到本地 在上篇文章给大家分享PHP源码批量抓取远程网页图片并保存到本地的实现方法,感兴趣的朋友可以点击了解详情。#-*-coding:utf-8-*-importosimportuuidimporturllib2

Python随手笔记之标准类型内建函数 Python提供了一些内建函数用于基本对象类型:cmp(),repr(),str(),type()和等同于repr()的('')操作符(1)type()type的用法如下:type(object)接

用Python抢过年的火车票附源码 前言:大家跟我一起念,Python大法好,跟着本宝宝用Python抢火车票首先我们需要splinter安装:pipinstallsplinter-

标签: 用python学算法

本文链接地址:https://www.jiuchutong.com/biancheng/379930.html 转载请保留说明!

上一篇:MySQL中表的复制以及大型数据表的备份教程(mysql数据表复制)

下一篇:python抓取网页中图片并保存到本地(用python抓取网页数据的代码)

  • 融资性售后回租印花税
  • 购买增值税发票金税盘计入什么科目?
  • 公司买车可以抵多少税100万
  • 残疾人就业保障金
  • 坏账准备和信用账户区别
  • 出口退税进项发票认证勾选
  • 企业销售使用过的固定资产
  • 企业内部控制调查问卷
  • 客运站收到承运方开具增值税专用发票可否抵扣
  • 购买方丢失未认证发票 怎么办
  • 资产的计量属性主要包括哪些
  • 未使用房子需要交物业费嘛
  • 同一控制吸收合并会计处理
  • 用现金缴纳海关增值税能否抵扣?
  • 环境保护税即将施行 有哪些点需要关注?
  • 内销征税是什么意思
  • 高新技术企业认定条件
  • 怎么查询发票记录
  • 公司接受安全罚款的账务处理
  • 债权性投资和权益性投资的区别
  • 实发工资需扣除所得税吗
  • 购买员工宿舍床上用品怎么入账
  • 腾讯手游助手好不好用
  • 调整以前年度所得税汇算清缴报表,在哪调减虚增的成本
  • 如何向企业支付宝收款
  • 老板的工资属于
  • 鸿蒙系统蓝牙耳机声音小怎么办
  • 硬盘最小的存储单位
  • 内格罗斯岛
  • PHP:imagecolortransparent()的用法_GD库图像处理函数
  • 施工方可以向建设单位借款么
  • php怎么设置管理员权限
  • mac快捷切换
  • 城建税教育费附加会计分录
  • mavon-editor的使用
  • 企业汇算清缴中,A107070表中的数据是自动跳出来嘛
  • vue3使用ref获取元素
  • vue-cli4创建项目
  • css如何应用
  • setdo指令
  • php标准数据类型共有四种
  • 纳税证明和完税证明的金额为什么不一样
  • 冲销去年暂估成本对企业所得税的影响
  • 帝国cms安装教程
  • 投稿网址打不开
  • linux db2安装与配置
  • php 操作mongodb
  • python 邮件服务
  • 购入已提足折旧的固定资产账务处理
  • 自然人独资企业需要交企业所得税吗
  • 行政事业单位福利费开支范围文件
  • 出差的招待费应由谁承担
  • 现金流量表季度期初现金余额怎么填
  • 融资租赁的会计处理方法举例子
  • 保险没有合同算生效吗
  • 核算费用
  • 现金收款的程序是什么
  • 往来的款项性质有哪些
  • 账面价值,账面净值,账面余额三者的区别存货
  • 简述什么是实收资本
  • mysql随机选择
  • mysql声明全局变量
  • vmware下ubuntu(linux)与主机文件共享设置的方法
  • fedora linux安装教程
  • 电脑硬件用途
  • linux中使用bash是什么意思
  • vim配置语法高亮
  • win7控制面板找不到windows update
  • lua教程书籍
  • 微信小程序上传文件的API是
  • android消息队列使用
  • js面向对象编程思想
  • 房租计入待摊费用
  • 重庆税筹公司
  • 辽宁省国家税务总局
  • 农产品进项税额核定扣除
  • 深圳个税官网
  • 上海税务开户
  • 做好绩效管理工作税务局
  • 河北新农合怎么查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设