如何思考问题与思考具体问题同等重要。html
如何思考一个技术问题?如何高效地理解某个技术 ?如何快速学习一个新的技术点 ? 这都须要一个好的技术思考框架。缺少思考框架,知识和技术就变成一堆细节的堆砌,缺少关联,难以理解和记忆,也就难以掌握和应用。程序员
本文来探索一种好的技术思考框架。
redis
在多年的开发生涯及阅读和理解源码的过程当中,我逐渐造成了一种我的以为比较可行的技术思考框架:“抽象-思路-考量-优化-细节” 五步曲。算法
抽象数据库
抽象很是重要。一个典型的例子是删除操做。删除操做提供的是“用户不可见”的抽象。能够采用两种思路:缓存
能够看到,提供良好的抽象,而不是直觉上按照用户的要求去作,每每会带来更灵活的设计空间。安全
抽象最好能用一句话归纳。好比,文字编辑器(UI界面)提供的是“所见即所得”的抽象;理财产品提供的是符合利率模型的计算抽象。
服务器
思路网络
思路是如何去基本实现的问题。在问题讨论初期,提出尽量多种思路,应对不一样的场景。好比排序,就有插入排序、冒泡排序、快速排序、合并排序、希尔排序、桶排序、外部排序、多关键字排序等。不一样的排序具备不一样的特性,在不一样的场景下使用。挖掘尽量多的思路,有助于拓展对问题的思考。好的思路是成功的一半。架构
考量和优化
考量和优化每每须要丰富的开发实践经验。知道往哪一个方向使力,如何使力,须要解决什么技术难点等。
细节
在掌握宏观视角后,细节的打磨尤其重要。细节处理不当,可能会致使总体工做前功尽弃。程序员或工程师的一大特质,便是体如今细节的考虑和思惟的缜密上。
考虑各类错误和异常,考虑依赖服务、服务器、网络等的不可靠,是作好细节工做的必要前提。
抽象
持久化,便是给用户提供一个“数据保存了、即便掉电或重启也能从某处找回数据”的抽象。
思路
如何实现 Redis 持久化 ? 持久化就是将 Redis 内存数据库的数据集状态保存在某个磁盘文件里。能够基于两种思路:
考量
实际工程中要考虑什么因素呢 ?
优化
针对上述考量因素,可制定相应优化措施:
细节
RDB 机制的细节:
AOF 机制的细节:
再来思考一个问题:如何应对高并发流量呢?这是互联网应用必然面对的一个重大挑战。
抽象
高并发流量问题,本质是资源有限的问题。便是用有限的资源去应对不肯定性的巨大流量的矛盾。假设有足够的资源,加以适当的水平扩展,高并发也不算什么事。难在用现有的架构、现有的资源来应对巨大流量,并且不管预留多少资源,老是不必定能承载将来可能降临的超过负载能力的峰值流量。
思路
既然是资源有限的问题,那么思路也就三条:
考量
优化
提高服务能力:
用好缓存:能够提高 QPS ,但依然没法阻挡高并发流量;
熔断降级:高并发状况下,自动熔断次要的链路,提高 QPS;
读写分离: 将高并发流量中的读写部分分开,读写分别处理;
分库分表: 提高 DB 的并发处理能力;
弹性扩容:要求应用可以弹性部署和启动。在大促活动以前,能够提早扩容。目前难以应对瞬时峰值。
加资源(在不一样层面):
加资源的同时作好负载均衡(分流做用)。经过负载均衡进行分流,一部分流量直接进入服务器,一部分流量走消息队列再走服务。负载均衡可采用七层的 ngnix 和 四层的 LVS 或 F5。负载均衡能抗住大流量;
多机房 + CDN:多机房 + CDN + 负载均衡,分别抗住来自不一样地区的大流量。
限流: 仍然没法承载的流量,采用限流处理掉。
细节
高并发其实是一个实操性很强的事情。没有通过高并发流量的洗礼,只谈理论终究仍是隔着点。不过,至少要了解相关理论,才能在实战中积极运用并积累经验。
从上述示例能够看到:
抽象、考量和优化,须要建基于一个比较丰富的技术体系结构。为何考虑这个问题而不考虑那个问题?为何选择优化这个而不是优化那个?技术知识点是很是繁杂琐碎的,缺少技术体系结构来有效地组织起来,极可能会脑中一团浆糊,分不清东南西北,对着各类新技术望洋兴叹。
所以,打造一个适合本身的技术体系结构很是重要,这也是将来的核心竞争力之一。好比 “互联网应用服务端的经常使用技术思想与机制纲要” 便是围绕“数据处理”这个中心主题,从灵活性、高性能、高可用、高可靠、一致性、海量、安全、自动化、智能化八个方面打造的技术体系结构。这个体系结构几乎能够容纳各类技术流派和技术优化手段。
本文探讨了一种技术思考框架:基于技术体系结构的“抽象-思路-考量-优化-细节”五步曲。
合适的抽象会带来更灵活的设计空间和思路,而考量则会决定优化的大方向,在优化的过程当中解决细节问题。在学习技术的过程当中,要逐步打造适合本身的技术体系结构,不断充实这个体系结构,从而具有更强的系统思考力和技术吸取力。