python使用pika操作rabbitmq编程入门(二)

pika生产者程序大致步骤:
1. 建立连接connection , 需要认证的调用认证参数
2. 创建通道channel  当然 channel可以池化,这样可以重复使用
3. 声明队列   指定队列属性, 一旦指定属性不能修改, 例如是否持久化,名称
4. 声明交换机  交换机类型,名称等, 也可以不用声明,直接使用 “” 空字符串,默认交换机也可以
5. 将队列与交换机绑定   queue_bind 
6. basic_publish 发送到交换机 指定路由键
pika消费者程序大致步骤:
1. 建立连接connection , 需要认证的调用认证参数
2. 创建通道channel  当然 channel可以池化,这样可以重复使用
3. 声明队列   指定队列属性, 一旦指定属性不能修改, 例如是否持久化,名称
4. 声明交换机  交换机类型,名称等, 也可以不用声明,直接使用 “” 空字符串,默认交换机也可以
5. 将队列与交换机绑定   queue_bind 
6. basic_consume 消费消息
1. 轮询接收消息

使用消息队列的一个好处就是, 可以将任务消息发送到队列中,由消费者异步进行处理, 同时对于后端消费者可以很容易地增加减少,只需要运行多个进程即可, 方便扩展, 之前的示例中消费端程序就可以开启多个,然后可以看到消费被轮询得分配给每个消费者

将之前的消费者略作更改, 加入客户端编号,启动三个消费者, 通过生产者发送4个消息, 依次收到消息, 即是 轮询(round-robin):

 [*] Waiting for messages. To exit press CTRL+C
1. [x] Received 'Hello World!'
1. [x] Received 'Hello World!'
 [*] Waiting for messages. To exit press CTRL+C
2. [x] Received 'Hello World!'
 [*] Waiting for messages. To exit press CTRL+C
3. [x] Received 'Hello World!'
2. 消息确认:

为了防止消息丢失,RabbitMQ提供了消息响应(acknowledgments)。消费者会通过一个ack(响应),告诉RabbitMQ已经收到并处理了某条消息,然后RabbitMQ就会释放并删除这条消息。 如果消费者(consumer)挂掉了,没有发送响应,RabbitMQ就会认为消息没有被完全处理,然后重新发送给其他消费者(consumer)。这样,及时工作者(workers)偶尔的挂掉,也不会丢失消息。

消息响应默认auto_ack=False, 不自动确认消息, 即是需要我们处理并确认消息的

确认需要发送确认消息:

在回调callback中加入basic_ack

channel.basic_ack(delivery_tag = method.delivery_tag)

如果auto_ack设置为True,而忘记basic_ack消息确认,消息在程序退出之后就会重新发送,如果不及时释放没响应的消息,RabbitMQ就会占用越来越多的内存。

为了排除这种错误,可以使用rabbitmqctl命令,输出messages_unacknowledged字段:

# rabbitmqctl list_queues name messages_ready messages_un
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值