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