rabbitmq作为我们系统之间沟通的桥梁,消息的可靠性就显得格外重要。
假如rabbitmq crash掉之后重新启动,原本的交换机、队列、消息都会消失,如果我们队列中存在一些很重要的消息的时候,我们并不愿意这样的事情发生,这就需要借助rabbitmq的持久化机制。
rabbitmq的持久化
交换机、队列设置可以为持久化,消息的投递模式也可以选择持久化(三个持久化)。
持久化的消息在进入持久化队列之后会写入到rabbitmq的持久性日志文件中,消息被消费掉后,会把持久性日志文件中该消息标记为等待垃圾收集
在broker重启之后,持久化的交换机、队列会重新初始化,持久化的消息会投递到原先的队列上
怎么做到消息持久化
三个持久化:
交换机持久化、队列持久化、消息持久化
代码示例:
<?php
try{
$config = [
"host" => "127.0.0.1",
"port" => "5672",
"login" => "wuj13",
"password" => "Aaa294515505",
"vhost" => "test_vhost"
];
$conn = new AMQPConnection($config);
//连接rabbitmq
if(!$conn->connect()){
throw new Exception("连接失败");
}
//创建信道
$channel = new AMQPChannel($conn);
//创建交换机
$exchange = new AMQPExchange($channel);
$exchangeName = "exchange_one";
//设置交换机名称
$exchange->setName($exchangeName);
//设置交换机类型
$exchange->setType(AMQP_EX_TYPE_DIRECT);
//设置为持久化交换机
$exchange->setFlags(AMQP_DURABLE);
//生成交换机
$exchange->declareExchange();
//创建队列
$queueName ="queue_test";
$queue = new AMQPQueue($channel);
//设置队列名称
$queue->setName($queueName);
$queue->setFlags(AMQP_DURABLE);
//生成队列
$queue->declareQueue();
//队列绑定交换机
$queue->bind($exchangeName,$queueName);
$message = "hello world";
//向交换机发布消息
$re = $exchange->publish($message,$queueName,AMQP_NOPARAM,["delivery_mode" => 2]);
if($re){
echo "成功发送消息".$message.PHP_EOL;
}
else{
throw new Exception("发送消息失败");
}
}
catch(Exception $excep