当前位置: 首页 > news >正文

Java技术栈/面试题合集(19)-架构设计篇

场景

Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享:

Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享_java高级进阶-CSDN博客

通过对面试题进行系统的复习可以对Java体系的知识点进行查漏补缺。

合集明细列表

Java技术栈/面试题合集(1)-Java基础篇:

Java技术栈/面试题合集(1)-Java基础篇-CSDN博客

Java技术栈/面试题合集(2)-Java集合篇:

Java技术栈/面试题合集(2)-Java集合篇-CSDN博客

Java技术栈/面试题合集(3)-Java并发篇:

Java技术栈/面试题合集(3)-Java并发篇-CSDN博客 

Java技术栈/面试题合集(4)-Spring篇:

Java技术栈/面试题合集(4)-Spring篇-CSDN博客

Java技术栈/面试题合集(5)-SpringBoot篇:

Java技术栈/面试题合集(5)-SpringBoot篇-CSDN博客

Java技术栈/面试题合集(6)-Mybatis篇:

Java技术栈/面试题合集(6)-Mybatis篇-CSDN博客

Java技术栈/面试题合集(7)-Mysql篇:

 Java技术栈/面试题合集(7)-Mysql篇-CSDN博客

Java技术栈/面试题合集(8)-Redis篇:

Java技术栈/面试题合集(8)-Redis篇-CSDN博客

Java技术栈/面试题合集(9)-Nginx篇-part1:

Java技术栈/面试题合集(11)-设计模式篇-CSDN博客

Java技术栈/面试题合集(10)-Nginx篇-part2:

Java技术栈/面试题合集(10)-Nginx篇-part2-CSDN博客

Java技术栈/面试题合集(11)-设计模式篇:

Java技术栈/面试题合集(11)-设计模式篇-CSDN博客

Java技术栈/面试题合集(12)-Maven篇:

Java技术栈/面试题合集(12)-Maven篇-CSDN博客

Java技术栈/面试题合集(13)-网络篇:

Java技术栈/面试题合集(13)-网络篇-CSDN博客

Java技术栈/面试题合集(14)-Linux篇:

Java技术栈/面试题合集(14)-Linux篇-CSDN博客

Java技术栈/面试题合集(15)-RabbitMQ篇:

Java技术栈/面试题合集(15)-RabbitMQ篇-CSDN博客

Java技术栈/面试题合集(16)-SpringCloud篇:

Java技术栈/面试题合集(16)-SpringCloud篇-CSDN博客

Java技术栈/面试题合集(17)-Git篇:

Java技术栈/面试题合集(17)-Git篇-CSDN博客

Java技术栈/面试题合集(18)-数据结构与算法篇:

Java技术栈/面试题合集(18)-数据结构与算法篇-CSDN博客

更多合集文章持续更新中。。。。。。。。。。

专栏合集地址:

https://blog.csdn.net/badao_liumang_qizhi/category_13021060.html

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi 

实现

Java架构设计:设计一个抽奖系统,奖品123,概率分别为1%,2%,3%,具体讲一下怎么设计?

一、核心需求分析

奖品配置:奖品1(1%)、奖品2(2%)、奖品3(3%)、未中奖(94%)。

公平性:概率需严格符合配置,避免人为干预。

高性能:支持高并发抽奖请求(如秒杀活动)。

二、架构设计(5大核心模块)

1. 奖品概率管理

数据结构:使用TreeMap或Alias Method算法实现加权随机

// 示例:TreeMap实现概率区间 
TreeMap<Double, Prize> prizeMap = new TreeMap<>(); 
prizeMap.put(0.01,  Prize1);  // 0~1% → 奖品1 
prizeMap.put(0.03,  Prize2);  // 1%~3% → 奖品2 
prizeMap.put(0.06,  Prize3);  // 3%~6% → 奖品3  

动态配置:通过数据库或配置中心实时调整概率。

2. 抽奖逻辑实现

算法选择:

普通场景:ThreadLocalRandom生成随机数,匹配概率区间。

高性能场景:预生成概率池(如Redis的RANDOMKEY)。

代码片段

public Prize draw() { double random = ThreadLocalRandom.current().nextDouble(1);  return prizeMap.ceilingEntry(random).getValue();  
}  

3. 库存与限流

库存控制:Redis原子操作扣减库存(DECR + Lua脚本)。

-- Redis Lua脚本示例 
if redis.call("GET",  "prize1_stock") > 0 then return redis.call("DECR",  "prize1_stock") 
else return -1 
end  

限流措施:Guava RateLimiter或Sentinel控制QPS。

4. 分布式事务

中奖记录处理:

本地事务 + 消息队列(RocketMQ事务消息)确保数据一致性。

异步落库,避免抽奖接口性能瓶颈。

5. 风控与日志

风控策略:

用户黑名单(Redis布隆过滤器)。

单日抽奖次数限制(INCR + EXPIRE)。

日志监控:ELK收集抽奖日志,实时监控中奖率偏差。

三、性能优化关键点

缓存预热:活动前将奖品概率加载到本地缓存。

无锁设计:使用LongAdder替代AtomicInteger统计抽奖次数。

异步化:抽奖与发奖逻辑解耦(MQ异步通知发货)。

Java架构设计:有一个用户提现 100 元,他的余额只有 100,如何在用户多次点击提现按钮的情况下,实现幂等?

一、问题核心分析

场景:用户余额100元,连续多次点击提现100元按钮,需保证:

仅成功扣款一次

重复请求返回相同结果

高并发下数据一致性

二、幂等性实现方案(5大核心策略)

1. 数据库唯一索引

实现逻辑:

提现记录表增加request_id字段(用户ID+业务单号),创建唯一索引

插入前检查是否存在相同request_id

代码示例

@Transactional 
public Result withdraw(Long userId, String requestId, BigDecimal amount) { // 检查是否已处理过该请求 if (withdrawRecordDao.existsByRequestId(requestId))  { return Result.success(" 重复请求,已处理"); } // 扣减余额(原子操作) int updated = accountDao.deductBalance(userId,  amount); if (updated == 0) { return Result.fail(" 余额不足"); } // 记录提现 withdrawRecordDao.insert(new  WithdrawRecord(userId, requestId, amount)); return Result.success(" 提现成功"); 
}  

优点:简单直接,依赖数据库约束

缺点:高频请求可能触发索引冲突

2. 分布式锁 + 状态机

实现逻辑:

使用Redis锁(SETNX key value EX 10)锁定用户ID

提现状态机:初始化 → 处理中 → 已完成

代码示例

