[log] 并发问题、优化措施、常见问题定位、

高并发系统设计

  • 操作原子性
    常用与多线程原子变量、数据库事务等
    jdk通过cpu的cmpxchgl指令的支持,实现了AtomicInteger的CAS操作的原子性

mysql的innodb通过预写事务日志的方式来保障书屋的原子性、一致性、持久性
包含redo日志和undo日志

redo 日志在系统需要时对事务操作进程重做,当系统宕机重启后,对内存中还没雨持久化到磁盘的数据进行恢复
undo日志能够在事务执行失败时,利用undo信息将数据还原到事务执行前的状态

事务日志通过可以提高事务执行的效率
存储引擎只需要将修改行为持久到事务日志当中,
只对该数据在内存中额拷贝进行修改,
不需要每次修改都将数据回写到磁盘,
日志写入是一小块区域的顺序i/o,数据库数据的磁盘回写则是随机i/o

  • 多线程同步
    可以通过synchronized关键字 和 锁来实现线程间的同步

使用synchronized 代码块
明确指定的参数就是锁对象
锁是非公平的

使用ReentrantLock锁来实现线程间的同步
ReentrantLock可以指定等待时间,而且等待是可以中断的
可以在构造锁时使用公平锁,默认的是非公平的

公平锁:多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁

  • 数据一致性

分布式系统常常通过复制数据来提高系统的可靠性和容错性,
将数据副本放到不同的机器上,就会面临数据一致性维护的问题

强一致性要求无论数据的更新操作在那个副本上执行,之后的读操作都能够获取到最新数据

这种情况就需要通过分布式事务来保证操作的原子性,并且外界无法读取到系统的中间状态

弱一致性 :数据更新后还有可能读取到更新前的内容

最终一致性:保证用户能够在一段时间之后读取到的数据是一致的

  • 并发场景
    秒杀等

https://yq.aliyun.com/articles/618443
https://www.cnblogs.com/andy-zhou/p/5364136.html

通过数据缓存和分库来进行支撑

避免数据不一致情况发生,可以采用实际库存和浏览库存分离的方式

前端浏览的库存信息存放于缓存中
后端真实的库存保存在数据库中
这两个操作可以在一个事务中进行
最后将数据库中的数据同步到缓存中

采用读写锁

当使用的是行锁的情况下,会出现线程之间对锁进行争夺,
出现进程等待,无法发挥多线程的优势

可以将一行库存拆分成多行,便可以解除行锁问题

优化

将执行时间长的sql打印出来
show variables like ‘log_slow_queries’

java优化

  • java 单例,节约内存开销

  • 使用Future

  • 线程池,充分利用机器资源

  • io selector

  • 线程过多时,时间片轮转造成上下文切换开销

  • 降低锁竞争,缩短锁的持有时间,精简同步代码块,减少锁粒度,少用独占锁多用读写锁

  • 传输数据压缩

  • 查询数据缓存

sql优化

mysql 的索引是在存储引擎层面实现的,
大部分使用的是B树数据结构,
可以使用 explain命令来解释和分析sql查询语句
尽量避免全表扫描

当查询列不是独立的,而是表达式或函数一部分时,
mysql 将无法使用该列索引,进行全表扫描

当查询的列需要进行模糊匹配时,即使建立索引,也会全表扫描

虽然索引合并策略能够在一定条件下改善组合条件查询,
但是,完全可以通过建立多列索引来避免索引合并给数据库带来额外的开销

最左前缀原则
如果查询不是按照索引的最左列来开始查询,则无法使用到组合组合索引
order by语句和group by 语句同样也遵循最左前缀原则

  • 合理使用索引
  • 反范式设计
    将一些常用的关联查询的列进行冗余存储,减少表关联查询带来的随机io和全表扫描
  • 使用查询缓存
  • 使用搜索引擎
  • 使用key-value数据库
jsp  # 输出jvm虚拟机进程的一些信息
jstat # 对虚拟机各种运行状态进行监控
jinfo # 查看应用程序的配置参数,还能够在运行期修改jvm参数
jstack # 生成jvm当前的线程快照信息,就是每个执行方法堆栈集合
jmap # 查看等待回收对象的队列,查看堆的概要信息

BTrace java程序动态跟踪工具


内存溢出 dump当前的堆信息


线程死锁是因为资源竞争,可能是因为信号量没释放等问题
会造成请求时间长时间没有响应,应用僵死
此时的系统资源消耗cup load很低


类加载冲突
在jvm启动时加上 -verbose:class ,就可以查看到具体的class究竟从那个jar加载的


链接:https://pan.baidu.com/s/1Kw4T9IVfTPcvG5PcoNG4YQ 密码:6ee9 《大型分布式网站架构设计》

猜你喜欢

转载自blog.csdn.net/java_sparrow/article/details/90340226
log