数据持久化

如何保证消息的可靠性传输(如何处理消息丢失的问题)

送分小仙女□ 提交于 2019-12-04 04:12:53
我们在使用MQ的时候有个原则:数据不能多一条,不能少一条,不能多就是不能重复消费以及幂等性问题。不能少,就是说这数据不能搞丢。 如果说我们是用mq来传递非常核心的消息,比如说计费扣费的一些消息,计费系统是很重要的一个业务,操作很耗时。实际上我们将计费系统做成异步化,然后中间就是加一个MQ。 以下是消息丢失的一些分析: 这个丢失数据,mq一般分为两种,要么是mq自己弄丢的,要么是我们消费的时候弄丢了。 rabbitmq这种mq,一般来说都是承载公司的核心业务的,数据是绝对不能弄丢的。 1.rabbitmq (1)生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能。 此时选择用rabbitmq提供的事务功能,就是生产者发送数据之前开启rabbitmq事务,然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会收到异常报错,此时就可以回滚事务,然后重试发送消息;如果收到了消息,那么可以提供事务。但是问题是,rabbitmq事务机制一搞,基本上吞吐量会下来,因为太耗性能。 所以一般来说。如果我们要确保说写rabbitmq的消息别丢,可以开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息

如何保证消息队列的可靠性传输?

血红的双手。 提交于 2019-12-04 04:05:14
面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是 数据不能多一条,也不能少一条 ,不能多,就是前面说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。 如果说你这个是用 MQ 来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这个 MQ 传递过程中 绝对不会把计费消息给弄丢 。 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,咱们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 此时可以选择用 RabbitMQ 提供的事务功能,就是生产者 发送数据之前 开启 RabbitMQ 事务 channel.txSelect ,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务 channel.txRollback ,然后重试发送消息;如果收到了消息,那么可以提交事务 channel.txCommit 。 // 开启事务 channel.txSelect try { // 这里发送消息 } catch (Exception e) { channel

消息中间件面试题:消息丢失怎么办?

♀尐吖头ヾ 提交于 2019-12-04 04:04:01
面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 如果说你这个是用 MQ 来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这个 MQ 传递过程中 绝对不会把计费消息给弄丢 。 消息中间件各种面试题: 消息中间件面试题:消息丢失怎么办? 消息中间件面试题:消息队列的优缺点,区别 消息中间件面试题:消息中间件的高可用 消息中间件面试题:如何保证消息的顺序性 消息中间件面试题:如何保证消息不被重复消费 消息中间件面试题:如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时呢? 消息中间件面试题:如果让你写一个消息队列,该如何进行架构设计? 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,咱们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 此时可以选择用 RabbitMQ 提供的事务功能,就是生产者 发送数据之前 开启 RabbitMQ 事务 channel.txSelect ,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务 channel.txRollback ,然后重试发送消息;如果收到了消息

如何保证消息的可靠性传输

孤街浪徒 提交于 2019-12-04 04:03:41
如何保证消息的可靠性传输 面试题引入 面试题剖析 RabbitMQ Kafka 面试题引入 如何保证消息的可靠性传输?其实就是在问你,如何保证消息不丢失。用消息有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前文说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,我们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据   生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题什么的,都有可能。   此时可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit。 // 开启事务 channel . txSelect try { // 这里发送消息 } catch ( Exception e ) { channel . txRollback // 这里再次重发这条消息 } // 提交事务 channel .

可持久化平衡树详解及实现方法分析