public Result withdraw(Long userId, String requestId) { String lockKey = "withdraw:lock:" + userId; try { // 获取分布式锁(防止并发请求) boolean locked = redisTemplate.opsForValue()  .setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS); if (!locked) return Result.fail(" 操作频繁"); // 检查幂等记录 WithdrawRecord record = withdrawRecordDao.findByRequestId(requestId);  if (record != null) { return Result.success(record.getStatus());  // 返回历史结果 } // 扣款并记录状态 accountService.deductBalance(userId,  100); withdrawRecordDao.insert(new  WithdrawRecord(requestId, "已完成")); return Result.success(" 提现成功"); } finally { redisTemplate.delete(lockKey);  } 
}  

优点:避免数据库压力,支持高并发

缺点:需处理锁超时问题

3. 乐观锁(CAS机制)

实现逻辑:

账户表增加version字段

扣款时校验版本号

SQL示例

UPDATE account 
SET balance = balance - 100, version = version + 1 
WHERE user_id = ? AND version = ? AND balance > = 100  

优点:无锁竞争,性能较高

缺点:需重试机制处理版本冲突

4. 消息队列幂等

实现逻辑:

提现请求发送到RocketMQ,携带唯一msgId

消费者通过msgId去重处理

架构图:

用户请求 → MQ(幂等过滤) → 消费者(原子扣款) → 结果通知  

优点:天然解耦,支持流量削峰

缺点:系统复杂度增加

5. Token机制(前端配合)

实现逻辑:

前端提现页先获取服务端生成的token

提交请求时携带token,服务端校验后删除

流程示例

// 生成一次性token 
String token = UUID.randomUUID().toString();  
redisTemplate.opsForValue().set("withdraw:token:"  + userId, token, 5, TimeUnit.MINUTES); // 提现时校验 
String storedToken = redisTemplate.opsForValue().get("withdraw:token:"  + userId); 
if (!token.equals(storedToken))  { return Result.fail(" 无效请求"); 
} 
redisTemplate.delete("withdraw:token:"  + userId); // 删除已用token  

优点:彻底避免重复提交

缺点:依赖前端配合

Java架构设计:假如有个业务信息表,我要删除表前三个月state为0的数据,如何设计索引?

一、需求分析

操作类型:定期删除state=0且创建时间早于3个月的数据

性能目标:

删除效率高(避免全表扫描)

不影响高频查询性能

减少锁竞争

二、索引设计方案(3大核心策略)

1. 复合索引(优先推荐)

字段顺序:(state, create_time)

CREATE INDEX idx_state_createtime ON business_info(state, create_time);  

优势:

精准匹配state=0后,按时间范围快速定位(B+树最左前缀原则)

覆盖索引减少回表

删除SQL示例

DELETE FROM business_info 
WHERE state = 0  
AND create_time < DATE_SUB(NOW(), INTERVAL 3 MONTH);  

理由

按最优实践,复合索引应把等值查询的列放前面,范围查询的列放后面。

这样,数据库可以先快速定位所有 state=0 的数据,再在这些数据中按 create_time 判断是否早于三个月前,极大减少了扫描和对比的数据行数

2. 分区表 + 局部索引

适用场景:数据量超千万级

实现步骤:

按时间范围分区(每月一个分区)

每个分区单独建立state索引

3. 归档表 + 异步删除

架构流程:

业务表 → 触发器归档state=0数据 → 定时任务删除归档数据  

索引建议:

主表索引:(state)(保证查询性能)

归档表索引:(create_time)(加速删除)

优势:

避免主表大事务

可批量删除(LIMIT 5000)减少锁持有时间

Java架构设计:电商系统如何保证扣减库存高并发性能,又保证不会出现超卖问题?

一、核心挑战与设计目标

高并发性能:支持万级TPS的库存扣减请求(如秒杀场景)。

数据一致性:杜绝超卖(库存扣减后<0)和少卖(库存未及时释放)。

系统可用性:避免单点故障,保证99.99%的服务可用性。

二、技术方案(4大核心策略)

1. 分布式缓存 + 异步落库

架构流程

graph LR 
A[用户请求] --> B[Redis预扣减库存] 
B --> C{库存是否≥0?} 
C -->|是| D[写入MQ] 
C -->|否| E[返回库存不足] 
D --> F[消费者异步更新DB]  

关键实现:

Redis原子操作:使用DECRBY或Lua脚本保证原子性

补偿机制:定时任务比对Redis与DB库存差异,自动修正

2. 数据库乐观锁 + 分库分表

SQL优化

UPDATE item_stock 
SET stock = stock - 1, version = version + 1 
WHERE item_id = ? AND version = ? AND stock >= 1  

分库策略:

按商品ID哈希分片(如16个库,每个库256张表)

热点商品单独分片(如iPhone秒杀专用库)

3. 本地缓存 + 分布式限流

多级缓存:

JVM缓存(Caffeine) → Redis集群 → DB  

缓存预热:活动前加载热点商品库存到本地

限流保护:

Sentinel配置QPS阈值(如单商品5000/s)

令牌桶算法平滑处理突发流量

4. 事务消息 + 柔性事务

最终一致性保障:

扣减Redis库存后发送RocketMQ事务消息

消费者完成订单创建,再异步扣减DB库存

失败时通过反向流水恢复库存

Java架构设计:1G内存,如何快速判某个无符号整数是否在40亿数据中?

一、问题核心与挑战

数据规模:40亿无符号整数 ≈ 4×10⁹ × 4字节 ≈ 16GB内存(远超1G限制)

性能目标:O(1)时间复杂度完成存在性判断

内存限制:需设计空间效率极高的数据结构

二、解决方案(3大核心策略)

1. 布隆过滤器(Bloom Filter)

原理:

使用多个哈希函数将元素映射到位数组(BitSet)

存在性判断可能有假阳性(误报),但无假阴性(漏报)

内存计算:

假设误判率0.1%,需约 570MB内存(公式:n=4e9, p=0.001 → m=4.8e9 bits ≈ 572MB)

Java实现

import com.google.common.hash.BloomFilter;  
import com.google.common.hash.Funnels;  BloomFilter<Integer> filter = BloomFilter.create(  Funnels.integerFunnel(),  4_000_000_000L,  // 预期元素数量 0.001           // 误判率 
); // 添加数据 
filter.put(123456);  
// 判断存在性 
boolean mayExist = filter.mightContain(123456);  

2. 位图法(BitMap)

适用场景:数据范围可控(如整数范围≤2³²)

内存计算:

2³²位 ≈ 512MB内存(每位表示一个整数)

优化变种:

Roaring Bitmap:压缩稀疏位图,内存占用可低至100MB~1GB

Java实现

import org.roaringbitmap.RoaringBitmap;  
RoaringBitmap bitmap = new RoaringBitmap(); 
bitmap.add(123456L);  
boolean exists = bitmap.contains(123456L);  

3. 外部存储 + 分片索引

架构设计:

将40亿数据按哈希分片存储到磁盘(如10个文件,每文件4亿数据)

内存中维护分片索引(如哈希表记录每个分片的数值范围)

查询时先定位分片,再加载部分数据到内存二分查找

性能权衡:

内存占用:分片索引≈10MB,每次查询加载4MB数据

时间复杂度:O(log n)

Java架构设计:高并发系统该如何选择合适的限流模型?

一、限流核心目标

保护系统稳定性:避免突发流量击穿服务

资源公平分配:防止少数用户占用过多资源

优雅降级:超限请求快速失败,避免雪崩

二、主流限流模型对比与选型

1. 计数器算法(固定窗口)

原理:统计单位时间(如1秒)内请求数,超过阈值则拒绝。固定窗口指将时间轴划分为一段一段等长的区间(如每1秒为一个窗口)。

在每个窗口内,累计请求次数;只要计数未超过阈值就放行,当达到阈值后本窗口内其它请求就会被限流。

每当时间进入下一个窗口,计数重置为0

图示

实现

AtomicInteger counter = new AtomicInteger(0); 
boolean tryAcquire() { return counter.incrementAndGet()  <= 1000; // 每秒限流1000次 
}  

优点:简单高效,内存消耗低

缺点:窗口切换时可能产生双倍流量冲击

适用场景:对精度要求不高的简单限流(如API基础防护)

2. 滑动窗口算法

原理:

将时间窗口细分为多个子窗口(如1秒=10个100ms窗口),动态统计最近完整窗口的请求量。

滑动窗口将统计时间窗口再细分为多个更小的子窗口(如将1秒分10份,每100ms为一个子窗口),

时间轴上可“滑动”地累加最近一段时间内所有子窗口的请求总数。

每次请求时动态统计最近N个小窗口的总和,从而减少突刺,提高流控精准度。

图示

优化:

Redis + Lua实现分布式滑动窗口

优点:平滑流量,避免固定窗口的临界问题

缺点:内存占用较高(需存储子窗口计数)

适用场景:需要精确控制的API限流(如支付接口)

3. 漏桶算法(Leaky Bucket)

原理:请求以恒定速率处理(如每秒10次),超速请求排队或丢弃。所有请求先进入漏桶,漏桶按固定出水速率依次处理。进水速度>出水速率时,且漏桶满了,多余部分被溢出、丢弃。

图示

实现

RateLimiter limiter = RateLimiter.create(10.0);  // 每秒10个令牌 
if (limiter.tryAcquire())  { // 处理请求 
}  

优点:绝对流量整形,输出速率恒定

缺点:无法应对突发流量(即使系统有空闲资源)

适用场景:需要严格控制调用速率的场景(如第三方API调用)

4. 令牌桶算法(Token Bucket)

原理:

以固定速率生成令牌,请求需获取令牌才能执行。系统以恒定速率(如每秒N个)往桶中添加令牌。

当用户请求到来时,只有“抢到”令牌的请求才被处理,否则被丢弃或延迟。桶有最大容量,防止长期积累超发。

图示

实现

// Guava RateLimiter基于令牌桶 
RateLimiter limiter = RateLimiter.create(100,  1, TimeUnit.SECONDS); 
if (limiter.tryAcquire(1))  { // 尝试获取1个令牌 // 处理请求 
}  

优点:允许突发流量(消耗积累的令牌)

缺点:实现复杂度较高

适用场景:秒杀、抢购等允许短暂突发的业务

5. 自适应限流(Sentinel/AliQPS)

原理:基于系统负载(CPU、RT、线程池)动态调整阈值

策略:

冷启动:初期缓慢增加阈值,避免冷系统过载

匀速排队:超阈值请求排队等待,避免直接拒绝

适用场景:云原生环境或流量波动大的系统

6.Nginx/OpenResty限流

在“接入层”采用OpenResty、Nginx限流模块,配置简单,可前置保护全部接口。

自带limit_req,支持突发量与速率双调优,适合网关层保护。

Java架构设计:怎么在业务不停机地情况下迁移数据库?

一、迁移核心挑战

数据一致性:迁移过程中需保证新旧库数据实时同步

业务连续性:应用无感知切换,避免停机或数据丢失

回滚能力:出现异常时快速恢复至旧库

二、5大迁移方案与实施步骤

1. 双写 + 增量同步(推荐)

适用场景:中大型系统,允许短暂数据延迟

流程

graph LR 
A[应用层] -->|双写| B[旧库] 
A -->|双写| C[新库] 
D[CDC工具] -->|监听旧库Binlog| E[增量同步至新库] 
F[校验工具] -->|比对数据| B & C  

关键实现:

双写逻辑:通过AOP拦截DAO层,同时写入新旧库

@Transactional 
public void saveOrder(Order order) { oldDbDao.insert(order);   // 旧库写入 newDbDao.insert(order);   // 新库写入 
}  

数据校验:使用Alibaba DataX或自研工具对比关键表数据差异

切换阶段:

停用旧库写入,仅从新库读取

确保增量同步完全追上旧库

下线旧库,解除双写

2. 数据库原生工具(MySQL DTS/Oracle GoldenGate)

优势:利用数据库厂商工具实现低延迟同步

步骤:

配置全量初始化(旧库→新库)

启动实时增量同步(基于事务日志)

应用层配置读写分离:写旧库,读新库

数据一致后,切换写流量到新库

3. 中间件代理(ShardingSphere/ProxySQL)

架构设计:

应用 → 中间件 → 路由写入旧库 → 异步同步新库  

切换流程:

中间件开启影子表功能,自动同步新旧库

通过配置中心动态切换路由规则(如Nacos)

灰度验证部分流量写入新库

4. 逻辑迁移 + 流量切换

实施要点:

阶段一:旧库导出数据到新库(mysqldump/expdp)

阶段二:应用层通过动态数据源切换读写

示例代码

// Spring动态数据源示例 
@Bean 
@Primary 
public DataSource dynamicDataSource() { RoutingDataSource ds = new RoutingDataSource(); ds.setDefaultTargetDataSource(oldDataSource);  ds.setTargetDataSources(Map.of(  "old", oldDataSource, "new", newDataSource )); return ds; 
}  

5. 云服务方案(AWS DMS/Aliyun DTS)

Java架构设计:SSO单点登录设计方案及落地?

一、SSO核心价值与挑战

1、核心目标:

用户一次登录,多系统互通(如企业内网、SaaS应用)

避免重复认证,提升用户体验

2、技术挑战:

跨域会话管理

安全性与防篡改(如Token劫持)

高并发下的性能保障

二、主流SSO方案对比与选型

1. 基于Cookie的共享Session方案

适用场景:同父域下的子系统(如a.company.com 和b.company.com )

实现要点:

设置顶级域Cookie(.company.com )

通过Spring Session + Redis共享会话

代码片段

@Configuration 
public class SessionConfig { @Bean public CookieSerializer cookieSerializer() { DefaultCookieSerializer serializer = new DefaultCookieSerializer(); serializer.setDomainName("company.com");  // 顶级域共享 return serializer; } 
}  

2. 基于Token的中央认证(CAS/OAuth2)

架构流程

graph LR 
A[用户访问子系统] --> B{是否有Token?} 
B -->|否| C[跳转SSO认证中心] 
C --> D[登录页] 
D -->|成功| E[签发Token并重定向回子系统] 
B -->|是| F[校验Token有效性]  

技术组合:

OAuth2.0:适合开放平台(如微信登录)

CAS协议:适合企业内部系统

3. JWT无状态方案

优势:

无需中心化Session存储

支持跨域(通过HTTP头传递Token)

安全增强:

使用非对称加密(RS256)签名

短期Token + Refresh Token机制

三、生产级落地步骤(5大关键环节)

1. 统一认证中心设计

功能模块:

登录认证(支持密码/短信/扫码)

Token签发(JWT或Opaque Token)

会话管理(强制下线、续期)

高可用保障:

集群部署 + Nginx负载均衡

数据库分库分表(用户量>千万时)

2. Token安全策略

Token泄露 HTTPS传输 + IP绑定 + 短期有效期(1h)

重放攻击 添加Nonce随机数 + 一次性Token

CSRF攻击 SameSite Cookie + 双重提交Cookie校验

3. 子系统集成规范

SDK封装:提供统一鉴权客户端(Spring Boot Starter)

降级方案:Token校验失败时跳转登录页,而非直接抛错

4. 监控与运维

核心指标:

认证成功率(≥99.9%)

Token校验延迟(P99<50ms)

日志审计:记录所有登录事件,对接SIEM系统

5. 灰度发布策略

先对非核心系统(如HR系统)接入SSO

通过AB测试对比旧版登录转化率

全量切换后保留旧登录入口1个月

Java架构设计:布隆过滤器介绍与实际应用示例场景?

一、布隆过滤器核心原理

1、数据结构:

基于位数组(BitSet)和多个哈希函数,将元素映射到位数组的多个位置。

示例:

元素A通过哈希函数H1、H2、H3映射到位置[1,5,9],并将这些位置置为1。

2、特性:

假阳性(False Positive):可能误判不存在元素为存在(但不会漏判存在元素)。

空间效率:1亿元素仅需约114MB内存(误判率1%时)。

3、数学公式:

最优哈希函数数量 k = (m/n) * ln(2)

误判率 p ≈ (1 - e^(-kn/m))^k

m:位数组大小

n:预期元素数量

二、Java实现与性能优化

1. 基础实现(Guava库)

import com.google.common.hash.BloomFilter;  
import com.google.common.hash.Funnels;  // 创建布隆过滤器(预期元素量100万,误判率1%) 
BloomFilter<String> filter = BloomFilter.create(  Funnels.stringFunnel(Charset.defaultCharset()),  1_000_000, 0.01 
); // 添加元素 
filter.put("user123");  // 判断存在性 
boolean mayExist = filter.mightContain("user123");   

2. 高性能优化技巧

哈希函数选择:

使用MurmurHash3替代默认哈希函数(减少碰撞)

内存压缩:

采用RedisBloom模块实现分布式布隆过滤器

动态扩容:

当实际元素超过预期时,自动创建新过滤器并合并

三、实际应用场景与落地案例

1. 缓存穿透防护

问题:恶意查询不存在的数据,导致请求穿透缓存直达数据库。

方案:

查询前先检查布隆过滤器

若过滤器返回false,直接拒绝请求

代码片段

public Product getProduct(String id) { if (!bloomFilter.mightContain(id))  { throw new IllegalArgumentException("非法ID"); } return cache.getOrDefault(id,  db.query(id));  
}  

2. 爬虫URL去重

优势:百万级URL去重仅需MB级内存。

优化:

使用RedisBloom实现分布式去重

定期重置过滤器(避免长期积累导致误判率上升)

3. 邮件垃圾过滤

流程:

已知垃圾邮件特征哈希存入布隆过滤器

新邮件到达时快速判断是否垃圾邮件

误判处理:

二次校验(如人工审核标记为误判的邮件)

4. 分布式系统黑名单

架构:

全局布隆过滤器同步黑名单用户ID/IP

结合本地缓存减少网络调用

5. 数据库查询优化

场景:

避免全表扫描查询不存在的记录(如SELECT * FROM users WHERE non_indexed_column = ?)

实现:

将索引列值预先加载到布隆过滤器

Java架构设计:JWT深度解析与应用实战?

一、JWT核心概念

1、定义:

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全传输JSON格式的声明(Claims)。

2、结构:

Header:算法(如HS256)和类型(JWT)

Payload:存储用户ID、角色、过期时间等数据

Signature:对前两部分的签名,防篡改

二、JWT工作流程

sequenceDiagram 
    participant Client 
    participant Server 
    Client->>Server: 登录请求(用户名/密码) 
    Server->>Client: 生成JWT并返回 
    Client->>Server: 携带JWT访问API(Authorization头) 
    Server->>Server: 验证签名并解析Payload 

三、实际应用场景

1. 无状态认证(微服务架构)

优势:服务端无需存储Session,适合横向扩展

实现:

网关层统一校验JWT

微服务直接解析Payload获取用户信息

2. 单点登录(SSO)

流程:

认证中心签发JWT

子系统通过公钥验证JWT

3. 临时授权(如文件下载链接)

Java架构设计:Gossip协议深度解析与应用实战?

一、Gossip协议核心概念

1、定义:

Gossip(流行病协议)是一种去中心化的分布式信息传播协议,通过随机节点间的数据交换实现集群状态同步。

2、设计哲学:

最终一致性:不保证实时一致,但最终所有节点数据一致

容错性:允许部分节点故障或网络分区

可扩展性:节点增加时通信压力线性增长

二、Gossip实现机制(3大核心流程)

1. 信息传播模型

反熵(Anti-Entropy)

定期随机选择节点比对全量数据

适用场景:数据库集群同步(如Cassandra)

谣言传播(Rumor Mongering)

新事件通过随机传播快速扩散

适用场景:服务发现(如Consul)

三、应用场景示例

1. 分布式数据库同步(Cassandra)

机制:

通过反熵模式同步MemTable数据

采用Merkle Tree快速检测数据差异

优势:

无单点故障,支持跨数据中心部署

2. 服务发现与注册(Consul)

工作流程:

新服务节点加入时,通过Gossip广播自身信息

其他节点更新本地服务列表

性能对比:

比ZooKeeper的Watcher机制更适合大规模集群

3. 区块链网络(Hyperledger Fabric)

应用点:

交易信息通过Gossip协议扩散到全网节点

避免P2P广播的洪泛问题

4. 云原生监控(Prometheus+Thanos)

数据聚合:

多个Prometheus实例通过Gossip同步指标数据

实现全局监控视图

四、Gossip协议优劣分析

Java架构设计:定时任务实现思路?

一、主流实现方案与选型

1. 单机轻量级方案

Timer

JDK内置,单线程阻塞

简单低频任务(如日志清理)

ScheduledThreadPool

线程池支持,避免任务堆积

中小型应用常规调度

Spring @Scheduled

注解驱动,集成Spring生态

Spring项目快速开发

2. 分布式高可用方案

Quartz Cluster

数据库锁+故障转移

强一致性,支持复杂调度

Elastic-Job

ZooKeeper协调+分片

弹性扩容,任务分片执行

XXL-JOB

中心化调度+执行器集群

可视化管控,日志追溯

3. 云原生方案

Kubernetes CronJob:

通过Pod执行任务,天然支持分布式

需配合Prometheus监控Pod状态

Serverless Trigger:

阿里云定时触发器 + 函数计算

零运维成本,按执行次数计费

Java架构设计:多租户技术架构深度解析?

一、多租户核心概念与挑战

1、定义:

多租户(Multi-Tenancy)指单个应用实例为多个租户(企业/用户组)提供服务,租户间数据/配置隔离。

2、核心挑战:

数据隔离:避免租户间数据泄露

性能隔离:防止某租户资源占用影响其他租户

定制化扩展:支持租户特定功能扩展

二、主流多租户架构方案

1. 数据库层隔离方案

独立数据库

每个租户独占DB实例

金融/医疗等高隔离需求

共享数据库独立Schema

同一DB实例,不同Schema(CREATE SCHEMA tenant1)

中大型企业SaaS

共享表+租户ID

所有租户共用表,通过tenant_id字段区分

小微企业管理软件

2. 应用层隔离方案

动态数据源:

根据租户标识切换DataSource(AbstractRoutingDataSource)

适用场景:租户数量少且DB独立

线程上下文传递:

通过ThreadLocal或TransmittableThreadLocal传递tenant_id

需配合AOP自动注入租户参数

3. 资源隔离与限流

容器级隔离:

Kubernetes Namespace + ResourceQuota为租户分配独立Pod

流量控制:

Sentinel针对租户ID做QPS限制

Java架构设计:布谷鸟过滤器(Cuckoo Filter)深度解析与应用实战?

一、布谷鸟过滤器核心特性

1、与布隆过滤器的对比

2、核心原理

双哈希表结构:每个元素通过两个哈希函数映射到两个候选桶

踢出机制:若候选桶已满,随机踢出旧元素并重新插入(类似布谷鸟的巢寄生行为)

二、Java实现与关键代码

1. 基础实现(基于Guava风格API)

public class CuckooFilter<T> { private final int bucketSize;  // 每个桶的条目数 private final int maxKicks;    // 最大踢出次数 private final Bucket[] table;  // 存储桶数组 // 插入元素 public boolean insert(T item) { int hash1 = hash1(item), hash2 = hash2(item); if (tryInsert(hash1, item) || tryInsert(hash2, item)) return true; // 执行踢出操作 for (int i = 0; i < maxKicks; i++) { int hash = (i % 2 == 0) ? hash1 : hash2; T displaced = table[hash].getRandomEntry(); if (tryInsert(hash, item)) { item = displaced;  // 递归处理被踢出的元素 hash1 = hash1(item); hash2 = hash2(item); } } return false; // 插入失败(需扩容) } 
}  

2. 性能优化技巧

SIMD加速:使用Java的Panama项目实现向量化哈希计算

动态扩容:当插入失败率>5%时,自动扩容并重哈希

三、实际应用场景示例

1. 分布式缓存去重(Redis替代方案)

场景:缓存击穿防护,需支持删除过期键

实现

CuckooFilter<String> filter = new CuckooFilter<>(100_000, 0.01); 
// 添加缓存键 
filter.insert("product:123");  
// 查询是否存在 
if (filter.contains("product:123"))  { // 从DB加载 
} 
// 缓存失效时删除 
filter.delete("product:123");   

2. 实时风控系统

需求:快速判断用户行为是否在黑名单中,且需动态更新名单

优势:

比布隆过滤器节省30%内存

支持删除误判的正常用户

3. 分布式数据库(如TiDB)

应用:

LSM-Tree中快速判断SSTable是否包含某key

支持Compaction过程中的数据删除

4. 网络设备(路由器/防火墙)

功能:

IP黑名单过滤(支持动态增删)

比传统哈希表节省70%内存

总结

布谷鸟过滤器通过双哈希桶+踢出机制,在支持删除操作的同时保持了低空间开销,

特别适合需要动态更新的场景(如缓存、风控)。

Java实现时需注意并发控制和参数调优,大规模部署建议结合Redis模块(如RedisBloom)。

Java架构设计:RedisBloom模块深度解析与应用实战?

一、RedisBloom核心价值

1、功能定位:

RedisBloom是Redis的扩展模块,提供概率型数据结构支持,包括布隆过滤器、布谷鸟过滤器、Count-Min Sketch等,

解决海量数据存在性判断和频率统计问题。

2、性能优势:

内存效率:1亿元素判存仅需约114MB(误判率1%)

吞吐量:10万+ QPS(单节点)

二、核心数据结构与Java使用示例

1. 布隆过滤器(Bloom Filter)

场景:缓存穿透防护、爬虫URL去重

Java示例(Lettuce客户端)

// 创建过滤器(容量100万,误判率1%) 
client.bfReserve("user_filter",  0.01, 1000000); 
// 添加元素 
client.bfAdd("user_filter",  "user123"); 
// 判断存在性 
boolean exists = client.bfExists("user_filter",  "user123");  

2. 布谷鸟过滤器(Cuckoo Filter)

优势:支持删除操作,空间利用率更高

Java示例

// 创建过滤器(容量10万) 
client.cfReserve("ip_blacklist",  100000); 
// 动态增删 
client.cfAdd("ip_blacklist",  "192.168.1.1"); 
client.cfDel("ip_blacklist",  "192.168.1.1");  

3. Count-Min Sketch

用途:高频数据统计(如热点商品追踪)

示例

// 初始化CMS(宽度1000,深度4) 
client.cmsInitByDim("hot_items",  1000, 4); 
// 累加计数 
client.cmsIncrBy("hot_items",  "product_123", 5); 
// 查询频率 
long count = client.cmsQuery("hot_items",  "product_123"); 

三、生产级应用场景

1. 电商系统缓存击穿防护

架构

graph LR 
A[请求商品数据] --> B{RedisBloom判断是否存在?} 
B -->|是| C[查询缓存/DB] 
B -->|否| D[直接返回空]  

效果:减少无效DB查询90%+

2. 风控系统实时黑名单

实现:

使用布谷鸟过滤器存储可疑IP/用户ID

支持动态添加/移除(如误判恢复)

3. 广告点击去重统计

方案:

Count-Min Sketch统计用户点击次数

布隆过滤器判断是否首次点击

4. 消息队列幂等消费

代码片段

String msgId = message.getMessageId();  
if (redisBloom.bfExists("processed_msgs",  msgId)) { return; // 已处理则跳过 
} 
redisBloom.bfAdd("processed_msgs",  msgId); 
processMessage(message); 

Java架构设计:亿级数据如何高效校验用户名是否被占用?

一、核心挑战与设计原则

1、性能要求:

99.9%的查询响应时间 ≤10ms

支持每秒10万+ QPS的高并发

2、数据规模:

用户名总量≥1亿条

每日新增≈100万条

3、设计原则:

空间换时间:优先内存计算,避免直接查库

分层过滤:从轻量级到精确校验的递进式检查

最终一致性:允许极短时间窗口内的数据延迟

二、高性能架构方案

1. 第一层:布隆过滤器(Bloom Filter)

作用:快速排除绝对不存在的用户名(假阳性率≤1%)

实现

// RedisBloom模块(内存占用约114MB/1亿数据) 
String username = "test123"; 
if (!redis.execute("BF.EXISTS",  "username_filter", username)) { return "用户名可用"; // 99%请求在此处返回 
}  

优化

使用布谷鸟过滤器(Cuckoo Filter)支持删除操作

分片存储(如按用户名首字母分16个过滤器)

2. 第二层:分布式缓存(Redis Cluster)

存储结构:

Key: username:{username}

Value: 1(存在)/ null(不存在)

缓存策略:

写穿透:注册成功时同步更新缓存

TTL:设置7天过期,冷数据自动清理

3. 第三层:数据库分库分表(MySQL/PostgreSQL)

分片规则:

按用户名哈希值分16个库,每个库32张表

路由计算:库序号 = hash(username) % 16

索引优化:

唯一索引:ALTER TABLE user_01 ADD UNIQUE (username)

覆盖索引:SELECT 1 FROM user_01 WHERE username=? LIMIT 1

4. 异步一致性保障

graph TB 
    A[注册请求] --> B[写数据库] 
    B --> C[发MQ消息] 
    C --> D[更新Redis缓存] 
    D --> E[同步BloomFilter]  

补偿机制:定时任务扫描新增用户名,修补过滤器

三、异常处理与容灾

1、降级策略:

当Redis故障时,直接查库并返回带标记的结果(如result: "可能重复")

2、防穿透:

缓存空值:SET username:invalid 1 EX 60

3、监控指标:

Grafana监控过滤器误判率

Prometheus告警规则:数据库查询比例>5%时触发扩容

Java架构设计:扫码登录的流程与方案?

一、扫码登录核心流程

sequenceDiagram 
    participant 用户手机 
    participant 网页端 
    participant 服务端 
    participant 消息队列 
 
    网页端->>服务端: 1. 生成临时token+二维码(状态=待扫描) 
    服务端-->>网页端: 返回二维码URL+token 
    用户手机->>服务端: 2. 扫码获取token+用户身份 
    服务端->>消息队列: 3. 发布登录事件(token,userID) 
    消息队列->>网页端: 4. 推送登录成功(WebSocket) 
    网页端->>服务端: 5. 用token换取JWT会话凭证 

二、Java技术栈实现方案

1. 服务端设计

二维码生成 Google ZXing 包含临时token的加密URL(有效期2分钟)

状态管理 Redis 存储token状态(待扫描/已确认/已失效)

事件通知 WebSocket+STOMP 实时推送登录状态到网页

安全校验 JWT+HMAC-SHA256 最终会话凭证防篡改

2. 移动端交互

扫码SDK:微信/支付宝开放平台SDK(兼容主流APP)

登录确认:生物识别(指纹/人脸)二次验证

3. 容灾方案

轮询降级:当WebSocket不可用时,网页端每5秒查询token状态(HTTP长轮询)

令牌续期:二维码剩余30秒时自动刷新

三、性能优化关键点

高并发生成二维码 Redis原子计数器限流 峰值10万QPS

事件通知延迟 Kafka分区键=token(保证顺序性) 99%请求<200ms

令牌查询 Redis Cluster分片存储 毫秒级响应

Java架构设计:12306抢票系统设计?

一、系统核心挑战

二、架构分层设计

1. 接入层 - 流量管控

graph LR
A[用户请求] --> B[LVS负载均衡]
B --> C[API网关集群]
C --> D[限流熔断模块]
D -->|正常请求| E[业务层]
D -->|异常请求| F[排队系统]

关键技术:

动态限流:Sentinel集群限流(根据票仓余量动态调整QPS阈值)

排队导流:RocketMQ延时队列实现虚拟排队(平均等待时长<1s)

防机器刷票:行为分析模型(检测异常点击频率/路径)

2. 业务层 - 微服务化

余票查询 Redis分片集群+本地缓存 双层缓存策略(Region级热点探测)

订单创建 Seata分布式事务+Tair热点锁 分段锁优化(并发提升300%)

支付服务 状态机引擎+多通道路由 自动切换支付渠道(成功率>99.5%)

票价计算 Drools规则引擎+GPU加速 实时响应政策变动(<100ms)

3. 数据层 - 高性能存储

库存管理

// 库存分桶设计(避免全局锁)
public class TicketBucket {private Long trainId;private Map<String, AtomicInteger> sectionStock; // 区间余量private Striped<Lock> segmentLocks; // 分段锁public boolean acquireSeat(String section) {Lock lock = segmentLocks.get(section);lock.lock();try {if (sectionStock.get(section).decrementAndGet()  >= 0) {return true; // 扣减成功}return false;} finally {lock.unlock();}}
}

持久化方案

实时订单:TiDB(HTAP架构,支持实时分析)

历史数据:PolarDB列式压缩(存储成本降低60%)

三、核心技术创新

1. 动态库存分片算法

分片维度:车次+日期+车厢+席位等级

路由策略

graph TD
  A[用户请求] -->|Hash(出发地-目的地)| B[分片节点1]
  A -->|Hash(出发地-目的地)| C[分片节点2]
  B & C --> D[统一协调节点]
  D --> E[生成全局余量视图]

优势:冲突域缩小至同区间,并发处理能力线性扩展

2. 混合事务模型

3. 智能弹性调度

动态扩缩容

基于LSTM预测模型提前扩容(客流预测准确率>92%)

K8s + Envoy实现秒级扩缩(响应时间<10s)

流量调度

全局负载均衡:根据机房负载动态DNS切换

边缘计算节点:预处理静态请求(CDN命中率98%)

四、运维保障体系

1、全链路监控

日志:ELK + 实时Flink处理(10TB/日日志量)

追踪:SkyWalking自动拓扑分析(99%请求轨迹还原)

2、混沌工程平台

自动注入故障:网络延迟、节点宕机、数据延迟

自动化恢复验证:90%故障5分钟内自愈

3、安全防护

多层验证:滑块+短信+行为验证(拦截99.9%机器请求)

量子加密:支付通道采用量子密钥分发(QKD)

Java架构设计:如何设计一个秒杀系统?

一、秒杀系统核心挑战

二、分层架构设计

graph TB 
A[客户端] -->|请求| B(网关层) 
B --> C{流量控制层} 
C -->|合法请求| D[服务层] 
D --> E[缓存层] 
E --> F[数据库集群]  

1. 网关层(流量入口)

功能:

恶意IP封禁(基于实时风控数据)

HTTPS加密与证书卸载

请求聚合压缩

技术栈:Spring Cloud Gateway + OpenResty

2. 流量控制层(削峰填谷)

漏斗式过滤:

用户资格校验(黑名单/限购次数)

令牌桶限流(Redis + Lua脚本)

排队机制(MQ顺序队列)

动态扩容:K8s HPA根据队列长度自动扩容Pod

3. 服务层(业务核心)

模块拆分:

库存服务:预扣库存(Redis分布式锁 → 2025年改用Redisson)

订单服务:异步生成订单(RocketMQ事务消息)

支付服务:对接第三方支付(降级时支持事后补偿)

热点优化:

库存分桶:1000件库存拆为10个Key(stock:sku_1001_bucket{1-10})

LocalCache:节点本地缓存已售罄商品ID(Guava Cache)

4. 缓存层(高速读写)

多级缓存架构:

用户请求 → CDN静态页 → Redis集群(代理层Twemproxy) → 二级缓存(Caffeine)  

防击穿策略:

BloomFilter过滤无效商品请求

缓存空值应对穿透(TTL=5s)

5. 数据库层(最终一致)

分库分表:

订单表按用户ID哈希分16库(ShardingSphere)

库存表单独部署(PolarDB高性能集群)

数据同步:

Binlog→Kafka→Elasticsearch(实时库存对账)

三、容灾与降级方案

故障场景

Redis集群宕机 切到本地库存模式(限流10%) Redis节点存活率

数据库延迟飙升 关闭非核心功能(如评论加载) SQL平均响应时间>200ms

网络分区 静态页兜底(展示“稍后再试”) 跨可用区Ping延迟

性能指标

下单延迟:99%请求<500ms(峰值50万QPS)

库存准确率:99.9999%(每百万次误差<1次)

系统可用性:99.99%(年故障时间<52分钟)

Java架构设计:千万级实时聊天系统如何设计?

 一、核心挑战与应对策略

长连接高并发 分布式网关 + WebSocket 集群

消息实时性 边缘节点路由 + 内存级消息总线

数据一致性 CRDT 无冲突数据结构 + 向量时钟

存储与扩展性 分层存储 + 动态分片

二、分层架构设计

graph TB 
A[客户端] --> B(接入层) 
B --> C{协议层} 
C --> D[逻辑层] 
D --> E[存储层] 
E --> F[运维层] 
 
subgraph 接入层 
B1[全球边缘节点] 
B2[智能DNS] 
B3[连接负载均衡] 
end 
 
subgraph 协议层 
C1[WebSocket/QUIC] 
C2[ProtoBuf 编解码] 
C3[零拷贝压缩] 
end 
 
subgraph 逻辑层 
D1[消息路由] 
D2[在线状态管理] 
D3[反垃圾服务] 
end 
 
subgraph 存储层 
E1[Redis 热点缓存] 
E2[TiDB 消息持久化] 
E3[Iceberg 归档日志] 
end 
 
subgraph 运维层 
F1[全链路追踪] 
F2[混沌工程平台] 
F3[AIOps 异常预测] 
end 

三、关键技术实现

1. 连接层设计

全球接入点:

部署 200+ 边缘节点(基于 AWS Global Accelerator)

智能路由选择 <10ms 延迟节点

会话保持:

动态 Token 绑定(每 5 分钟刷新)

断线自动迁移(基于 Raft 算法)

2. 消息投递保障

三级消息确认机制  

1. 内存级确认(纳秒级)

2. 集群级确认(毫秒级)  

3. 持久化确认(秒级)  

3. 存储优化方案

五、容灾与监控体系

1. 熔断降级策略

2. 监控指标

黄金指标:

消息端到端延迟(P99 <200ms)

连接成功率(>99.995%)

消息丢失率(<0.0001%)

业务指标:

日均互动次数(DAU 统计)

跨语言翻译使用率

脑机接口设备渗透率

Java架构设计:接口被刷百万QPS,怎么防?

 一、分层防护体系

graph LR 
A[客户端] --> B{边缘防护层} 
B --> C[网关过滤层] 
C --> D[业务风控层] 
D --> E[资源隔离层]  

1. 边缘防护层(第一道防线)

Web应用防火墙(WAF)

规则库自动更新(实时同步云安全威胁情报)

精准拦截SQL注入/XSS/恶意爬虫(误杀率<0.01%)

DDoS防护

T级流量清洗(阿里云DDoS高防/AWS Shield Advanced)

近源压制技术(与运营商联动封禁攻击源AS号)

2. 网关过滤层(核心限流)

分布式限流 Redis+Lua令牌桶算法 支持500万QPS计数

动态指纹识别 设备ID+行为轨迹生成唯一指纹 100ms内完成设备画像

协议合规校验 自定义二进制协议(替代HTTP) 降低50%网络开销

智能熔断 Sentinel热点参数流控 自动识别TOP10热点资源

二、业务风控层(精准识别)

1. 多维风控模型

行为模式分析 LSTM神经网络预测操作序列 识别脚本自动化行为

物理轨迹验证 GPS/基站/WiFi三角定位比对 阻断机房集群攻击

生物特征识别 触摸屏压感+滑动轨迹分析 过滤模拟器流量

资源访问频率 时间滑动窗口统计(1s/10s/60s多维监控) 捕捉突发流量

2. 实时决策引擎

flowchart TD 
    A[请求进入] --> B{规则引擎检查} 
    B -->|通过| C[业务处理] 
    B -->|可疑| D[二次验证] 
    D --> E[无感验证码] 
    D --> F[行为挑战] 
    D --> G[短信认证] 

三、资源隔离层(深度防护)

1. 服务分级隔离

2. 热点数据保护

缓存策略

本地缓存:Caffeine(应对Redis穿透)

分布式缓存:RedisCluster(分片隔离热点Key)

防击穿设计:BloomFilter过滤无效请求

数据库防护

读写分离:TiDB自动分流读写流量

批量合并:同一用户请求10ms内合并处理

四、应急监控体系

1. 全链路监控

基础设施 Prometheus+Node_Exporter CPU/内存/网络饱和度

应用性能 SkyWalking P99延迟>200ms接口自动报警

业务风控 Elasticsearch 拦截率突降30%触发紧急响应

2. 混沌工程预案

故障注入场景:

模拟Redis集群宕机(验证本地缓存兜底能力)

制造200万QPS流量洪峰(测试弹性扩容速度)

自愈要求:

95%的故障在90秒内自动恢复

业务流量损失<0.001%

Java架构设计:外卖员近场订单查询架构设计?

一、核心挑战与解决方案

实时位置更新 北斗/GPS+WiFi指纹混合定位(误差<50米) 空间索引+Geohash分块缓存

高并发查询 分布式计算引擎(Flink Stateful Functions) 动态负载均衡+近场计算节点

订单动态匹配 强化学习推荐算法(DQN模型) 增量训练+边缘模型部署

多维度排序 多因子加权评分(距离/时效/骑手信用) 向量化计算(SIMD指令加速)

二、架构设计(四层模型)

graph TD 

A[移动端] --> B(接入层) 
B --> C{计算层} 
C --> D[数据层] 
D --> E[运维层] 
 
subgraph 接入层 
B1[API网关] 
B2[WebSocket长连接] 
B3[QUIC协议加速] 
end 
 
subgraph 计算层 
C1[位置事件流处理] 
C2[近场订单检索] 
C3[智能排序引擎] 
end 
 
subgraph 数据层 
D1[RedisGeo] 
D2[Elasticsearch空间索引] 
D3[TiFlash列存分析] 
end 
 
subgraph 运维层 
E1[全链路追踪] 
E2[动态扩缩容] 
E3[量子加密审计] 
end 

三、关键技术实现

1. 实时位置处理(毫秒级更新)

使用Kafka位置事件流

更新边缘节点本地缓存 

2. 近场订单检索(5公里范围)

1. 获取骑手位置  

2. Elasticsearch多边形搜索

3. 多维度排序(向量化计算) 

3. 智能推荐算法(DQN模型)

四、性能指标与容灾

查询延迟(P99) <300ms 返回3公里缓存订单

位置更新频率 每秒1次(动态调整) 惯性推算补偿

系统可用性 99.999% 自动切换至备用地理数据库

匹配准确率 >95% 启用基于规则的兜底策略

五、移动端交互流程

sequenceDiagram 
    骑手APP->>网关: 登录+上报定位(QUIC) 
    网关->>计算层: 注册WebSocket会话 
    计算层->>数据层: 实时索引位置(H3) 
    骑手APP->>网关: 请求5公里订单 
    网关->>计算层: 触发近场搜索 
    计算层->>数据层: 空间查询(GeoHash) 
    数据层-->>计算层: 返回候选订单 
    计算层->>AI模型: 动态排序 
    AI模型-->>骑手APP: 返回TOP10订单(含ETA预测) 

Java架构设计:如何设计一个微博系统?

一、核心功能模块

动态发布 高并发写入(百万级QPS) 分片队列+流处理(Kafka+Flink)

feed流推送 实时性与一致性平衡 混合推送(推模式+拉模式)+AI智能排序

社交图谱 千亿级关系链存储 图数据库(Neo4j+分布式缓存)

多媒体处理 4K视频实时转码 边缘计算节点(FFmpeg+GPU加速)

热点发现 实时趋势分析 时序数据库(TDengine)+LSTM预测模型

二、分层架构设计

graph TB 
A[客户端] --> B(接入层) 
B --> C{服务层} 
C --> D[数据层] 
D --> E[运维层] 
 
subgraph 接入层 
B1[智能DNS] 
B2[QUIC网关] 
B3[WebSocket长连接] 
end 
 
subgraph 服务层 
C1[动态服务] 
C2[关系服务] 
C3[推荐引擎] 
C4[风控系统] 
end 
 
subgraph 数据层 
D1[TiDB分库分表] 
D2[RedisTimeSeries] 
D3[Ceph对象存储] 
D4[ArangoDB图存储] 
end 
 
subgraph 运维层 
E1[全链路追踪] 
E2[混沌工程] 
E3[量子加密审计] 
end 

三、关键技术实现

1. 动态发布流程

异步化处理(削峰填谷)  

1. 写入Kafka分片队列(按用户ID哈希)  

2. Flink实时处理  

3. 存入冷热分离存储  

2. Feed流推送策略

3. 社交关系存储优化

使用图数据库存储关系链

热点关系缓存 

四、性能与容灾指标

发布延迟(P99) <500ms 异步写入+最终一致

Feed流刷新延迟 <1s 返回缓存数据+背景更新

数据持久化 99.9999999%可靠性 三地五中心存储

热点事件承载 千万级并发 自动限流+弹性扩容

五、客户端优化策略

1、智能预加载

基于用户行为预测提前拉取可能浏览的内容

2、差分更新

Java架构设计:百万级数据导出 Excel怎么性能优化,避免OOM?

一、核心优化策略

内存控制 流式导出(SXSSFWorkbook) 内存占用从GB级降至MB级

IO效率 分片压缩写入(ZIP流式输出) 网络传输量减少60%

计算加速 列式存储+向量化计算 处理速度提升5-10倍

资源隔离 专属线程池+熔断机制 避免影响主业务

二、具体实现方案

1. 流式导出(Apache POI优化)

// 使用SXSSFWorkbook(保持100行在内存) 
SXSSFWorkbook workbook = new SXSSFWorkbook(100);  
Sheet sheet = workbook.createSheet(" 数据"); // 分批查询数据库(游标/分页) 
try (ScrollableResults results = session.createQuery("FROM  LargeTable") .setFetchSize(5000) .scroll()) { int rowNum = 0; while (results.next())  { Row row = sheet.createRow(rowNum++);  // 填充单元格... if (rowNum % 1000 == 0) { sheet.flushRows();  // 刷新磁盘 } } 
} // 最终写入压缩流(防OOM) 
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()))  { zos.putNextEntry(new  ZipEntry("data.xlsx"));  workbook.write(zos);  
}  

2. 数据分片处理

graph TD 
A[查询总记录数] --> B{>50万?} 
B -->|是| C[按ID范围分片] 
B -->|否| D[直接导出] 
C --> E[多线程处理分片] 
E --> F[合并临时文件] 
F --> G[压缩下载]  

分片规则:

按时间范围分片(适合时序数据)

按哈希值分片(均匀分布)

3. 异步化与熔断

// 专用有界线程池 
ThreadPoolExecutor executor = new ThreadPoolExecutor( 2, 5, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), new ThreadPoolExecutor.CallerRunsPolicy() 
); // 熔断监控(Hystrix/Sentinel) 
@SentinelResource(value = "exportExcel", fallback = "exportFallback", blockHandler = "blockHandler") 
public void exportData() { ... } 

