java并发编程笔记(十一)——高并发处理思路和手段
java并发编程笔记(十一)——高并发处理思路和手段
扩容
- 垂直扩容(纵向扩展):提高系统部件能力
- 水平扩容(横向扩容):增加更多系统成员来实现
缓存
缓存特征
命中率:命中数/(命中数+没有命中数)
一、影响因素
- 业务场景和业务需求
- 缓存的设计(粒度和策略)
- 缓存的容量和基础设施
二、缓存分类和应用场景
- 本地缓存:编程实现(成员变量,局部变量,静态变量)、Guava Cache
- 分布式缓存:Memcache、Redis
三、常用组件
Guava Cache
public class GuavaCacheExample1 { public static void main(String[] args) { LoadingCache<String, Integer> cache = CacheBuilder.newBuilder()
.maximumSize(10) // 最多存放10个数据
.expireAfterWrite(10, TimeUnit.SECONDS) // 缓存10秒
.recordStats() // 开启记录状态数据功能
.build(new CacheLoader<String, Integer>() {
@Override
public Integer load(String key) throws Exception {
return -1;
}
}); log.info("{}", cache.getIfPresent("key1")); // null
cache.put("key1", 1);
log.info("{}", cache.getIfPresent("key1")); // 1
cache.invalidate("key1");
log.info("{}", cache.getIfPresent("key1")); // null try {
log.info("{}", cache.get("key2")); // -1
cache.put("key2", 2);
log.info("{}", cache.get("key2")); // 2 log.info("{}", cache.size()); // 1 for (int i = 3; i < 13; i++) {
cache.put("key" + i, i);
}
log.info("{}", cache.size()); // 10 log.info("{}", cache.getIfPresent("key2")); // null Thread.sleep(11000); log.info("{}", cache.get("key5")); // -1 log.info("{},{}", cache.stats().hitCount(), cache.stats().missCount()); log.info("{},{}", cache.stats().hitRate(), cache.stats().missRate());
} catch (Exception e) {
log.error("cache exception", e);
}
}
}
Memcache
Redis
**最大元素(空间):缓存大小 **
清空策略:FIFO、LFO、LRU、过期时间,随机等
FIFO: 先进先出策略
LFO:最少使用策略
LRU:最近最少使用策略
高并发场景下缓存常见问题
缓存一致性
造成这种问题的场景:
- 更新数据库成功--更新缓存失败--数据不一致
- 更新缓存成功--更新数据库失败--数据不一致
- 更新数据库成功--淘汰缓存失败--数据不一致
- 淘汰缓存成功--更新数据库失败--查询缓存miss
缓存并发问题
同时大量请求访问缓存未命中,然后大量请求同时访问数据库造成数据库压力增大,解决办法是加锁,避免同时执行
缓存穿透问题
某个查询结果为空,导致缓存为存储,因此大量请求会去查询数据库,造成对数据库的压力大增
解决办法:
1、缓存空对象,缓存时间要短,适合命中率不高,但是需要频繁修改的数据
2、进行单独过滤处理,对所有可能结果为空的请求进行统一存放,并且对请求进行拦截,避免请求到数据库对数据库造成大量压力
缓存雪崩现象
导致原因:缓存并发,缓存穿透等
解决办法:过期时间设置随机数,避免同时失效10
消息队列
特性
- 业务无关:只做消息分发
- FIFO:先投递先到达
- 容灾:节点的动态增加和消息的持久化
- 性能:吞吐量提升,系统内部通信效率提高
为什么需要消息队列
- 【生产和消费】的速度或稳定性等因素不一致
消息队列的好处
- 业务解耦
- 最终一致性
- 广播
- 错峰和流控
举例
- Kafka
- RabbitMQ
应用拆分
拆分原则
- 业务优先
- 循序渐进
- 兼顾技术:重构、分层
- 可靠测试
需要考虑的问题
- 应用之间的通信:RPC(dubbo等)、消息队列
- 应用之间数据数据库设计:每个应用都有独立的数据库
- 避免事务操作跨应用
通信工具
- dubbo
- springCloud
应用限流
常用限流算法
计数器法
滑动窗口法
漏桶算法
令牌桶算法(Guava RateLimit)
@Slf4j
public class RateLimiterExample1 { private static RateLimiter rateLimiter = RateLimiter.create(5); public static void main(String[] args) throws Exception { for (int index = 0; index < 100; index++) {
if (rateLimiter.tryAcquire(190, TimeUnit.MILLISECONDS)) {
handle(index);
}
}
} private static void handle(int i) {
log.info("{}", i);
}
}
@Slf4j
public class RateLimiterExample2 { private static RateLimiter rateLimiter = RateLimiter.create(5); public static void main(String[] args) throws Exception { for (int index = 0; index < 100; index++) {
rateLimiter.acquire();
handle(index);
}
} private static void handle(int i) {
log.info("{}", i);
}
}
Guava RateLimiter是单机版的限流
如果是分布式可以采用 分布式限流:
可以采用Redis作为中间组件,使用Redis的incrby key num 方法
服务降级与服务熔断
服务降级
- 自动降级:超时、失败次数、故障、限流
- 人工降级:秒杀、双11大促
服务熔断
总结
共性:目的、最终表现、粒度、自治
区别:
- 触发原因、管理目标层次、实现方式
服务降级要考虑的问题
- 核心服务、非核心服务
- 是否支持降级、降级策略
- 业务放通场景,策略
Hystrix
- 在通过第三方客户端访问(通常是通过网络)依赖服务出现高延迟或者失败时,为系统提供保护和控制。
- 在分布式系统中防止级联失败
- 快速失败(fail fast)同时能快速恢复
- 提供失败回退(Fallback)和优雅的服务降级机制
- 提供近实时的监控、报警和运维控制手段
数据库切库、分库、分表
数据库瓶颈
- 单个库数据量太大(1T~2T):多个库
- 单个数据库服务器压力过大、读写瓶颈:多个库
- 单个表数据量过大:分表
数据库切库
切库的基础及实际运用:读写分离
自定义注解完成数据库切库-代码实现
支持多数据源、分库
数据库支持多个数据源-代码实现
数据库分表
- 什么时候考虑分表
- 横向(水平)分表和纵向(垂直)分表
- 数据库分表:mybatis分表插件shardbatis2.0
高可用的一些手段
- 任务调度系统分布式:elastic-job+zookeeper
- 主备切换:apache curator + zookeeper分布式锁实现
- 监控报警机制
java并发编程笔记(十一)——高并发处理思路和手段的更多相关文章
- java并发编程笔记(三)——线程安全性
java并发编程笔记(三)--线程安全性 线程安全性: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...
- java并发编程笔记(六)——AQS
java并发编程笔记(六)--AQS 使用了Node实现FIFO(first in first out)队列,可以用于构建锁或者其他同步装置的基础框架 利用了一个int类型表示状态 使用方法是继承 子 ...
- java并发编程笔记(五)——线程安全策略
java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...
- java并发编程笔记(一)——并发编程简介
java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...
- java并发编程笔记(十)——HashMap与ConcurrentHashMap
java并发编程笔记(十)--HashMap与ConcurrentHashMap HashMap参数 有两个参数影响他的性能 初始容量(默认为16) 加载因子(默认是0.75) HashMap寻址方式 ...
- java并发编程笔记(九)——多线程并发最佳实践
java并发编程笔记(九)--多线程并发最佳实践 使用本地变量 使用不可变类 最小化锁的作用域范围 使用线程池Executor,而不是直接new Thread执行 宁可使用同步也不要使用线程的wait ...
- java并发编程笔记(八)——死锁
java并发编程笔记(八)--死锁 死锁发生的必要条件 互斥条件 进程对分配到的资源进行排他性的使用,即在一段时间内只能由一个进程使用,如果有其他进程在请求,只能等待. 请求和保持条件 进程已经保持了 ...
- java并发编程笔记(七)——线程池
java并发编程笔记(七)--线程池 new Thread弊端 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 缺 ...
- java并发编程笔记(四)——安全发布对象
java并发编程笔记(四)--安全发布对象 发布对象 使一个对象能够被当前范围之外的代码所使用 对象逸出 一种错误的发布.当一个对象还没构造完成时,就使它被其他线程所见 不安全的发布对象 某一个类的构 ...
随机推荐
- thymeleaf 下拉选框回显选中
参考了许多,最后以这种方法实现了.尽管有些愚蠢,初步学习阶段.不知道为什么用th:field会报错.网上有些是用field来解决回显问题的. <select name="positio ...
- php的优势与缺点
PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 PHP 自创的语法.利于学习 ...
- 《JAVA设计模式》之适配器模式(Adapter)
在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ...
- scite配置文件及常用设置
在linux系统中,SciTE的用户设置文件为 ~/.SciTEUser.properties,优先级高于全局配置文件. scite是个不错的IDE工具,只是本人发现,在开发团队中和其他成员的编辑工具 ...
- 2019牛客暑期多校训练营(第二场) - H - Second Large Rectangle - dp
https://ac.nowcoder.com/acm/contest/882/H 正确的办法:dp1[i][j]表示以i,j为底的矩形的高.得到dp1之后,dp2[i][j]表示以dp1[i][j] ...
- MySQL对字段新增自增序列
现在有这样的场景,我们的数据库类型是MySQL,表是从其他库拿过来的,约束和索引都没迁移.现在希望增加一个自增序列. 且自增序列是从当前最大自增ID开始的,下面就是这样一个过程的演示. mysql&g ...
- 抓包工具Charles简单使用介绍(可抓取Android中app的请求)
摘自: 作者:Roy_Liang链接:http://www.jianshu.com/p/5539599c7a25 Charles安装 HTTP抓包 HTTPS抓包 1. Charles安装 官网下 ...
- bounds与frame的区别及setBounds的使用
转自http://www.cocoachina.com/ios/20140925/9755.html 在iOS开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bound的区别,尤 ...
- 11-基于CPCI的中频功率放大收发板
1.板卡参数介绍 无线输入口 无线发射口 1M~3GHZ,可调,步进100HZ(非跳频模式) 功率:≤﹢10±2.5 dBm 收发通道数 收发各1通道/板 中频输入输出 70MHz, 5MHz/30M ...
- 164-基于TI DSP TMS320C6455和Altera FPGA EP2S130的Full CameraLink PDS150接口板卡
一.板卡概述 本板卡由我公司自主研发,板卡采用DSP+FPGA的结构,DSP使用TMS320C6455芯片,FPGA采用ALTERA的高端FPGA芯片Stratix II EP2S系列EP2S130, ...