代码编织梦想

MQ的持久化分为三个部分:

一、Exchange(交换机持久化)

MQ做为消息中间件,主要用在程序间通信。使用spring集成rabbitmq后,在xml配置文件,可以很方便的设置是否持久化,代码如下:

其中 durable=true表示持久化,默认就是true,不配置这个参数也一样。

二、queue(队列持久化)

----2017.11.13日 补充持久化工作机制

让我们再来看一下持久化是如何工作的?

Rabbitmq会记录四种类型的内部元数据:

队列元数据:队列名称、属性(是否持久化、是否自动删除)

交换机元数据:交换机名称、类型(direct、fanout、topic)、属性(是否持久化)

绑定元数据:一张记录了交换机和队列绑定关系,和路由规则的表格

vhost元数据:为vhost内的队列、交换机和绑定提供命名空间和安全属性

上面的元数据默认保存在内存中,当我们把queue和Exchange设置成持久化后,将会保存到磁盘上,Rabbitmq重启后读取以上元数据,自动创建并绑定到一起。

文件存储位置:

rabbitmq_server-3.6.10/var/lib/rabbitmq/mnesia/rabbit@localhost

Rabbitmq目录下面的var文件夹,localhost是的主机名,mnesia是内建在Erlang的非SQL型数据库。

be7b5f562df5903364dd123559823a1c.png

------

三、消息持久化

做到上面两步就真的持久化了吗?消息在server中间传递的时候断电,重启后Exchange和queue还在,那条消息还在吗?MQ会重新发送吗?

b0f880055b08dad6faf2fba5ef3eb8fc.png

在《rabbitmq实战》一书中讲到消息持久化的问题,只有将消息也设置成持久化才是真正的持久化。

让我们查看源码:

消息Message有一个MessageProperties属性, MessageProperties指定了消息的发送模式,这里的MessageDeliveryMode.PERSISTENT表示持久化的意思:

public class MessageProperties implements Serializable {

static final String DEFAULT_CONTENT_TYPE = CONTENT_TYPE_BYTES;

static final MessageDeliveryMode DEFAULT_DELIVERY_MODE = MessageDeliveryMode.PERSISTENT;//默认消息是持久化

大功告成,让我们测试一下吧!

下面是java代码,使用了spring整合后的rabbitTemplate

public class PublishStart {

private static final Logger log = LoggerFactory.getLogger(PublishStart.class);

public static void main(String[] args) {

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-publish-rabbitMQ.xml");

RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);

rabbitTemplate.convertAndSend("< publish message 内容为:" + new Date().toString() + " >");

2017-11-05 22:03:14,843 [main]

[org.springframework.amqp.rabbit.core.RabbitTemplate]-[DEBUG]

Executing callback RabbitTemplate$$Lambda$4/1798219673 on RabbitMQ Channel: Cached Rabbit Channel:

AMQChannel(amqp://zcjlq@127.0.0.1:5672//vhostjlq,1), conn: Proxy@4e08711f Shared Rabbit Connection:

SimpleConnection@74e52ef6 [delegate=amqp://zcjlq@127.0.0.1:5672//vhostjlq, localPort= 57523]

2017-11-05 22:03:14,843 [main]

[org.springframework.amqp.rabbit.core.RabbitTemplate]-

[DEBUG] Publishing message

(Body:'< publish message 内容为:Sun Nov 05 22:03:14 CST 2017 >'

MessageProperties [headers={}, contentType=text/plain,

contentEncoding=UTF-8, contentLength=58, deliveryMode=PERSISTENT,

priority=0, deliveryTag=0])on exchange [AMC_TMP_EXCHANGE], routingKey = []

倒数第二行显示确实是持久化 deliveryMode=PERSISTENT

MQ持久化是将消息记录到磁盘,对性能有影响,但是一般情况下为了消息可靠允许性能损失。

还有一种情况是事务,但是事务对性能影响极大,大概降低2-10倍吞吐量,而且会使生产者应用程序产生同步,rabbitmq团队想到了另外一个方案:发送方确认模式,和事务类似。后面文章再做介绍。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32060671/article/details/113691653

rabbitmq的三种exchange,数据持久化,非持久化实例-爱代码爱编程

由于最近项目需要用到Rabbitmq的数据持久化技术,利用空闲时间,分别对Rabbitmq的三种常用的Exchange(direct、fanout、topic)写了个测试实例,仅供初学者参考学习,还望各路大神勿吐槽。 开发之前需要引用包:最好是3.4.0以下版本,因为以上版本试过,出现超时,具体原因尚未研究,还望研究过的大神留言告知一下,谢谢。

channel的基本使用_czj05的博客-爱代码爱编程

import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; i

理解卷积神经网络中的通道 channel_xys430381_1的博客-爱代码爱编程_channels

原文链接:https://blog.csdn.net/sscc_learning/article/details/79814146 在深度学习的算法学习中,都会提到 channels 这个概念。在一般的深度学习框架的 conv2d 中,如 tensorflow 、mxnet,channels 都是必填的一个参数。 channels 该如何理解?先看一看不

channel 通道查询_linuxk_常的博客-爱代码爱编程_channel://ltmhcps1001

  关闭selinux: 命令:#setenforce 0 命令:#sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config   关闭防火墙并取消开机启动: 命令 #systemctl stop firewalld && systemctl disable firew

rabbitmq持久化_iiaythi的博客-爱代码爱编程_rabbitmq持久化

rabbitmq持久化 持久化是为提高rabbitmq消息的可靠性,防止在异常情况(重启,关闭,宕机)下数据的丢失 rabbitmq持久化分为三个部分: 交换器的持久化、队列的持久化和消息的持久化 交换器的持

rabbitmq持久化_安心撸码的博客-爱代码爱编程

RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我个人觉得大多数开发人员都会选择持久化。 队列和交换机有一个创建时候指定的标志durable。durable的唯一含义就是具有这个标志的队列和交换机会在重启之后重新建立,它不表示说在队列当中的消息会在重启后恢复。 消息队列持久化包括3个部分 1、exchange持久化,在声明时

channel的解析和配置方法-爱代码爱编程

RMAN channel是指RMAN和数据库server session的连接。RMAN本身不会做备份还原操作,当我们连接RMAN的时候,RMAN会在目标数据库上分配server sessions。channel把数据读取到PGA,经过处理后写到设备中。大多数RMAN命令都是channels在执行。 在配置channel的时候,如果在次配置chan

channel使用法则-爱代码爱编程

Channel操作方式和状态 channel只有三种操作方式 ReadWriteClose有4种状态 nil打开且非空打开且空关闭的有三种类型 只写只读可读可写不同的操作对不同状态的channel产生的影响 操作方式Channel状态结果Readnil阻塞Read打开且非空输出值Read打开且空阻塞Read关闭的 falseRead只写编译错误W

RabbitMQ消息持久化的保证-爱代码爱编程

      作为消息,我们肯定是不希望在某个过程中它被丢掉找不到了,因此我们应该如何保证消息在传递过程中不会丢失也就成了我们需要解决的问题,既然要保证传递过程数据不丢失,那么我们就需要知道传递的过程有哪些,我们首先来看下消息从生产者到消费者的流转过程,如下面2张图         从上图可以看出生产者产生消息后,经过序列化后通过connection创

Channel 用法-爱代码爱编程

channel java的NIOchannel实现举个栗子 java的NIO 我们知道java的流是单向的,可读可写类似于channel里的通道, 1、区别在于流是半双工,通道是全双工 2、通道读写要buffer channel实现 FileChannel 从文件中读写数据 DatagramChannel UDP读写网络中数据 Soc

rabbitmq mysql持久化_RabbitMQ消息持久化-爱代码爱编程

一、前言 如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。 二、队列持久化 2.1 查看存在的队列和消息数量 在windows环境下,在rabbit

rabbitmq mysql持久化_RabbitMQ如何持久化?-爱代码爱编程

消息什么时候需要持久化? 根据消息本身在publish的时候就要求消息写入磁盘; 内存紧张,需要将部分内存中的消息转移到磁盘; 消息什么时候会刷到磁盘?写入文件前会有一个Buffer,大小为1M(1048576),数据在写入文件时,首先会写入到这个Buffer,如果Buffer已满,则会将Buffer写入到文件(未必刷到磁盘); 有个固定的刷盘

rabbitmq mysql持久化_RabbitMQ : 实现数据持久化(Persistent)-爱代码爱编程

注意:该文所使用的RabbitMQ客户端为RabbitMQ-C. 数据是否持久,即使在RabbitMQ-Server服务重启了,原来没有及时得到处理的数据依然能够保存下来,在服务重启之后,即可将原来的数据读到内存当中。 实现方式: 在生产者向RabbitMQ发送数据的时候,设置amqp_basic_publish函数接口调用中的amqp_basi

Go语言channel-爱代码爱编程

channel 单纯将函数并发是没有意义的.函数与函数间需要交换数据才能体现并发执行的意义. 共享内存进行数据交换会导致goroutine发生竞态问题.为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必会导致行呢个问题. Go语言的并发模型是CSP(Communicating Sequential Process),提倡通过通信共享

channel 的基本使用-爱代码爱编程

一 channel 的基本介绍 1 channle 本质就是一个队列。 2 数据是先进先出(FIFO : first in first out)。 3 线程安全,多 goroutine 访问时,不需要加锁,就是说 channel 本身就是线程安全的。 4 channel 是有类型的,一个 string 的 channel 只能存放 string 类

Channel基本介绍-爱代码爱编程

基本介绍 1.NIO的通道类(Channel)似于流,或者理解为一个连接,但有些区别如下 通道可以同时进行读写,而流只能读或者只能写通道可以实现异步读写数据通道可以从缓冲读数据,也可以写数据到缓冲:2.BIO 中的 stream 是单向的,例如 FileInputStream 对象只能进行读取数据的操作,而 NIO 中的通道(Channel)是双向的,