三、避坑指南

1、OOM预防清单

✅ 禁用XSSFWorkbook全内存模式

✅ JVM添加-XX:+UseZGC低延迟垃圾回收器

✅ 限制单次导出最大行数(配置文件动态调整)

2、性能监控指标

内存使用峰值 <1GB Prometheus+Micrometer

单文件导出时长 <5分钟 SkyWalking

线程池队列积压 <50 Grafana

Java架构设计:如果系统的QPS突然提升100倍该如何设计?

一、核心设计原则

水平扩展优先:无状态设计+细胞分裂式扩容

流量分层治理:漏斗式过滤(边缘→网关→服务)

关键路径优化:20%功能承载80%流量

混沌工程预备:定期模拟百倍流量冲击

二、五层弹性防护体系

graph TD 
A[客户端] --> B(边缘防护层) 
B --> C{智能网关层} 
C --> D[服务弹性层] 
D --> E[数据韧性层] 
E --> F[运维控制层] 

subgraph 边缘防护层 
B1[全球Anycast接入] 
B2[DDoS清洗] 
B3[HTTP/3 QUIC加速] 
end 

subgraph 智能网关层 
C1[动态限流] 
C2[协议转换] 
C3[AI熔断] 
end 

subgraph 服务弹性层 
D1[K8s HPA自动扩缩] 
D2[Serverless备用池] 
D3[服务降级开关] 
end 

