一.分析下分布式强⼀致性、弱⼀致性、最终⼀致性?
分布式一致性是分布式系统中一个重要的概念,它主要关注多个服务节点在给定一系列操作后,如何对处理结果达成某种程度的一致。从分布式集群对外表现出的宏观特性来看,或者从Client的角度来看,可以把分布式系统的一致性分为强一致性和弱一致性。而最终一致性则是弱一致性的一种特殊形式。下面将详细分析这三种一致性。
1. 强⼀致性
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对⽤户最友好的,就是⽤户上⼀次
写什么,下⼀次就保证能读到什么。根据 CAP 理论,这种实现需要牺牲可⽤性。
2. 弱⼀致性:
系统并不保证续进程或者线程的访问都会返回最新的更新过的值。系统在数据写⼊成功之后,不承诺⽴即可以读到最新写⼊的
值,也不会具体的承诺多久之后可以读到。
3. 最终⼀致性:
弱⼀致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上⼀次更新操作的值。在没有故障发⽣的前提下,不⼀
致窗⼝的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS 是⼀个典型的最终⼀致性系统。
二.dubbo与zookeeper 两者作为注册中⼼的区别,假如注册中⼼挂了,消费者还能调⽤服务吗,⽤什么调⽤的
Dubbo与Zookeeper作为注册中心,各自具有其独特的特点和应用场景。以下是它们之间的一些主要区别:
Dubbo是一个高性能、轻量级的开源Java RPC框架,用于构建高效、可靠的分布式应用。它提供了服务注册与发现、负载均衡、容错等功能。而Zookeeper是一个分布式协调服务,主要用于存储和管理分布式应用中的元数据、配置信息、分布式锁等。它也可以作为Dubbo的注册中心,提供服务的注册与发现功能。
关于注册中心挂掉后消费者是否还能调用服务的问题,答案取决于Dubbo的配置和部署方式。如果Dubbo配置了本地缓存或者持久化存储,即使注册中心挂掉,消费者仍然可以从本地缓存或持久化存储中获取服务提供者的信息,从而进行调用。此外,如果Dubbo采用了集群部署方式,那么即使某个注册中心节点挂掉,其他节点仍然可以提供服务,从而保证服务的可用性。
在注册中心挂掉的情况下,消费者调用服务的方式主要取决于Dubbo的配置和策略。Dubbo支持多种容错和负载均衡策略,如Failover(失败重试)、Failfast(快速失败)等。当注册中心不可用时,Dubbo会根据配置的策略来决定如何调用服务。例如,如果配置了Failover策略,当调用失败时,Dubbo会自动尝试调用其他可用的服务提供者。
1. 注册中⼼对等集群,任意⼀台宕掉后,会⾃动切换到另⼀台
2. 注册中⼼全部宕掉,服务提供者和消费者仍可以通过本地缓存通讯
3. 服务提供者⽆状态,任⼀台 宕机后,不影响使⽤
4. 服务提供者全部宕机,服务消费者会⽆法使⽤,并⽆限次重连等待服务者恢复
三.项⽬中有没有⽤到多线程?
1、发送邮件、短信,使⽤多线程异步发送;
2、定时任务使⽤线程池;
四.分布式session ,如何保持⼀致
1、Session粘滞
1、将⽤户的每次请求都通过某种⽅法强制分发到某⼀个Web服务器上,只要这个Web服务器上存储了对应Session数据,就可以
实现会话跟踪。
2、优点:使⽤简单,没有额外开销。
3、缺点:⼀旦某个Web服务器重启或宕机,相对应的Session数据将会丢失,⽽且需要依赖负载均衡机制。
4、适⽤场景:对稳定性要求不是很⾼的业务情景。
2、Session集中管理
1、在单独的服务器或服务器集群上使⽤缓存技术,如Redis存储Session数据,集中管理所有的Session,所有的Web服务器都从
这个存储介质中存取对应的Session,实现Session共享。
2、优点:可靠性⾼,减少Web服务器的资源开销。
3、缺点:实现上有些复杂,配置较多。
4、适⽤场景:Web服务器较多、要求⾼可⽤性的情况。
5、可⽤⽅案:开源⽅案Spring Session,也可以⾃⼰实现,主要是重写HttpServletRequestWrapper中的getSession⽅法,博主
也动⼿写了⼀个,github搜索joincat⽤户,然后⾃取。
3、基于Cookie管理
1、这种⽅式每次发起请求的时候都需要将Session数据放到Cookie中传递给服务端。
2、优点:不需要依赖额外外部存储,不需要额外配置。
3、缺点:不安全,易被盗取或篡改;Cookie数量和⻓度有限制,需要消耗更多⽹络带宽。
4、适⽤场景:数据不重要、不敏感且数据量⼩的情况。
总结
这四种⽅式,相对来说,Session集中管理更加可靠,使⽤也是最多的。
五.说说⼏种GC机制?
1. 引⽤计数法(没有被java采⽤):
a. 原理:对于⼀个对象A,只要有任何⼀个对象引⽤了A,则A的引⽤计数器就加1,当引⽤失效时,引⽤计数器就减1,只要对象A的引⽤计数器的值为0,则对象A就会被回收。
b. 问题:
i. 引⽤和去引⽤伴随加法和减法,影响性能;
ii. 很难处理循环引⽤。
2. 标记清除法:
a. 原理:现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。⼀种可⾏的实现是,在标记节点,⾸先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引⽤的垃圾对象。
然后在清除阶段,清除所有未被标记的对象。
b. 问题:
i. 标记和清除两个过程效率不⾼,产⽣内存碎⽚导致需要分配较⼤对象时⽆法找到⾜够的连续内存⽽需要触发⼀次GC操作。
3. 标记压缩法:
a. 原理:适合⽤于存活对象较多的场合,如⽼年代。它在标记-清除算法的基础上做了⼀些优化。标记阶段⼀样,但之后,将所有存活对象压缩到内存的⼀端。之后,清除边界外所有的空间。
b. 优点:
i. 解决了标记- 清除算法导致的内存碎⽚问题和在存活率较⾼时复制算法效率低的问题。
4. 复制算法:
a. 原理:将原有的内存空间分为两块,每次只使⽤其中⼀块,在垃圾回收时,将正在使⽤的内存中的存活对象复制到未使⽤的内存块中,之后清除正在使⽤的内存块中的所有对象,交换两个内存的⻆⾊,完成垃圾回收。
b. 问题:
i. 不适⽤于存活对象⽐较多的场合,如⽼年代。
5. 分代回收法:
a. 原理:根据对象存活周期的不同将内存划分为⼏块,⼀般是新⽣代和⽼年代,新⽣代基本采⽤复制算法,⽼年代采⽤标记整理算法。