RabbitMq初探——消息持久化
消息持久化
前言
通过上一节,我们知道,有消息确认机制,保证了当消费者进程挂掉后,消息的不丢失。
但是如果rabbitmq挂掉呢?它的队列和消息都会丢失的。为了保证消息在rabbitmq挂掉重启后不丢失,
我们需要用到rabbitmq的持久化机制。
开启持久化功能
1. 首先保证queue的持久化,在publisher和consumer声明queue时,开启持久化功能。本章例子可以通过下面代码开启
//函数第三个参数置为true,代表开启队列的持久化
$channel->queue_declare('durable_queue', false, true, false, false);
2. 其次保证message的持久化,在publisher传递消息前开启消息的持久化功能。
$msg = new AMQPMessage($data, array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));
代码
sender.php
<?php
/**
* sender.php
* Created by PhpStorm.
* User: wangdaxi
* Date: 2017/10/18
* Time: 14:26
*/
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage; $connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel(); $channel->queue_declare('durable_queue', false, true, false, false); $data = implode(" ", array_slice($argv, 1));
empty($data) && $data = "Hello World!"; $msg = new AMQPMessage($data, array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)); $channel->basic_publish($msg, '', 'durable_queue'); echo " [x] Sent '$data'\n"; //close the channel and connection;
$channel->close();
$connection->close();
receive.php
<?php
/**
* receive.php
* Created by PhpStorm.
* User: wangdaxi
* Date: 2017/10/18
* Time: 14:34
*/
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection; $connection = new AMQPStreamConnection('127.0.0.1', 5672, 'guest', 'guest');
$channel = $connection->channel(); $channel->queue_declare('durable_queue', false, true, false, false);
echo ' [*] Waiting for messages. To exit press CTRL+C', "\n"; $callback = function($msg) {
echo "[x] Received ", $msg->body, "\n";
sleep(substr_count($msg->body, '.'));
echo "[x] Done\n";
//消息确认
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};
$channel->basic_consume('durable_queue', '', false, false, false, false, $callback); while(count($channel->callbacks)) {
$channel->wait();
}
测试
1. php sender.php 这里开启了队列,并且发送了一条消息‘hello world’
2. sudo rabbitmqctl stop_app 关闭服务
3. sudo rabbitmqctl start_app 开启服务
4. php receive.php 开启消费者进程,发现能从队列【durable_queue】接收到消息。
以上。
RabbitMq初探——消息持久化的更多相关文章
- RabbitMQ(三):消息持久化策略
原文:RabbitMQ(三):消息持久化策略 一.前言 在正常的服务器运行过程中,时常会面临服务器宕机重启的情况,那么我们的消息此时会如何呢?很不幸的事情就是,我们的消息可能会消失,这肯定不是我们希望 ...
- RabbitMq初探——消息均发
消息均发 前言 由前文 RabbitMq初探——消息分发 可知,rabbitmq自带分发机制——消息会按顺序的投放到该队列下的多个消费者,例如1,3,5投放消费者C1,2,4,6投放消费者C2. 这就 ...
- 【python】-- RabbitMQ 队列消息持久化、消息公平分发
RabbitMQ 队列消息持久化 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时候服务器端宕机了,这个时候消息是否还在? 1.队列消息非持久化 服务端(produc ...
- RabbitMQ的消息持久化处理
1.RabbitMQ的消息持久化处理,消息的可靠性是 RabbitMQ 的一大特色,那么 RabbitMQ 是如何保证消息可靠性的呢——消息持久化. 2.autoDelete属性的理解. 1).@Qu ...
- RabbitMQ 的消息持久化与 Spring AMQP 的实现剖析
文章目录 1. 原生的实现方式 2. Spring AMQP 的实现方式 要从奔溃的 RabbitMQ 中恢复的消息,我们需要做消息持久化.如果消息要从 RabbitMQ 奔溃中恢复,那么必须满足 ...
- RabbitMQ之消息持久化(转)
原文地址 https://blog.csdn.net/u013256816/article/details/60875666/ 消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证 ...
- RabbitMQ之消息持久化
消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化. 为了保证RabbitMQ在退出或者crash等异常情况下数据没有丢失,需要将queue,exch ...
- RabbitMq初探——消息确认
消息确认机制 前言 消息队列的下游,业务逻辑可能复杂,处理任务可能花费很长时间.若在一条消息到达它的下游,任务刚处理了一半,由于不确定因素,下游的任务处理进程 被kill掉啦,导致任务无法执行完成.而 ...
- RabbitMq初探——消息分发
消息分发 前言 我们在用到消息队列的场景,一般是处理逻辑复杂,耗时,所以将同步改为异步处理,接入队列,下游处理耗时任务. 队列消息数量很大,且下游worker进程(消费者)处理耗时长,所以就有了任务的 ...
随机推荐
- Supervisor安装与配置
Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...
- Selenium Webdriver——去哪儿网输入实例
1.对出发地方和到达地方进行Xpath定位,这里采用了Xpath的text() 函数进行定位 用following::sibling选择当前元素后的兄弟元素,比如出发框的Xpath表达式如下: .// ...
- UNITY 复制对象后局部坐标和世界坐标的变化问题
void Start () { var pgo = transform.Find ("Button").gameObject; obtn = Instantiate (pgo); ...
- hadoop之HDFS学习笔记(一)
主要内容:hdfs的整体运行机制,DATANODE存储文件块的观察,hdfs集群的搭建与配置,hdfs命令行客户端常见命令:业务系统中日志生成机制,HDFS的java客户端api基本使用. 1.什么是 ...
- fixed语句
[fixed语句] fixed 语句禁止垃圾回收器重定位可移动的变量.fixed 语句只能出现在不安全的上下文中.Fixed 还可用于创建固定大小的缓冲区. fixed 语句设置指向托管变量的指针,并 ...
- 隐藏Android下的虚拟按键
要隐藏Android下的虚拟按键,可通过如下办法操作 adb root adb remount adb shell ls -al /system/build.prop (查看文件权限) -rw-r ...
- Search Quick Union Find(图的存储结构)
Quick Find:适用于search频繁的情况 每个节点有一个id值,id相同表示两个节点相连通.在union时要将等于某一个id值都改成另一个id值 Quick Union: 适用于union频 ...
- 使用ES(elasticsearch) 搜索引擎
介绍 https://blog.csdn.net/andyzhaojianhui/article/details/75195296 创建语句 { "company":{ &quo ...
- Halcon中缩放Region或XLD的方法研究
在Halcon中,Region和XLD之间可以彼此转换.但这种转换并不是“无损”的,XLD可以是不闭合的,但是Region一定是闭合的.因此,如果将不闭合的XLD转为Region,然后再转回XLD,那 ...
- equals()方法左右变量的位置
题:一个变量,一个常量,用equals()方法比较,让咱们,看看到底是常量放前面好啊,还是变量放前面好 ------------------------------------------------ ...