subgraph 数据韧性层 
E1[多级缓存] 
E2[分库分表] 
E3[流式处理] 
end 

subgraph 运维控制层 
F1[全链路压测] 
F2[混沌猴攻击] 
F3[量子加密审计] 
end 

三、关键技术实现

1. 秒级扩容方案

2. 流量洪峰应对

梯度限流算法(滑动窗口+令牌桶混合)

降级策略(自动/手动)

3. 数据层优化

缓存策略:

L1:本地缓存(Caffeine)← 热点探测

L2:分布式缓存(Dragonfly)← 兼容Redis协议

L3:持久化缓存(Apache Ignite)

四、验证与监控

全链路压测 模拟真实业务场景+影子流量 核心接口P99<500ms

混沌工程 随机杀死30%节点+网络延迟注入 自动恢复时间<90秒

智能监控 Prometheus+Pyroscope持续剖析 异常检测延迟<10秒

Java架构设计:给你一亿个Redis keys,如何高效统计?

一、核心挑战与应对策略

内存爆炸风险 增量扫描+流式处理 内存占用稳定在MB级

计算耗时 分布式并行统计 耗时从小时级降至分钟级

精确性要求 概率算法(HyperLogLog)保精度 误差<0.81%且内存节省99%

集群影响 错峰扫描+热Key隔离 业务请求延迟波动<5%

