数据密集型应用系统程序设计-读书笔记
当下所有的应用系统都是数据密集型,不是计算密集型,系统瓶颈不是因为CPU算力不足,而是因为大数据量带来的数据存储,数据计算,数据同步以及数据更新带来的一系列问题,具体表现形式有以下几种,比如redis和数据库的双写一致性问题,消息积压问题,redis集群或者MySQL集群中主从节点的数据同步问题,以及redis持久化问题。包括对于程序员来讲最大的并发同步问题实际上就是短时间内的大量数据计算,存储以及更新问题。
目前所有的系统结构设计都有如下的功能模块
- 数据持久化模块,保存我们的数据用于记录但是的系统状态,常用就是数据库,比如MySQL,MongoDB等数据库
- 缓存模块,记录昂贵的系统消耗的结果,用来降低系统压力加快下一次的读取速度。比如redis,RocksDB等内存数据库。
- 搜索模块,用户可以通过关键字进行搜索以及对数据按需要进行过滤,常见的就是ES流处理,给其他进行进行发消息进行异步处理,减少系统压力,提高系统响应时间。比如常见的消息中间件MQ
- 批处理,用于定时进行数据同步,比如我们常用的脚本和定时任务。
redis,rocketMQ等各种中间件都有自己的独特的使用场景的特点,只能高效实现某种特定功能(比如redis重要就是用做换缓存,MQ基本都是用来异步,解耦,削峰,当时目前MQ都开始支持事务消息以保证对分布式事务进行支持和补偿)我们应用代码就是将各种中间件进行缝合成一个整体,同时保证数据在这些中间件中流转的正确性。
- 当系统出现问题时如何保证数据的正确性和完整性
- 当系统面临巨大压力出现降级如何保证用户依然有良好的体验
- 当系统进行扩容时如何保证数据的正确性和完整性
- 可靠性
在超出预期负载和数据量下性能满足要求
系统能够有效拦截未经授权的访问
总结就是系统出现故障依然能够继续为用户提供服务。但是故障不等于失效。对于应用层面的代码而言,我们在日常业务实现和代码编写过程中的注意事项就是
避免死锁消耗CPU,内存等公共资源而降低整体系统性能。
级联故障,应用服务依赖的基础服务出现异常时导致服务不可用或者基础服务报错直接展现给用户。
- 可伸缩性
我们的系统为随着时间的增加,用户量和数据量也会同步增加。在负载增加的同时如何保证系统依然可用就是可伸缩性。
- 负载考量
- 性能描述
有时候还会出现头部阻塞现象,由于服务器CPU数量有限,只能并行处理一定量的事务,只要有少量请求阻塞就能阻碍后面的请求处理导致后面所有客户端的响应时间变长。有时候当一个请求需要多个后端请求时那么这个请求的响应时间就成了最慢的请求响应时间。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 使用协程爬取网页,计算网页数据大小
- Java|Java基础——数组
- Python数据分析(一)(Matplotlib使用)
- Jsr303做前端数据校验
- Spark|Spark 数据倾斜及其解决方案
- 数据库设计与优化
- 爬虫数据处理HTML转义字符
- 数据库总结语句
- MySql数据库备份与恢复