消息确认机制当basic_consume的参数no_ack设置为true时,消息到达consumer后会立即标记为已删除。消息会丢失,所以需要消息确认机制。当worker挂掉后,将消息重新分发给另一个woker执行方法:设置no_ack为false,然后在回调函数中确认消息$callback=function($msg){echo"[x]Received",$msg->正文,“\n”;睡眠(substr_count($msg->body,'.'));echo"[x]完成","\n";$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);};$channel->basic_consume('task_queue','',false,false,false,false,$打回来);要特别注意如何忘记确认消息,这将耗尽内存。查看未确认消息命令:sudorabbitmqctllist_queuesnamemessages_readymessages_unacknowledged消息持久化问题虽然消息确认机制可以保证消费者挂机时消息不丢失,但是当rabbitmq挂机时,就没办法保证了。这时候就需要毅力被融化。方法:队列和消息必须设置为持久化(1)队列持久化:生产者和消费者声明队列参数durable设置为true,现有队列不能重新设置参数值。命令如下:$channel->queue_declare('task_queue',false,true,false,false);(2)消息持久化:消息delivery_mode设置为2,如下:$msg=newAMQPMessage($data,array('delivery_mode'=>AMQPMessage::DELIVERY_MODE_PERSISTENT));公平分配问题问题:多个worker处理队列消息时,rabbitmq循环均匀分配消息给一个worker。如果此时分配给其中一个worker做一个耗时的任务,就会出现这个worker会很忙,而其他worker比较空闲。方法:在worker处理和确认消息之前,不向worker发送新的消息,而是发送给下一个空闲的worker,并设置prefetch参数为1。当然,如果所有worker都忙,应该增加此时worker的数量Quantity$channel->basic_qos(null,1,null);参考链接:http://www.rabbitmq.com/tutor...