二、高效统计方案

1. SCAN迭代扫描(基础版)

# 单次扫描10万key,避免阻塞 
cursor=0 
total=0 
while true; do redis-cli --bigkeys --scan --pattern '*' --count 100000 cursor=$(redis-cli SCAN $cursor COUNT 100000 | head -1) if [ "$cursor" -eq "0" ]; then break; fi 
done  

适用场景:小规模集群(<1千万key)

2. 分布式并行统计(生产级)

// 使用RedisGears分布式计算 
# 注册统计函数 
RG.PYEXECUTE """ 
keys = redis.call('SCAN',  0, 'COUNT', 50000) 
for _, key in ipairs(keys[2]) do redis.call('INCRBY',  'stats:total', 1) if string.match(key,  'user:*') then redis.call('INCRBY',  'stats:user_keys', 1) end 
end 
"""  

优势:

分片并行处理(每个分片独立统计)

结果自动聚合

3. 概率统计算法(超大规模)

# 使用HyperLogLog统计基数 
import redis 
r = redis.Redis() # 初始化HLL 
for key in r.scan_iter(count=100000):  r.pfadd("stats:hll",  key) # 获取估算值 
print(r.pfcount("stats:hll"))  

性能对比

三、避坑指南

1、禁止使用:

KEYS *命令(导致集群阻塞)

