分布式系统幂等性与顺序性及分布式锁
分布式系统幂等性与顺序性及分布式锁分布式服务接口的幂等性如何设计什么是幂等性一个分布式系统中的某个接口,要保证幂等性,该如何保证?这个事儿其实是你做分布式系统的时候必须要考虑的一个生产环境的技术问题。啥意思呢?
你看,假如你有个服务提供一个接口,结果这服务部署在了5台机器上,接着有个接口就是付款接口。然后人家用户在前端上操作的时候,不知道为啥,总之就是一个订单不小心发起了两次支付请求,然后这俩请求分散在了这个服务部署的不同的机器上,好了,结果一个订单扣款扣两次?尴尬了。。。
或者是订单系统调用支付系统进行支付,结果不小心因为网络超时了,然后订单系统走了前面我们看到的那个重试机制,咔嚓给你重试了一把,好,支付系统收到一个支付请求两次,而且因为负载均衡算法落在了不同的机器上,尴尬了。。。
所以你肯定得知道这事儿,否则你做出来的分布式系统恐怕容易埋坑
网络问题很常见,100次请求,都ok;1万次,可能1次是超时会重试;10万,10次;100万,100次;如果有100个请求重复了,你没处理,导致订单扣款2次,100个订单都扣错了;每天被100个用户投诉;一个月被3000个用户投诉
我们之前生产 ...
分布式系统的面试连环炮
分布式系统的面试连环炮面试题
什么是分布式系统?
为什么要进行系统拆分?如何进行系统拆分?拆分后不用dubbo可以吗?dubbo和thrift有什么区别呢?
分布式服务框架
Dubbo的工作原理?
Dubbo支持哪些通信协议?
Dubbo负载均衡策略和集群容错策略?
Dubbo的SPI思想是什么?
什么是分布式系统现在互联网公司,一般都是做分布式的系统,大家都不是做底层的分布式系统,分布式存储系统,hadoop hdfs,分布式计算系统,hadoop mapreduce,spark,分布式流式计算系统,storm。
分布式业务系统,把原来用java开发的一个大块系统,给拆分成多个子系统,多个子系统之间互相调用,形成一个大系统的整体。假设原来你做了一个OA系统,里面包含了权限模块、员工模块、请假模块、财务模块,一个工程,里面包含了一堆模块,模块与模块之间会互相去调用,1台机器部署。
现在如果你把他这个系统给拆开,权限系统,员工系统,请假系统,财务系统,4个系统,4个工程,分别在4台机器上部署
一个请求过来,完成这个请求,这个员工系统,调用权限系统,调用请假系统,调用财务系统,4个系统分 ...
Redis的面试连环炮2
Redis集群模式面试题
Redis集群模式的工作原理?
在集群模式下,redis的key是如何寻址的?
分布式寻址都有哪些算法?
了解一致性Hash算法么?
如何应对缓存雪崩以及缓存穿透问题?
如何保证缓存与数据库双写时的数据一致性?
Redis的并发竞争问题是什么?怎么解决?
了解Redis事务的CAS方案?
剖析在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有。有一些redis中间件,你读写redis中间件,redis中间件负责将你的数据分布式存储在多台机器上的redis实例中。
这两年,redis不断在发展,redis也不断的有新的版本,redis cluster,redis集群模式,你可以做到在多台机器上,部署多个redis实例,每个实例存储一部分的数据,同时每个redis实例可以挂redis从实例,自动确保说,如果redis主实例挂了,会自动切换到redis从实例顶上来。
现在redis的新版本,大家都是用redis cluster的,也就是redis原生支持 ...
Redis的面试连环炮
Redis的面试连环炮面试题
Redis和Memcache有什么区别
Redis的线程模型是什么?
Redis的数据类型及应用场景?
为什么单线程的Redis比多线程的Memcache的效率要高?
为什么Redis是单线程但是还可以支撑高并发?
Redis如何通过读写分离来承受百万的QPS
Redis的持久化策略有哪些?AOF和RDB各有什么优缺点
Redis的过期策略以及LRU算法
如何保证Redis的高并发和高可用?
redis的主从复制原理能介绍一下么?
redis的哨兵原理能介绍一下么?
Redis主备切换的数据丢失问题:异步复制、集群脑裂
Redis哨兵的底层原理
剖析Redis最基本的一个内部原理和特点就是NIO异步的单线程工作模型。Memcache是早些年个大互联网公司常用的缓存方案,但是现在近几年都是使用的redis,没有什么公司使用Memcache了。
注意:Redis中单个Value的大小最大为512MB,redis的key和string类型value限制均为512MB
Redis和Memcache的区别从Redis作者给出的几个比较
Redis拥有更多的数据结 ...
MYSQL单路排序和双路排序
什么单路排序,什么是双路排序filesort 文件排序方式:
单路排序:是一次性取出满足行的全部字段,然后再内存中排序,然后返回结果。(占用内存更大,但是不需要回表)用trace工具可以看到sort_mode信息里显示< sort_key, additional_fields >或者<sort_key,packed_additional_fields >
双路排序:是先取出id、排序字段。在内存中排完序以后,再根据id去回表查出其他所需字段,然后返回结果。(占用内存更小,但需要回表)用trace工具可以看到sort_mode信息里显示<sort_key, rowid > MySQL 通过比较系统变量 max_length_for_sort_data(默认1024字节)的大小和需要查询的字段总大小来
判断使用哪种排序模式。如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模∙式。
我们先看单路排序的详细过程 ...
分布式缓存
分布式缓存在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?
为啥在项目里要用缓存?用缓存,主要是两个用途:高性能 和 高并发
高性能假设有这么个场景,有一个操作,一个请求过来,然后执行N条SQL语句,然后半天才查询出一个结果,耗时600ms,但是这个结果可能接下来几个小时就不会变了,或者变了也可以不用立即反馈给用户,这个时候就可以使用缓存了。
我们可以把花费了600ms查询出来的数据,丢进缓存中,一个key对应一个value,下次再有人来查询的时候,就不走mysql了,而是直接从缓存中读取,通过key直接查询出value,耗时2ms,性能提升300倍。这就是所谓的高性能。
就是把一些复杂操作耗时查询出来的结果,如果确定后面不怎么变化了,但是马上还有很多读请求,这个时候,就可以直接把结果存放在缓存中,后面直接读取缓存即可。
就第一次从数据库中获取,后面直接从缓存中获取即可,性能提升很高
高并发MySQL这么重的数据库,并不适合于高并发,虽然可以使用,但是天然支持的就不好,因为MySQL的单机撑到2000QPS的时候,就容易报警了
为什么缓存可以支持高并发首先因为缓存是走内存 ...
分布式搜索引擎的面试连环炮
分布式搜索引擎的面试连环炮业内目前来说事实上的一个标准,就是分布式搜索引擎一般大家都是用ElasticSearch,(原来的话使用的是Solr),但是确实,这两年大家一般都用更加易用的es。
ElasticSearch 和 Solr 底层都是基于Lucene,而Lucene的底层原理是 倒排索引
倒排索引是什么倒排索引适用于快速的全文检索,一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表
例如:
假设文档集合中包含五个文档,每个文档的内容如下所示,在图中最左端一栏是每个文档对应的编号,我们的任务就是对这个文档集合建立倒排索引
中文和英文等语言不通,单词之间没有明确
分割符号,所以首先要用分词系统将文档自动切分成单词序列,这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们就可以得到最简单的倒排索引了
索引系统还可以记录除此之外的更多信息,下图是记录了单词出现的频率(TF)即这个单词在文档中出现的次数,之所以要记录这个信息,是因为词频信息在搜索 ...
消息队列的面试连环炮
消息队列的面试连环炮前言
你用过消息队列么?
说说你们项目里是怎么用消息队列的?
我们有一个订单系统,订单系统会每次下一个新订单的时候,就会发送一条消息到ActiveMQ里面去,后台有一个库存系统,负责获取消息,然后更新库存。
为什么使用消息队列?
你的订单系统不发送消息到MQ,而是直接调用库存系统的一个接口,然后直接调用成功了,库存也更新了,那就不需要使用消息队列了呀
使用消息队列的主要作用是:异步、解耦、削峰
消息队列都有什么优缺点?
Kafka、activeMQ、RibbitMQ、RocketMQ都有什么优缺点?
如何保证消息队列的高可用?
如何保证消息不被重复消费?如何保证消息消费时的幂等性?
如何保证消息的可靠性传输,要是消息丢失了怎么办?
如何保证消息的顺序性?
如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
如果让你写一个消息队列,该如何进行架构设计,说一下你的思路?
面试官问的问题不是发散的,而是从点、铺开,比如先聊一聊高并发的话题,就这个话题里面继续聊聊缓存、MQ等等东西。对于每个小话题,比如说 ...
MySQL两阶段提交.md
两阶段提交的过程是怎样的?
从图中可看出,事务的提交过程有两个阶段,就是将redoLog的写入拆成了两个步骤:prepare和commit,中
间再穿插写入binlog,具体如下:
1:prepare阶段:将XID(内部XA事务的ID)写入到redo log buffer,同时将redo log对应的事务状态设置为prepare,然后将redo log持久化到磁盘(innodb_flush_log_at_trx_commit=1的作用);
2:commit阶段:把XID写入到binlog cache,然后将binlog持久化到磁盘(sync_binlog=1的作用),接着调用引擎的提交事务接口,将redo log状态设置为commit,此时该状态并不需要持久化到磁盘,只需要write到文件系统的page cache中就够了,因为只要binlog写磁盘成功,就算redo log的状态还是prepare也没有关系,一样会被认为事务已经执行成功;
为什么需要两阶段提交?如果只写一次的话,那到底先写bin-log还是redo-log呢?
先写bin-log,再写redo-l ...
大厂学苑之JUC并发编程与源码分析(下)
11. Java对象内存布局和对象头11.1 先从阿里及其它大厂面试题说起
你觉得目前面试,你还有那些方面理解的比较好,我没问到的,我说了juc和 jym以及同步锁机制
那先说juc吧,说下aqs的大致流程
CAS自旋锁,是获取不到锁就一直自旋吗? cas和synchronized区别在哪里,为什么cas好,具体优势在哪里,我说cas避免cpu切换线程的开销,又问我在自旋的这个线程能保证一直占用cpu吗?假如cpu放弃了这个线程,不是还要带来线程再次抢占cpu的开销?
synchronized底层如何实现的,实现向步的时候用到cas了吗?具体哪里用到了
我说上个问题的时候说到了对象头,问我对象头存储哪些信息,长度是多少位存储
Object object = new Object()谈谈你对这句话的理解?一般而言JDK8按照默认情况下,new一个对象占多少内存空间
位置所在 JVM里堆→新生区→伊甸园区
构成布局 头体?想想我们的HTML报文
Object object = new Object() 谈谈你对这句话的理解?
一般而言JDK8按照默认情况下,ne ...







