Java面试准备-分布式

简介: Java面试准备-分布式

分布式幂等性如何设计?


根据业务场景建立唯一索引、或者建立组合索引,这样防止产生脏数据

token机制:通过redis来实现防重复提交

悲观锁

乐观锁

分布式锁


简单描述一下HTTP请求的过程


DNS解析

HTTP请求,当输入一个请求时,会进行TCP3次握手

客户端向服务端发送请求命令(Post、Get)

客户端发送请求头信息

服务端向客户端发送数据

服务端关闭TCP连接

客户端渲染


说说你对分布式事务的了解


ACID:

A:原子性

C:一致性

I:隔离性

D:持久性

ACP:

A:一致性:同一时刻不同节点是否保持一致

C:可用性:在某一节点出现问题时,是否还可以对外提供服务

P:分区容错性:A和C必须保证一个

BASE理论:是对CAP理论的一个权衡结果,我们复发做到强一致性,但是每个应用可以根据自身的特点,采用适当的方式来达到最终一致性。


分布式事务解决方案


两阶段提交(2PC)

三阶段提交(3PC)

补偿事务(TCC)

本地消息队列

最终一致性


负载均衡有哪些算法


随机

轮询

加权轮询

最少连接

源地址hash


常见的限流算法


计数器

使用计数器在周期内累加访问次数,当达到设定的限流值,触发限流策略,下一个周期开始时从新开始计数。(在单机或者分布式情况下,可以采用redis的incr原子自增操作来实现)。零界点问题。

滑动窗口

将时间分成很多个小周期,分别记录每个小周期内访问次数,并且根据时间滑动删除过期的小周期。

漏桶算法

访问请求到来时,直接放入漏桶,如当前容量已达到上限,则直接进行丢弃。

令牌桶算法

是以固定的算法(r=时间周期/限流值)的速度向令牌桶中加入令牌,直到令牌桶满,请求到达时向令牌桶获取令牌,获取成功则继续执行,获取失败则触发限流策略。


数据库如何处理海量数据


对数据库进行:分库分表、主从架构、读写分离。


如何提高系统的并发能力?


使用分布式服务器

部署多台服务器,做负载均衡

数据库分库分表、读写分离

引入业务需要的中间件


关于分布式事务


参考资料

https://blog.51cto.com/u_15499328/5159840?b=totalstatistic

2PC 二阶段提交

二阶段提交是一种强一致设计,2PC引入一个协调者来管理各个参与者的提交和回滚,二阶段分别是指准备和提交两个阶段。

它是同步阻塞的,而且同步阻塞长时间会导致资源锁的问题,总体而言效率低,并且存在单点故障,在极端条件下存在数据不一致问题。

2PC适应于数据库层面分布式事务应用场景。

3PC 三阶段提交

参与者也引入超时机制,并且新增了一个阶段使得参与者利用这一阶段统一各自的状态

3PC:准备阶段、预提交阶段、提交阶段。多引入一个阶段也会多一些交互,因此 性能会差一些。引入参与者超时机制。

2PC、3PC都是数据库层面的。

TCC(Try - Confirm - Cancel)

2PC 和 3PC 都是数据库层面的、而TCC是业务层面的分布式事务。

Try:预留、资源的预留和锁定

Confirm:确认操作,真正的执行

Cancel:撤销操作,把预留阶段的操作取消掉

其实思想上和2PC都差不多,都是先试探性执行,如果都可以那就真正执行,如果不行就回滚。

TCC对业务侵入较大,与业务紧耦合,需根据特定的业务场景来设计,

撤销和确认操作可能需要重试,要保证接口的幂等性。

TCC需要自定义,可实现跨数据库、跨不同业务系统来实现事务。

本地消息表

利用各个系统的本地事务来实现分布式事务。

有一张存放本地消息表,一般都放在数据库中,然后在执行业务的时候,将业务的执行和消息放入消息表放在同一个事务中,这样就能保证消息放入本地表中业务肯定是执行成功的。

如果调用失败,会有 定时任务定时读取本地消息表,实现最终一致性。

消息事务

RocketMQ 支持消息事务

第一步通过发送半消息,这个消息对于消费者来说不可见,然后发送成功后再执行本地事务。

再根据本地事务向broker发送Commit还是RollBack命令

并且RocketMq会提供反查事务状态接口,

RocketMq也是通过最终一致性来实现的。

最大努力通知

最大努力通知其实表示就是柔性事务的思想:我已经尽最大努力想达成事务的最终一致性。适用于对时间不敏感的业务,如短信通知等。


秒杀系统如何设计


秒杀服务子系统

就算秒杀系统挂了,不影响其他服务,【服务降价】

页面静态化

活动页面是流量第一入口,活动页面大都是固定的:商品名称、描述、图片等。为了减少不必要的服务端请求,页面会做静态化处理,用户常规浏览SKU的时候不会请求服务端。

静态化CND,内容分发网络。

前端处理

前端加一个定时器:比如5s之内只能发送一次服务端请求,然后秒杀按钮置灰。等限制时间过了又可以继续点击。

数据库读多写少

大部分查询走 Redis

缓存问题 Redis集群

通常情况下,我们需要在Redis中存商品信息,里面包含:商品编码、商品名称、商品属性、商品库存等信息。

优先查询缓存中数据是否存在,不存在再查询数据库。【缓存预热】

不存在的商品直接缓存为空,下次来查询直接用,缓存穿透问题。

数据库库存扣减问题

可以通过乐观锁解决

Redis lua 脚本扣减库存

先判断商品是否存在、如果不存在则直接返回

获取sku库存信息

如果库存大于0,则进行库存扣减

如果库存等于0,则直接返回表示库存不足

mq异步处理

消息丢失问题:本地记录消息表,本地记录成功再发送mq队列,有失败的消息通过job机制

延迟消息队列:订单超时取消。

限流

基于Nginx限流、基于Redis限流

基于用户限流、基于IP限流。

加验证码限流:三方验证码-滑块验证码。

基于业务限流:会员体系,限制条件。

相关文章
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
732 1
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
505 3
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
715 0
|
11月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
6541 50
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
543 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
11月前
|
算法 Java
50道java基础面试题
50道java基础面试题
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
1078 9
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
415 5

热门文章

最新文章