全量DUMP+本地分析(内存溢出风险)

2、必备监控:

Redis节点内存/CPU波动

扫描进度指标(scan_completed_percent)

四、方案选型建议

Java架构设计:电商平台订单自动关单架构设计?

一、核心设计要点

时效控制 多级延迟任务(秒级→分钟级→小时级) 资源利用率提升40%

状态一致性 分布式事务+Saga模式 保证关单与库存释放原子性

高并发处理 分片任务队列+弹性消费者 支持10万+订单/秒处理能力

容灾能力 本地事件表+定时补偿机制 系统可用性99.999%

二、主流实现方案对比

1. 延迟队列方案(RocketMQ/Kafka)

订单创建时发送延迟消息  

消费者处理关单  

适用场景:中小规模平台(日订单<100万)

2. 时间轮算法(Netty HashedWheelTimer)

优势:内存操作零GC压力

3. 定时扫描+批量处理(分布式版)

创建定时任务扫描未支付订单

优化技巧:

按订单ID哈希分片扫描

使用Elasticsearch加速查询

三、容灾与监控设计

故障场景

消息丢失 本地事件表+定时扫描补偿

数据库超载 限流降级(只关单不还库存)

时间不同步 NTP集群校准+本地时钟漂移检测

关键监控指标:

关单任务积压量(Prometheus警报阈值:>1000)

平均关单延迟(P99 <5秒)

库存释放成功率(需100%达成)

Java架构设计:如何从零搭建10W QPS 高并发优惠券系统?

一、核心挑战与应对策略

瞬时高并发 分层流量控制+弹性扩缩容 Sentinel + K8s HPA

超卖风险 分布式锁+预扣库存+异步对账 Redisson + RocketMQ事务消息

热点数据 本地缓存+分片存储 Caffeine + Redis Cluster分片

精准风控 实时规则引擎+用户画像 Flink + 图数据库(Neo4j)

二、五层架构设计

graph TD 
A[客户端] --> B(接入层) 
B --> C{逻辑层} 
C --> D[数据层] 
D --> E[运维层] 
 
subgraph 接入层 
B1[API网关] 
B2[QUIC协议加速] 
B3[WebSocket推送] 
end 
 
subgraph 逻辑层 
C1[库存服务] 
C2[风控服务] 
C3[订单服务] 
end 
 
subgraph 数据层 
D1[Redis分片集群] 
D2[TiDB分布式数据库] 
D3[Elasticsearch检索] 
end 
 
subgraph 运维层 
E1[全链路压测] 
E2[混沌工程] 
E3[量子审计日志] 
end 

三、关键技术实现

1. 高性能领券流程

分布式预扣库存(Lua脚本保证原子性)

异步创建订单(最终一致)

2. 热点数据处理

爆款优惠券 库存分桶(1000个Key)

用户频繁查询 布隆过滤器拦截无效请求

黑名单实时更新 推模式广播到所有节点

3. 智能风控体系

flowchart LR 
A[请求进入] --> B{规则引擎} 
B -->|通过| C[发券] 
B -->|可疑| D[二次验证] 
D --> E[行为验证] 
D --> F[人脸识别]  

实时规则:

同一设备5分钟内≤3次领取

相同IP段领取量突增报警

离线分析:

用户画像聚类(K-means算法)

四、性能压测指标

领券延迟(P99) <200ms SkyWalking

库存准确性 99.9999% 定时对账任务

峰值承载能力 15万QPS(30%冗余) JMeter+Prometheus

自动扩容速度 1分钟增加100节点 K8s Event监控

Java架构设计:100W QPS短链系统架构设计?

一、核心挑战与应对策略

高并发读写 分层缓存+分布式计算 Redis Cluster + Flink状态计算

短码生成冲突 雪花ID+哈希碰撞检测 分布式锁+异步重试机制

长链存储成本 列式压缩+冷热分离 Parquet列存+TiDB自动分区

跳转性能 边缘节点缓存+Anycast路由 Cloudflare Workers + QUIC协议

二、五层架构设计

graph TD 
A[客户端] --> B(接入层) 
B --> C{服务层} 
C --> D[存储层] 
D --> E[运维层] 
 
subgraph 接入层 
B1[全球边缘节点] 
B2[智能DNS负载均衡] 
B3[零信任安全网关] 
end 
 
subgraph 服务层 
C1[短码生成服务] 
C2[跳转路由服务] 
C3[实时分析服务] 
end 
 
subgraph 存储层 
D1[Redis热点缓存] 
D2[TiKV持久化存储] 
D3[Iceberg数据湖] 
end 
 
subgraph 运维层 
E1[混沌工程平台] 
E2[量子加密审计] 
E3[AI异常预测] 
end 

三、关键技术实现

1. 短码生成方案

