Java高并发常见架构
1. 分层架构
采用分层设计(如Controller-Service-DAO),结合线程池隔离不同层级的任务,避免资源竞争。例如,Web层使用NIO(如Netty),业务层使用异步处理。
2. 事件驱动架构
基于消息队列(如Kafka、RocketMQ)解耦系统组件,通过事件发布/订阅模式实现异步处理,提升吞吐量。
3. 微服务架构
将系统拆分为独立服务,结合Spring Cloud Alibaba或Dubbo实现分布式事务和限流,避免单点瓶颈。
4. 读写分离与分库分表
数据库层通过MyCAT或ShardingSphere拆分数据,配合主从复制降低单库压力。
高并发处理方式
无锁编程
使用CAS(如AtomicInteger
)或LongAdder
替代同步锁,减少线程阻塞。例如:
java
AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet();
线程池优化
根据任务类型选择线程池策略:
- CPU密集型:线程数 = CPU核心数 + 1
- IO密集型:线程数 = CPU核心数 * (1 + 平均等待时间/平均计算时间)
示例:
java
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
分布式锁
使用Redisson或Zookeeper实现跨JVM的锁机制,避免超卖问题:
java
RLock lock = redissonClient.getLock("orderLock");
lock.lock();
try {
// 业务逻辑
} finally {
lock.unlock();
}
异步化处理
通过CompletableFuture或RxJava将同步调用转为异步,例如:
java
CompletableFuture.supplyAsync(() -> queryData())
.thenApplyAsync(data -> process(data))
.exceptionally(ex -> handleError(ex));
API调优策略
减少锁粒度
使用细粒度锁(如ConcurrentHashMap
的分段锁)替代synchronized
全局锁:
java
ConcurrentHashMap<String, Object> cache = new ConcurrentHashMap<>();
cache.put("key", value);
缓存优化
多级缓存(本地缓存+Redis)减少数据库访问。例如Guava Cache设置过期策略:
java
Cache<String, Object> localCache = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
序列化加速
选用高效的序列化工具(如Protobuf、Kryo),替代JSON:
java
Kryo kryo = new Kryo();
kryo.writeObject(output, obj);
连接池配置
调整数据库连接池参数(如HikariCP):
properties
# 最大连接数 = 并发请求数 / 每个请求平均耗时
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=3000
JVM参数调优
针对高并发场景调整GC策略:
bash
-XX:+UseG1GC -Xmx4g -Xms4g -XX:MaxGCPauseMillis=200
流量控制
使用Guava RateLimiter或Sentinel限流:
java
RateLimiter limiter = RateLimiter.create(100); // 每秒100个请求
if (limiter.tryAcquire()) {
// 处理请求
}
以上方案需根据实际业务场景组合使用,通过压测工具(如JMeter)验证效果,持续监控(如Prometheus+Granfa)调整参数。