之前只是用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

但启动后不久, 作为publish的生产端就会掉线:

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是二进制的. 然后消费端要

body.decode('utf-8')
 
结果忽然发现 官方代码示例里这么写
    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:

      #不论当前消息是否成功,都表示消息确实处理完了 手动确认 否则没有ack不再发送新消息 保证确实被处理了再确认
      ch.basic_ack(delivery_tag = method.delivery_tag)

pika 与 rabbitMQ 阻塞连接的更多相关文章

  1. RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案

    项目场景: 最近在项目中使用了RabbitMq,其中有一个功能必须能随时切断RabbitMq的coumser.第一时间写出来的代码如下: 伪代码: while(flag){ QueueingConsu ...

  2. python使用pika链接rabbitmq Connection reset by peer 解决办法

    记录一下, 最近在用机器学习打算做一个Rest API, 数据存入mongo,任务采用消息队列,rabbitmq 由于引擎采用python编写,所以WEB也直接打算用python编写了,比较省事. W ...

  3. 34.TCP非阻塞连接及套接字异常处理丶端口扫描脚本

    TCP非阻塞及套接字异常处理: TCP阻塞套接字异常捕获: 套接字创建失败,8000 socket.error 客户端连接错误: ConnectionRefusedError socket.gaier ...

  4. python安装pika模块rabbitmq

    1.pip install pika 2.如找不到 拷贝 D:\python\testmq\venv\Lib\site-packages  \pika目录

  5. rabbitmq一个连接多个信道channel

    https://www.cnblogs.com/eleven24/p/10326718.html

  6. Pika 连接 rabbitmq 集群

    原文:https://blog.csdn.net/Tech_Salon/article/details/82890431 使用 Pika 连接 rabbitmq 集群使用 python 编程经常会用到 ...

  7. python的pika模块操作rabbitmq

    上一篇博文rabbitmq的构架和原理,了解了rabbitmq的使用原理,接下来使用python的pika模块实现使用rabbitmq. 环境搭建 安装python,不会的请参考Linux安装配置py ...

  8. RabbitMQ/pika模块

    简介 MessageQueue用于解决跨进程.跨线程.跨应用.跨网络的通信问题. RabbitMQ使用erlang开发,在windows上使用时要先安装erlang. 官方的示例比较容易理解,可以点这 ...

  9. RabbitMQ的安装和使用Python连接RabbitMQ

    绪论 这里的环境使用的是Mac OS X系统,所有的配置和使用都是基于Mac OS X 和Python 2.7 以及对应的pika库的. RabbitMQ的安装和配置 安装部分 #brew insta ...

随机推荐

  1. Exclusive Time of Functions

    On a single threaded CPU, we execute some functions.  Each function has a unique id between 0 and N- ...

  2. Spring实现构造注入

    Spring通过setter访问器实现对属性的赋值,这种做法称为设值注入:Spring还提供了通过构造方法赋值的能力,称为构造注入.使用设值注入时,Spring通过JavaBean的无参构造方法实例化 ...

  3. 升级降级(期望DP)2019 Multi-University Training Contest 7 hdu杭电多校第7场(Kejin Player)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意: 有 1~n 个等级,你现在是1级,求升到n级的花费期望.会给你n个条件(i~i+1级升级 ...

  4. Smarty内置函数之config_load

    config_load的作用是: 用于从配置文件中加载变量,属性file引入配置文件名,另外若配置文件包含多个部分,可以使用属性section指定从那部分取得变量(若不指定,将会引入失败). 实例: ...

  5. HTML5网页文档结构

    2.1     Web标准 Web标准,使得Web开发更加容易.Web标准由万维网联盟(W3C)制定. 2.1.1          Web标准概述 Web标准的最终目的就是保证每个人都有权力访问相同 ...

  6. Charles学习(四)之使用Map local代理本地静态资源以及配置移动端代理在真机上调试iOS和Android客户端

    前言 问题一:我们在App内嵌H5开发的过程中,肯定会遇到一个问题就是我不想在chrome的控制台中调试也不想在模拟器中调试,我想要在真机上调试,那么如何解决这个问题呢? 问题二:我们期待调试时达到的 ...

  7. O004、启动第一个KVM虚机

    参考https://www.cnblogs.com/CloudMan6/p/5249270.html   本节演示如何使用 virt-manager 启动 KVM 虚机,   提前下载一个 cirro ...

  8. 111、什么是stack (Swarm18)

    参考https://www.cnblogs.com/CloudMan6/p/8119150.html   什么是 stack ?    在将这个之前先回顾一下前面部署WordPress的过程:     ...

  9. String和StringBuffer的常见用法

    链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7?answerType=1&f=dis ...

  10. Ubuntu - 14.04下,GO语言的安装!

    一,下载GO语言的安装文件,我直接下载GO语言的安装包(64位),并不是源码: 下载地址: 64位:https://storage.googleapis.com/golang/go1.6.linux- ...