馋奶兔 提交于 2019-12-04 00:25:01
目录 前置要求 核心思想 实现方法比较:指针 与 数组模拟指针 Merge 是否应该新建节点 参考程序 前置要求 带旋转的平衡树会改变祖先关系,这令可持久化变得困难。所以需要使用非旋的平衡树,如 非旋treap 。本文以非旋treap为例。 核心思想 可持久化的数据结构,其核心都是不改变历史的信息。当需要对信息进行修改的时候就新开一个节点,继承历史信息,然后再进行修改。 对于非旋treap来说,主要是对 Split 和 Merge 两个操作进行可持久化。剩下的操作不会对数据产生影响。而考虑到非旋treap上的操作在 Split 后一定跟随着对应的 Merge ,所以不需要对每个 Split 和 Merge 操作都进行可持久化。只要实现 Insert 和 Delete 的可持久化即可。 Split Split 操作的可持久化比较容易实现,直接复制节点即可: std::pair<int, int> Split(int Root, int Key) { if (!Root) return std::pair<int, int>(0, 0); std::pair<int, int> Temp; int New = ++Used; Pool[New] = Pool[Root]; if (Key < Pool[New].Value) { Temp = Split(Pool[New]

【03】Redis for OPS:数据安全与持久化

若如初见. 提交于 2019-12-03 23:02:17
写在前面的话 通过前两节,除了安装部分,其它的更多的是作为了解,除非我们面向实际的开发,当然知道更多总是好的,这样才有吹牛逼的资本。 从本节开始我们主要谈谈作为一个运维,在处理 Redis 的维护的时候应该注意哪些方面。 数据持久化 在说持久化之前我们需要了解,Redis 之所以快,原因在于它的数据默认存储在内存中,内存的读写速度相较于 MySQL 这类关系型数据库从硬盘读取肯定是快了不知道多少倍。但同时也存在一个问题,服务器宕机,服务挂掉都会使得内存中的数据丢失,如果只是 Session 类的数据还好,但真正用起 Redis 的肯定不只是存 Session 这么简单,这里面肯定会包含一部分不那么重要,但是又不能缺少的数据。 那如何保证该部分数据在服务器宕机或者服务挂掉的时候尽可能的保证数据不丢失,归根结底,还是需要将数据刷写到磁盘。所以便有了数据的持久化。 Redis 为我们提供了两种数据持久化的方法: RDB 和 AOF RDB : 能在指定的时间间隔将数据刷写到磁盘,生成快照。 优点在于快,适合当做备份,主从复制就是基于 RDB 实现。缺点在于很难保证数据的完整性,在宕机和持久化之间可能会缺失一点数据。 配置方法,在 redis.conf 中加入如下配置: # 快照保存名字 dbfilename dump-6379.rdb # 快照保存目录 dir "/data

redis 数据库总结

橙三吉。 提交于 2019-12-03 20:35:02
简单来说 Redis 就是一个数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的,所以存写速度非常快,因此 Redis 被广泛应用于缓存方向。 另外, Redis 也经常用来做分布式锁。 Redis 提供了多种数据类型来支持不同的业务场景。 除此之外, Redis 支持事务 、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。 本文将从以下几个方面全面解读 Redis: 为什么要用 Redis / 为什么要用缓存 为什么要用 Redis 而不用 map/guava 做缓存 Redis 和 Memcached 的区别 Redis 常见数据结构以及使用场景分析 Redis 设置过期时间 Redis 内存淘汰机制 Redis 持久化机制(怎么保证 Redis 挂掉之后再重启数据可以进行恢复) Redis 事务 缓存雪崩和缓存穿透问题解决方案 如何解决 Redis 的并发竞争 Key 问题 如何保证缓存与数据库双写时的数据一致性 为什么要用 Redis / 为什么要用缓存? 主要从“高性能”和“高并发”这两点来看待这个问题。 高性能 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。 将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。 操作缓存就是直接操作内存,所以速度相当快

Hibernate 的三种状态 持久化 游离 临时 的关系

旧城冷巷雨未停 提交于 2019-12-03 18:27:09
临时(Transient) - 由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为临时(Transient)的。临时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。 如果临时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。 使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句) 持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。 游离(Detached) - 与持久(Persistent

redis持久化

不想你离开。 提交于 2019-12-03 17:16:35
redis的 rdb 和 aof 持久化的区别 url: http://ptc.35.com/?p=275 aof,rdb是两种 redis持久化的机制。用于crash后,redis的恢复。 rdb的特性如下: Code: fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。 save, shutdown, slave 命令会触发这个操作。 粒度比较大,如果save, shutdown, slave 之前crash了,则中间的操作没办法恢复。 aof有如下特性: Code: 把写操作指令,持续的写到一个类似日志文件里。(类似于从postgresql等数据库导出sql一样,只记录写操作) 粒度较小,crash之后,只有crash之前没有来得及做日志的操作没办法恢复。 两种区别就是,一个是持续的用日志记录写操作,crash后利用日志恢复;一个是平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。 选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。 redis的 RDB 和 AOF 持久化的区别

redis面试题及答案

谁说我不能喝 提交于 2019-12-03 13:57:08
1. Redis有哪些数据结构? 2. 使用过Redis分布式锁么,它是什么回事? 3. 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 4. 如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题? 5. 使用过Redis做异步队列么,你是怎么用的? 6. 如果对方追问redis如何实现延时队列? 7. 如果有大量的key需要设置同一时间过期,一般需要注意什么 8. Redis如何做持久化的? 9. Pipeline有什么好处,为什么要用pipeline? 10. Redis的同步机制了解么? 11. 是否使用过Redis集群,集群的原理是什么? 12. 使用redis有哪些好处? 13. redis相比memcached有哪些优势? 14. Memcache与Redis的区别都有哪些? 15. redis常见性能问题和解决方案: 16. 为什么redis需要把所有数据放到内存中? 17. Redis是单进程单线程的 18. redis的并发竞争问题如何解决? 19. redis事物的了解CAS(check-and-set 操作实现乐观锁 )? 20. redis持久化的几种方式 21. redis 最适合的场景 一、Redis有哪些数据结构? 字符串String、字典Hash、列表List