// 分布式雪花ID+Base62编码 
public String generateShortCode(long userId) { Snowflake snowflake = new Snowflake(datacenterId, workerId); long id = snowflake.nextId();  return Base62.encode(id);  // 7位短码可表示3.5万亿组合 
} // 异步冲突检测(Kafka+消费者组) 
@KafkaListener(topics = "short_code_verify") 
public void checkCollision(String code) { if (redisTemplate.opsForValue().setIfAbsent(code,  "LOCK", 1, TimeUnit.SECONDS)) { persistToDB(code); } else { retryQueue.add(code);  // 触发重新生成 } 
}  

2. 跳转优化方案

边缘缓存策略

# Cloudflare规则:缓存301跳转24小时 
edge_ttl = 86400;  

协议加速

启用HTTP/3 QUIC协议(降低30%延迟)

预解析DNS(<link rel= "dns-prefetch">)

3. 数据存储设计

热点映射关系 RedisGeo(读写<1ms)

全量映射关系 TiKV(RocksDB引擎)

访问日志 Flink→Iceberg(列式压缩)

四、性能与容灾指标

跳转延迟(P99) <50ms 返回静态缓存页

短码生成成功率 99.999% 本地预生成池兜底

数据持久化 6个9可靠性 三地五中心备份

故障恢复 30秒自动切换 基于Raft协议的副本迁移

Java架构设计:百亿短 URL 怎样做到无冲突?

一、核心挑战与解决方案

ID空间耗尽 分布式雪花ID+动态扩位 支持2^128唯一标识(理论无上限)

哈希碰撞风险 多级哈希+异步冲突检测 碰撞概率<10^-20

全局唯一性 分片键+逻辑时钟 跨数据中心强一致性

生成速度 预分配ID区间+本地缓冲池 单节点10万QPS无锁生成

二、无冲突短码生成方案

1. 分布式ID生成器(Snowflake++改进版)

优势:

理论可生成 3.4×10^38 个唯一ID

无中心节点依赖

2. 多级哈希冲突检测

graph LR 
A[原始URL] --> B{一级哈希} 
B -->|MurmurHash3| C[64位指纹] 
C --> D{二级哈希} 
D -->|SHA-256截断| E[128位编码] 
E --> F[RedisBloom检测] 
F -->|无冲突| G[存入数据库] 
F -->|冲突| H[盐值重哈希]  

容错机制:

布隆过滤器误判时,触发异步数据库校验

冲突后自动加盐(用户ID+时间戳)重新哈希

3. 分片键路由策略

用户ID哈希 shard = userId % 1024 用户专属短链

时间范围 按创建时间分表(YYYYMMDD) 冷热数据分离

地理区域 根据IP定位到最近数据中心 降低跨域延迟

三、容灾与监控

ID服务宕机 本地预分配10万ID缓冲池

哈希集群过载 动态降级为纯递增ID模式

跨区网络分区 基于CRDT的最终一致性同步

Java架构设计:10W QPS 的会员系统,如何设计?

一、核心挑战与应对策略

高并发读写 多级缓存+异步化 Caffeine → Redis → TiDB

数据一致性 分布式事务+事件溯源 Seata + Kafka事务消息

热点用户 动态分片+本地缓存 ShardingSphere + Hazelcast

实时风控 流式计算+图数据库 Flink + Neo4j

弹性扩展 云原生+K8s HPA Kubernetes + Serverless Pod

二、五层架构设计

graph TD 
A[客户端] --> B(接入层) 
B --> C{服务层} 
C --> D[数据层] 
D --> E[运维层] 
 
subgraph 接入层 
B1[全球Anycast接入] 
B2[QUIC协议加速] 
B3[WebSocket长连接] 
end 
 
subgraph 服务层 
C1[会员核心服务] 
C2[等级计算服务] 
C3[权益发放服务] 
end 
 
subgraph 数据层 
D1[RedisCluster] 
D2[TiDB分库分表] 
D3[ArangoDB图存储] 
end 
 
subgraph 运维层 
E1[全链路压测] 
E2[混沌猴攻击] 
E3[量子审计追踪] 
end 

三、关键技术实现

1. 会员信息查询优化

多级缓存加载策略  

L1: 本地缓存(100ms过期)  

L2: 分布式缓存  

L3: 数据库(行缓存加速)  

2. 分布式事务方案

sequenceDiagram 
    客户端->>+会员服务: 更新等级 
    会员服务->>+Kafka: 发送预扣积分事件(事务消息) 
    Kafka-->>-积分服务: 提交消息 
    积分服务->>积分DB: 扣除积分 
    积分服务-->>-会员服务: 确认结果 
    会员服务->>会员DB: 最终提交  

3. 热点用户隔离

动态分片 按用户ID后两位路由到不同库

本地缓存预热 启动时加载TOP10万用户数据

限流熔断 Sentinel热点参数流控

四、性能与容灾指标

查询延迟(P99) <50ms 返回缓存旧数据+异步更新

数据一致性 最终一致(1秒内) 补偿任务+人工对账

系统可用性 99.999% 多活数据中心自动切换

扩容速度 1分钟增加100节点 K8s弹性调度

Java架构设计:如何设计一个高并发系统?

一、核心设计原则

无状态化:会话数据集中存储(Redis Cluster)

水平扩展:细胞分裂式服务拆分(每个微服务独立扩缩容)

异步化:消息队列解耦(RocketMQ/Kafka)

分层防御:边缘→网关→服务→数据逐层过滤

二、五层关键设计

接入层 全球Anycast+QUIC协议 降低30%网络延迟

网关层 动态限流(Sentinel)+JWT验签 支持百万级QPS路由

服务层 虚拟线程(Project Loom)+响应式编程 并发能力提升5倍

缓存层 多级缓存(Caffeine→Redis→CDN) 命中率>99%

数据层 分库分表(ShardingSphere)+列存(TiFlash) 千万级TPS写入

三、容灾与监控

故障场景

数据中心宕机 30秒内切换至备用集群

缓存穿透 布隆过滤器+空值缓存

数据库过载 自动降级为只读模式

监控重点:

全链路追踪(SkyWalking)

实时JVM指标(Pyroscope持续剖析)

Java架构设计:搜索引擎高效检索架构设计?

一、核心挑战与解决方案

数据量爆炸 分布式倒排索引+列式存储

检索效率低 分层索引+近似最近邻搜索

语义模糊 多模态向量引擎+知识图谱 

冷门结果干扰 个性化排序+时效加权

二、五层精准检索架构

graph TD 
A[查询输入] --> B(查询理解层) 
B --> C{索引路由层} 
C --> D[核心检索层] 
D --> E[排序层] 
E --> F[结果生成层] 
 
subgraph 查询理解层 
B1[分词纠错] 
B2[意图识别] 
B3[实体链接] 
end 
 
subgraph 索引路由层 
C1[倒排索引] 
C2[向量索引] 
C3[知识图谱] 
end 
 
subgraph 核心检索层 
D1[分片并行检索] 
D2[近似最近邻] 
D3[时效过滤器] 
end 
 
subgraph 排序层 
E1[Learning To Rank] 
E2[个性化权重] 
E3[商业规则] 
end 
 
subgraph 结果生成层 
F1[摘要生成] 
F2[异构结果融合] 
F3[安全过滤] 
end 

三、关键技术实现

1. 分层索引设计

倒排索引 跳表+位图压缩 精确关键词匹配

向量索引 HNSW图算法 语义相似搜索

列存索引 Parquet+谓词下推 数值范围过滤

2. 查询意图理解

多模态意图分析  

文本分析  

视觉语义(如搜索"红色圆形图标")  

3. 动态排序策略

个性化 用户画像Embedding相似度 每5分钟增量训练

时效性 时间衰减函数(1/(1+天数^2)) 索引时预计算

权威性 PageRank变种+人工权重 每周全量更新

四、避坑指南

1、索引分片策略

按领域垂直分片(电商/社交/新闻独立索引)

热数据单独分片(基于访问频率动态迁移)

2、结果去重

SimHash相似文档过滤(阈值>95%自动合并)

Java架构设计:百亿级超大流量红包架构方案?

一、核心挑战与应对策略

瞬时超高并发 分层流量控制+动态分片

资金安全 分布式事务+多级对账

热点账户 账户分桶+本地缓存

公平性保障 时间戳指纹+区块链存证

二、五层高可靠架构

graph TD 
A[客户端] --> B(接入层) 
B --> C{逻辑层} 
C --> D[数据层] 
D --> E[风控层] 
 
subgraph 接入层 
B1[Anycast全球接入] 
B2[QUIC协议加速] 
B3[WebSocket长连接] 
end 
 
subgraph 逻辑层 
C1[红包创建服务] 
C2[抢红包服务] 
C3[资金清算服务] 
end 
 
subgraph 数据层 
D1[Redis分片集群] 
D2[TiDB分布式数据库] 
D3[Kafka事件流] 
end 
 
subgraph 风控层 
E1[行为指纹分析] 
E2[量子加密审计] 
E3[AI黄牛识别] 
end 

三、关键技术实现

1. 红包发放设计

预分配红包池(避免实时计算)

分片存储策略  

2. 抢红包流程

3. 热点账户优化

分桶策略

# 将单个红包拆分为100个子桶 
for i in {0..99}; do redis-cli HSET redpacket:${id}:buckets ${i} ${amount}/100 
done  

本地缓存

Java架构设计:基于LBS的交友系统地理空间邻近算法设计?

一、核心需求与挑战

实时位置更新 高频GPS数据处理与压缩

邻近用户快速匹配 海量空间数据检索

动态兴趣圈推荐 地理围栏与语义标签联合计算

隐私保护 模糊化位置+差分保护

二、空间算法选型对比

Geohash 将二维坐标编码为字符串,前缀匹配 简单邻近查询

H3 六边形网格分层索引 跨尺度分析

Quadtree 四叉树空间分区 动态更新场景

KD-Tree 多维空间二叉树 静态数据KNN查询

HNSW 基于图的近似最近邻 语义+空间联合搜索

三、混合算法设计(推荐方案)

1. 分层索引架构

graph TB 
A[用户位置] --> B{精度判断} 
B -->|高精度| C[H3六边形索引] 
B -->|低精度| D[Geohash网格] 
C --> E[半径500m内精确匹配] 
D --> F[5km内粗筛] 
E & F --> G[向量相似度过滤]  

2. 核心代码实现

使用H3+RedisGEO实现  

1. 转换H3六边形地址(分辨率9对应约500m直径)

2. Redis GEO精确过滤  

3. 向量相似度二次筛选 

3. 动态优化策略

热区检测:实时监控网格密度,自动提升热点区域索引精度

冷启动处理:新用户使用IP城市级定位,逐步过渡到GPS定位

移动预测:基于LSTM模型预加载可能路径上的用户

四、隐私与性能平衡

位置模糊化 添加随机偏移(高斯噪声)

差分隐私 拉普拉斯机制保护聚合数据

临时会话区 动态生成虚拟围栏(有效期1小时)

Java架构设计:短视频系统设计如何支持三千万用户同时在线看视频?

一、核心挑战与解决方案

高并发播放 边缘节点分发+QUIC协议

海量存储 对象存储分片+智能冷热分离

实时互动 WebSocket集群+消息优先级队列

动态推荐 Flink实时计算+多模态向量检索

二、五层核心架构

graph TD
A[用户端] --> B(接入层)
B --> C{服务层}
C --> D[数据层]
D --> E[运维层]
 
subgraph 接入层
B1[全球250+边缘节点]
B2[QUIC协议加速]
B3[TCP-BBR拥塞控制]
end
 
subgraph 服务层
C1[视频转码服务]
C2[智能分发服务]
C3[实时互动服务]
end
 
subgraph 数据层
D1[对象存储(CEPH)]
D2[列式数据库(TiDB)]
D3[向量数据库(Milvus)]
end
 
subgraph 运维层
E1[全链路压测]
E2[AI异常预测]
E3[量子审计追踪]
end

三、关键技术实现

1. 智能视频分发

分层编码

2. 实时互动系统

// 弹幕优先级处理
@PriorityQueue
public class DanmuMessage {@Priority(level = 3) // VIP用户弹幕优先private String content;private Long userId;
}// WebSocket消息分发
public void handleMessage(Session session, String msg) {hazelcast.getTopic("danmu").publish(msg);  // 集群广播
}

3. 动态推荐引擎

多塔模型 用户兴趣挖掘 分钟级更新

图神经网络 社交关系推荐 秒级响应

强化学习 播放时长优化 实时交互

Java架构设计:海量数据的计数器要如何设计?

一、核心挑战与解决方案

高并发写入 分片计数+内存合并

精确查询 多级缓存+定期持久化

水平扩展 一致性哈希分片

容灾恢复 WAL日志+快照备份

二、三层核心设计

graph TD
A[写入层] --> B(计算层)
B --> C[存储层]
 
subgraph 写入层
A1[客户端SDK]
A2[负载均衡]
A3[本地缓冲池]
end
 
subgraph 计算层
B1[分片计数器]
B2[窗口聚合]
B3[流式检查点]
end
 
subgraph 存储层
C1[Redis集群]
C2[TiKV分布式存储]
C3[对象存储备份]
end

三、关键技术实现

1. 分片计数算法

基于Snowflake的分片路由 

内存合并写入(每100ms批量提交)

2. 存储架构对比

Redis Cluster 亚毫秒级响应 实时高频计数

Apache Druid PB级时序数据分析 离线报表统计

TiKV 强一致性+水平扩展 金融级精确计数

3. 容灾策略

实时双写:主备集群同步写入(延迟<1ms)

增量快照:每小时生成RocksDB checkpoint

量子加密:敏感计数器使用格密码签名

Java架构设计:50万QPS下如何设计未读数系统?

一、核心挑战与破局思路

实时性要求 内存计算+增量推送

写入风暴 分片合并+异步持久化

存储成本 位图压缩+冷热分离

用户维度扩展 倒排索引+列式存储

二、三级火箭架构设计

graph TD
A[客户端] --> B(接入层)
B --> C{计算层}
C --> D[存储层]
 
subgraph 接入层
B1[QUIC网关]
B2[连接复用池]
B3[协议压缩]
end
 
subgraph 计算层
C1[事件流处理]
C2[增量合并器]
C3[分布式快照]
end
 
subgraph 存储层
D1[RoaringBitmap缓存]
D2[TiDB行列混存]
D3[对象存储归档]
end

三、关键技术实现

1. 位图优化术

// 使用RoaringBitmap压缩存储
RoaringBitmap unreadBits = new RoaringBitmap();
void addUnread(long msgId, long userId) {long compositeKey = (msgId << 32) | userId; // 复合键位映射unreadBits.add(compositeKey);
}// 分片查询示例
public int getUnreadCount(long userId) {return shardFor(userId).getCardinality(userId);
}

存储对比

2. 分级更新策略

强实时场景 <1秒 内存事件总线+WebSocket推送

普通场景 <5秒 Kafka消费+本地缓存更新

长尾用户 <1分钟 离线计算+每日合并

3. 弹性扩缩容

动态分片:按用户ID哈希自动平衡负载

冷热分离

TiDB热数据分区

四、容灾三板斧

故障类型

缓存击穿 布隆过滤器+空值缓存

数据库过载 降级为最终一致性

网络分区 冲突解决CRDT算法

监控重点

位图内存碎片率(阈值>30%告警)

增量合并延迟(P99<200ms)

跨数据中心同步差(阈值>1秒)

Java架构设计:秒杀系统瓶颈-日志如何设计优化?

一、秒杀日志核心挑战

瞬时日志风暴 磁盘IOPS打满,拖慢业务响应

关键链路追踪缺失 故障定位困难

日志分析延迟高 实时风控失效

存储成本爆炸 PB级日志存储开销

二、三级优化方案(写入→传输→存储)

1. 写入层优化(客户端/服务端)

异步日志框架配置

内存队列缓冲,每秒刷盘

关键错误同步写

关键日志染色标记(TraceID透传)

2. 传输层优化

二进制编码 使用Protobuf替代JSON

流量分级 关键日志优先传输(DSCP标记)

边缘计算 在CDN节点预聚合相同错误日志

3. 存储层优化

冷热分离策略

智能清理规则:

错误日志保留30天

行为日志保留7天(抽样10%永久存储)

Java架构设计:如何设计一个分布式缓存系统?

一、核心设计目标

性能 读写延迟<5ms(P99) 热点数据均衡与内存管理

一致性 最终一致性强保障(秒级) 跨地域数据同步与冲突解决

扩展性 支持线性扩展至100+节点 数据分片与再平衡策略

容灾 99.999%可用性 脑裂检测与自动恢复机制

二、五层核心架构

graph TD
A[客户端] --> B(代理层)
B --> C{缓存集群}
C --> D[持久化层]
D --> E[运维体系]
 
subgraph 代理层
B1[一致性哈希路由]
B2[协议转换]
B3[多级缓存降级]
end
 
subgraph 缓存集群
C1[内存分片]
C2[副本同步]
C3[过期淘汰]
end
 
subgraph 持久化层
D1[WAL日志]
D2[冷数据存储]
D3[快照备份]
end
 
subgraph 运维体系
E1[混沌工程]
E2[量子加密审计]
E3[神经预测扩容]
end

三、关键技术实现

1. 数据分片策略

一致性哈希 扩容影响小(仅影响1/N数据) 节点频繁变动环境

范围分片 支持范围查询 有序数据访问

动态权重分片 根据节点性能差异化分配 异构硬件集群

2. 缓存一致性保障

写策略
    sequenceDiagram
    客户端->>主节点: 写请求
    主节点->>副本1: 同步写
    主节点->>副本2: 异步写
    主节点-->>客户端: 确认 

读策略:
    主节点优先(强一致)
    本地副本优先(最终一致)

3. 热点发现与处理

动态分片 热Key自动分裂为子Key

本地缓存 客户端缓存热点数据

流量染色 对热点请求特殊路由

四、容灾与监控

节点宕机 副本自动提升+数据再平衡

网络分区 采用CRDT冲突解决算法

磁盘损坏 纠删码(Erasure Coding)恢复

Java架构设计:1 亿个数据取出最大前 100 个有什么方法?

 一、核心挑战与破局思路

内存限制 外排序+分片处理

计算效率 并行计算+堆优化

精确性保障 多阶段归并校验

实时性要求 流式处理+增量更新

二、五类经典解法对比

1. 堆排序法(内存友好型)

// 维护100大小的小顶堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>(100);void processData(int num) {if (minHeap.size()  < 100) {minHeap.offer(num);} else if (num > minHeap.peek())  {minHeap.poll();minHeap.offer(num);}
}

