pika 与 rabbitMQ 阻塞连接
之前只是用celery, 这次用一下pika
参考rabbitMQ官网的python版,https://www.rabbitmq.com/tutorials/tutorial-one-python.html
没想到各种坑.
如果说rabbitMQ官网是为了让新人入门,所以刻意忽略掉细节, 那么必须吐槽pika的官方文档, 很不好.远不如celery
1 Stream connection lost: BrokenPipeError(32, 'Broken pipe')
使用pika 的BlockingConnection
raise self._closed_result.value.error
pika.exceptions.StreamLostError: Stream connection lost: BrokenPipeError(32, 'Broken pipe')
根据https://www.cnblogs.com/zhaof/p/9774390.html
是要在连接时设置心跳为0,就不会超时自动下线了, 否则RabbitMQ服务器会发过来默认值580
#--------------rabbitMQ------------------
import pika connection = pika.BlockingConnection(
pika.ConnectionParameters(
host='localhost',
heartbeat=0, #never exit after start
)) channel = connection.channel() channel.queue_declare(queue='update_sql')
这个错误在测试消费端时没测出来,因为测试使用的发布者和官方文档里一样,发完就下线退出了. 这样当然看不出这个心跳问题.
但是联调时就暴露了. 真无语.
2 content_type
默认的body是二进制的. 然后消费端要
channel.basic_publish('exchange_name',
'routing_key',
'Test Message',
pika.BasicProperties(content_type='text/plain',
type='example'))
这似乎时可以发文本的吗?
然后,看见别人还可以这么写https://blog.csdn.net/fzlulee/article/details/98480724
self.channel.basic_publish(exchange=exchange, routing_key=routing_key, body=message,
properties=pika.BasicProperties(delivery_mode=2,message_id=message_id,content_type="application/json"))
似乎就是html请求头常见的写法了? 但是pika里没有对BasicProperties的详细文档,
,源码里也看不出注释https://pika.readthedocs.io/en/stable/_modules/pika/spec.html#BasicProperties
3 ack和durable
ack防止消费者出问题, durable防止rabbitMQ服务器本身出问题
所以ack在消费端定义
channel.basic_consume(queue='update_sql',
auto_ack=False,
on_message_callback=callback)
而durable在channel里队列声明里 在 生产端,消费端都要统一声明队列
channel.queue_declare(queue='update_sql', durable=True, exclusive=False, auto_delete=False)
引用 https://blog.csdn.net/hlxx55/article/details/80964440
ack
rabbitMQ是默认开启自动应答的,这样当rabbitMQ将消息发给消费者,就会从内存中将消息删除,这样会带来一个问题,如果消费者未处理完消息而宕机,那么消息就会丢失。所以,我们将自动应答关闭,当rabbitMQ收到消费者处理完消息的回应后才会从内存中删除消息。
durable
rabbitMQ默认将消息存储在内存中,若rabbitMQ宕机,那么所有数据就会丢失,所以在声明队列的时候可以声明将数据持久化,但是如果已经声明了一个未持久化的队列,那么不能修改,只能将这个队列删除或重新声明一个持久化数据。
4防止消息积压
只在消费者这里加上basic_qos就可以了
connection = pika.BlockingConnection(
pika.ConnectionParameters(
host= self.HOST_RABBITMQ,
heartbeat = 0, #never exit after start
))
channel = connection.channel()
#durable 队列中消息持久化
#exclusive (bool) – Don’t allow other consumers on the queue
#./ exchange 不支持 exclusive
channel.queue_declare(queue='update_sql', durable=True, exclusive=False, auto_delete=False)
#1次1条消息
channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='update_sql',
auto_ack=False, #不自动确认 在callback最后确认 等于 no_ack
on_message_callback=self.callback) print(' [*] wg-Executor waiting for sql cmds. To exit press CTRL+C')
channel.start_consuming()
此外,在消费者的callback函数里,
最好在最外层用 异常处理包裹起来,确保无论执行结果如何,都在finally里执行ack
try:
except:
else:
finally:
pika 与 rabbitMQ 阻塞连接的更多相关文章
- RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案
项目场景: 最近在项目中使用了RabbitMq,其中有一个功能必须能随时切断RabbitMq的coumser.第一时间写出来的代码如下: 伪代码: while(flag){ QueueingConsu ...
- python使用pika链接rabbitmq Connection reset by peer 解决办法
记录一下, 最近在用机器学习打算做一个Rest API, 数据存入mongo,任务采用消息队列,rabbitmq 由于引擎采用python编写,所以WEB也直接打算用python编写了,比较省事. W ...
- 34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本
TCP非阻塞及套接字异常处理: TCP阻塞套接字异常捕获: 套接字创建失败,8000 socket.error 客户端连接错误: ConnectionRefusedError socket.gaier ...
- python安装pika模块rabbitmq
1.pip install pika 2.如找不到 拷贝 D:\python\testmq\venv\Lib\site-packages \pika目录
- rabbitmq一个连接多个信道channel
https://www.cnblogs.com/eleven24/p/10326718.html
- Pika 连接 rabbitmq 集群
原文:https://blog.csdn.net/Tech_Salon/article/details/82890431 使用 Pika 连接 rabbitmq 集群使用 python 编程经常会用到 ...
- python的pika模块操作rabbitmq
上一篇博文rabbitmq的构架和原理,了解了rabbitmq的使用原理,接下来使用python的pika模块实现使用rabbitmq. 环境搭建 安装python,不会的请参考Linux安装配置py ...
- RabbitMQ/pika模块
简介 MessageQueue用于解决跨进程.跨线程.跨应用.跨网络的通信问题. RabbitMQ使用erlang开发,在windows上使用时要先安装erlang. 官方的示例比较容易理解,可以点这 ...
- RabbitMQ的安装和使用Python连接RabbitMQ
绪论 这里的环境使用的是Mac OS X系统,所有的配置和使用都是基于Mac OS X 和Python 2.7 以及对应的pika库的. RabbitMQ的安装和配置 安装部分 #brew insta ...
随机推荐
- 【转帖】2018全球公有云IaaS榜单出炉:阿里、腾讯、中国电信、金山云列前十
2018全球公有云IaaS榜单出炉:阿里.腾讯.中国电信.金山云列前十 https://news.cnblogs.com/n/628391/ 中国电信貌似就是用的华为的技术 阿里 腾讯 华为 金山 百 ...
- ASP.NET Core WebApi使用Swagger生成API说明文档【特性版】
⒈新建ASP.NET Core WebAPi项目 ⒉添加 NuGet 包 Install-Package Swashbuckle.AspNetCore ⒊Startup中配置 using System ...
- JS实现把一个页面层数据传递到另一个页面的两种方式
本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递cookie页面的html,此处命名为a.html 请输入用户名和密码: <input id=&q ...
- Dedesql数据库类详解(二次开发必备教程)
其实数据库类织梦之前就有一个介绍,http://help.dedecms.com/v53/archives/functions/db/,这篇文章讲解了数据库类的一些常见的使用方法,不过没有结合例子去介 ...
- SpringBoot中使用Websocket进行消息推送
WebsocketConfig.java @Configuration public class WebSocketConfig { @Bean public ServerEndpointExport ...
- 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
今天使用npm安装插件时出现了以下错误: 经查,原因:现用执行策略是 Restricted(默认设置) 解决办法: 1.win+X键,使用管理员身份运行power shell 2.输入命令:set-e ...
- reduce一些方法对数组进行的处理
reduce方法我之前都整理了知识点,不懂的可以看一下我之前的知识点,这次我们是整理了一些关于用reduce方法进行的一些对于数组的处理 1. reduce()求数组项之和 var arr = [3, ...
- 两个实体类 复制 copy 工具类
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Date; public class ...
- Hybrid APP架构设计
通讯 作为一种跨语言开发模式,通讯层是Hybrid架构首先应该考虑和设计的,往后所有的逻辑都是基于通讯层展开. Native(以Android为例)和H5通讯,基本原理: Android调用H5:通过 ...
- linux系统使用grep命令提取文件的基名或者路径名
效果等于~]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33 echo "/etc/sysconfig/network-scripts/ ...