池化技术
应用场景
数据库连接、任务队列
- 用连接池预先建立数据库连接
- 用线程池预先创建线程
二者的共同点
创建过程比较耗时,也比较耗资源。
解决思路
把它们放在一个池子里统一管理起来,达到提升性能和资源复用的目的。
这是一种常见的软件设计思想, 池化技术。
核心思想
空间换时间。
优点:期望使用预创建好的对象来减少频繁创建对象的性能开销,同时还能做到对对象的统一管理,降低对象的使用成本。
缺点:消耗多余内存,可能造成内存的浪费。增加了系统的启动时间。
小结
- 池子的最大最小值很重要,初期可以根据经验来设置
- 池子中的对象需要在使用之前被创建,这叫作池子的预热。如果池子未经过预热可能会导致系统重启后产生较多的慢请求
- 池子的核心技术是空间换时间优化方法的实践,所以要关注空间占用情况,避免出现内存泄漏和频繁 GC
8 数据库优化方案 1 :主从分离
主从分离可以解决什么问题
解决突发的数据库读流量,是一种数据库 横向扩展 的方法。
即查询流量增加时,我们优先考虑主从分离。
主从分离会带来什么问题
读写分离后, 主从延迟 是一个关键的监控指标,可能会造成写入数据后立刻读数据读取不到的情况。
业界有很多方案可以屏蔽主从分离后访问数据库的细节,就像是访问单一数据库一样。
使用主从分离技术后需要考虑的两个问题
- 主从的一致性和写入性能的权衡
如果要保证所有的从节点都写入成功,那么写入性能一定会受影响。
如果你只写入主节点就返回成功,那么从节点就有可能出现数据同步失败的情况,从而造成主从的不一致
- 主从的延迟问题
很多诡异的读取不到数据的问题可能都和它有关,如果遇到这类问题,不妨先看看主从延迟的数据。
我们采用的很多组件都会用到主从分离技术,比如:
- Redis,通过主从复制实现读写分离
- Elasticsearch 中存储的索引分片也可以被复制到多个节点中
- 写入到 HDFS 中文件也会被复制到多个 DataNode 中
只是不同的组件对于复制的一致性、延迟要求不同,采用的方案也不同。
但这种设计思想是通用的,是我们需要了解的,这样在学习其他存储组件的时候就能够触类旁通了。
9 数据库优化方案 2 :分库分表
//TODO
10 发号器:分布式唯一 ID
//TODO
11 NoSQL
//TODO
.png?table=block&id=eaef8e53-ddc4-4e54-8867-e2b52dcf3833&cache=v2)