适用场景:数据可分批加载(需遍历1次,时间复杂度O(nlogk))

2. 分治+归并(超大数据集)

graph TD
A[1亿数据] --> B[分片为100文件]
B --> C[单个文件内排序]
C --> D[多路归并取Top]

优化技巧:

使用内存映射文件加速I/O

归并阶段采用败者树优化

3. 概率算法(近似解)

蓄水池抽样:等概率保留候选集

Count-Min Sketch:高频元素过滤

4. 分布式计算(海量数据)

Spark RDD.top() 算子

Flink KeyedProcessFunction+状态管理

MapReduce 二次排序优化

5. 硬件加速(极限性能)

GPU并行:CUDA实现快速排序(NVIDIA A100加速5倍)

FPGA预处理:实时过滤明显非Top数据

Java架构设计:Restful API设计最佳实践?

一、核心设计原则

无状态性 所有必要信息包含在请求中 JWT/OAuth2.0令牌

资源导向 名词化URI设计 /users/{id}/orders 替代 /getUserOrders

HATEOAS 响应中嵌入可操作链接 Spring HATEOAS

版本控制 通过Header或URI路径管理 Accept: application/vnd.company.v2+json

二、五大关键设计规范

1. 资源命名与URI设计

层级关系

# 正确示例
GET /departments/{deptId}/employees?page=1
# 错误示例
GET /getEmployeesByDepartment?deptId=123 

2. HTTP方法语义化

3. 响应设计标准化

// 成功响应
{"data": {"id": 123,"name": "示例","_links": {"self": { "href": "/api/v1/users/123" }}},"meta": {"timestamp": "2025-06-24T14:14:00Z","traceId": "3d4e5f"}
}// 错误响应
{"error": {"code": "VALIDATION_ERROR","message": "姓名不能为空","details": [{"field": "name","issue": "REQUIRED_FIELD"}]}
}

4. 性能优化策略

缓存控制

@GetMapping("/products/{id}")
@CacheControl(maxAge = 3600)
public Product getProduct() { ... }

字段过滤

GET /users?fields=id,name,email 

5. 安全防护措施

CSRF 同源策略+Cookie的SameSite属性

注入攻击 参数校验+预编译语句

数据泄露 敏感字段脱敏

http://www.xdnf.cn/news/1250947.html

相关文章:

  • Android—服务+通知=>前台服务
  • 简单spring boot项目,之前练习的,现在好像没有达到效果
  • 攻防世界WEB(新手模式)20-unseping
  • Android14的QS面板的加载解析
  • Tesseract + Poppler 实现图片型 PDF 转文字
  • jmm 指令重排 缓存可见性 Volatile 内存屏障
  • Perforce P4 Plan - DevOps实时规划工具
  • Python day36
  • 基于单片机智能浇花/智能灌溉/智慧农业/智能大棚
  • 双馈和永磁风机构网型跟网型联合一次调频并入同步机电网,参与系统一次调频,虚拟惯量下垂,虚拟同步机VSG控制matlab/simulink
  • 【软考系统架构设计师备考笔记5】 - 专业英语
  • 【关于Java的泛型(基础)】
  • 《动手学深度学习》读书笔记—9.3深度循环神经网络
  • 阿里云 Flink
  • 第七章课后综合练习
  • SpringBoot 3.x整合Elasticsearch:从零搭建高性能搜索服务
  • 【网络基础】计算机网络发展背景及传输数据过程介绍
  • vue3 vite 使用vitest 单元测试 组件测试
  • Lesson 31 Success story
  • 【C++详解】STL-set和map的介绍和使用样例、pair类型介绍、序列式容器和关联式容器
  • 蓝桥杯----锁存器、LED、蜂鸣器、继电器、Motor
  • RN项目环境搭建和使用-Mac版本(模拟器启动不起来的排查)
  • 软件定义汽车 --- 电子电气架构的驱动
  • 【pytorch(02)】Tensor(张量)概述、如何创建、常见属性,切换设备
  • AI学习之大话transformer架构
  • 2025年08月 GitHub 热门项目推荐
  • Spring选择哪种方式代理?
  • 电子电气架构 ---如何焕新升级为 48V 电气架构
  • 无人机航拍数据集|第4期 无人机太阳光伏板红外目标检测YOLO数据集10945张yolov11/yolov8/yolov5可训练
  • OpenHarmony源码解析之init进程