大量阅读别人的系统实现文章(
架构= 模块图 + 模块流程图(启动 和 主流程 ,可以用拟物 tag) 或者 模块时序图) 懂得中台思想,user-biz core层.
动态+静态 .对象很重要,模块很重要. 从产品角度,用户很重要
画架构图: 参考产品: 一张图讲清楚产品架构,手把手教你画产品框架图 ( 产品架构图) .另外一篇文章"以红包雨的需求为例,问题域是这样一个集合". 架构图静态,最好有交互action,数据流. 层级一致: 1. 系统级,每个框里可能都有(h5,服务端等角色) 2. 端和服务端分开的架构图. 会复杂,但是对开发来说明确,透明.
中台思想: 就是表面上的互相调用,看出内部本质的分层+ 中台思想. 底层组件互相是独立的.这样子才能实现上层业务的快速组装.
脑图不需要按空格,收缩行
https://www.processon.com/view/link/58c7cbbfe4b020bb58b2e0d6
架构脑图
编辑脑图
我理解的架构师需要掌握的知识
1. 用例收集能力,业务模块切分能力.领域设计能力.
功能设计,非功能设计.
没有用例图的实体图就是耍流氓.
实体生命轴
对于builder设计模式,其实就是基于用例抽象出方法后自然就实现了. 对复杂的代码,先看理解,然后思考行为,用例.然后再重构. 三步法.
* 规划能力,分解能力,抓手和指导能力.
人角度切割(乘客,客服,司机,运营),视图层业务. 将用户角度的视为前台主业务.
基础服务抽取的时候,存储和计算分离也很自然. 积分和积分计算,帐户和营销加款
2. 类设计和编程落地能力. 能写高可读和应对变化,可维护代码.
熟悉java锁源代码,readwritelock.
缓存策略代码写. 分层.
jvm各命令含义. jmap -heap jstack
jvm paral cms g1垃圾回收算法.特别是g1
锁力度
for 1w问题
分页问题,两次查询分库分页.
方法同层次
try 重试. 单次可用性,dubbo check
tcp nagle . http://blog.csdn.net/ithzhang/article/details/8520026 .
国际路线问题,数据双活.
type类化,字段类化(map等)可带走一大堆相关逻辑到对象中.
3. 看别人代码能力,可重构点能力. 分层不合适,方法抽取, 重复代码合并下层 ,类型接口化. 见面向领域设计p203的闭合运算重构
3. 承担系统重构和切分的方案和项目推进落地.
dao不动,先动service.
各层次接口化,杜绝依赖.
包依赖插件检查.
4. 高可用,高并发,可扩展性.各场景方案的了解.
稳定性(n个接口1个失败) 链路error日志统计归类,基于结构化日志.,可用性(). 可靠性(持续一段时间不可用是最悲剧的)
单行极限和可用性互斥. 高并发的方案就是拆拆拆.
zk不可扩展.把他认为是单机.前面搭建一个proxy 一致性hash集群.
超时解决方案是环.(超时30秒,格30个,误差1秒),两各数组切换.误差 30-59秒.(从启动,到切换,再切换,三次画图可知.)
分布式自增id .
架构. ngnix前面是智能dns. 双活和cdn基础.
SNow(并发太高可能重复)和腾讯的序列号自增方案.
高并发io相关技术,io中断多核并行.达到几万tps. 不然才1w tps. io超时回收, 环.
算法,B+树,hadoop排序(数据预清洗). mysql 多行高并发和单行高并发改造.
AB Test指标可配置接口化系统,流式计算接口化系统.
一键降级系统
低耦合配置系统(低耦合,依赖本地文件存储) kdiamond 开源其他
全链路压测,
计算同城双活(跨城专线通信,增加用户体验),数据同城双活(类version,cas保障,虚拟ip可随时切换.),依据人变动可切换该人主数据的双活.
可伸缩的DBproxy中间件,codis.
弹性计算云,kubernoter coker
kop
redis进化为zk. 同时复制两台. 客户端1访问redis1,客户端2访问redis2.无法解决,zk通过master来解决.
中国开源软件评选 http://www.oschina.net/project/top_cn_2016?sort=1
5. 业务growth能力和对应体系了解和搭建能力.
AB TEST平台.
6. 系统见识.
kop 规则引擎 流程引擎
快速开发框架 crm快速web设计系统.
1、实现一个带超时功能的connect函数
考察点:linux网络编程、non-blocking、select/poll/epoll的使用、对底层库的了解程度
默认的connect为阻塞,通过设置socket为non-blocking、监听写事件来做到非阻塞超时connect。
参考点:大多数网络库都有相关或类似实现,最直接的可以看golang net库源代码,其DialTimeout的底层实现即是此问题。
引伸点:
(1)若面试者能答出用select或epoll实现,进一步考察select、epoll工作原理,如epoll是如何存储fd的,如何做到用“回调机制”将就绪的fd返回,select和epoll区别等;
(2)linux网络编程的其他要点或其他函数的使用,如shutdown、reuseaddr,进而可引伸出TCP协议状态机、TCP协议粘包处理、TCP协议滑动窗口机制、TCP包重发机制等;
(3)IO多路复用处理并发网络连接的基本模型、要点;
(4)对boost asio、libevent、libev或其他库的了解程度;
(5)线程池的实现以及要点。
2、实现一个简单的内存池管理,要求在多线程环境中高效使用
考察点:内存模型、内存分配过程、内存碎片处理、对tcmalloc之类的库的了解程度、对STL了解程度
参考点:主要可参考tcmalloc实现,golang内存分配和gc机制也是类似原理。
引伸点:
(1)若面试者能大概答出tcmalloc的架构,可进一步考察用户空间如何从内核空间申请内存,包括相关的系统调用;
(2)默认的库函数malloc/free(new/delete)的不足之处在哪?为什么要引入这样的东西?STL默认的内存分配器是如何工作的,有没有什么问题?
(3)若能答出golang或其他语言的内存分配和gc的类似机制,进一步考察对实现细节的了解程度;
(4)可引伸至fork、vfork、copy-on-write、无锁队列等问题进一步考察。
3、实现一个线程安全的单例模式
考察点:c++基础、设计模式、多线程编程、各种同步机制
参考点:遍地可找到,如果此问题都答不出,在架构组基本不用考虑继续面
引伸点:
(1)单例模式的“懒汉”和“饿汉”的区别,如其实现的是“懒汉”模式(通常答的都是这个),考虑让其以“饿汉”模式实现,可以适当提示,同时,两种模式各有什么优缺点?
(2)进一步考察c++基础问题,考察其对c++的理解程度,包括RTTI、c++对象模型、虚函数工作原理、虚表结构等问题;
(3)基于(2),进一步考察如java语言或go语言都填了c++的哪些坑,这样做的目的是什么?
(4)c++的一些经典内存问题,如构造函数异常、非线程安全的析构等,进一步可引伸出智能指针的原理及使用要点;
(5)进一步考察其对boost、c++0x等对此问题相关的支持及面试者的了解程度;
(6)进一步考察多进程、多线程的各种同步机制及其差异,可进一步要求其实现一个经典的生产消费者模型;
4、实现hash表动态扩容缩容的过程
考察点:经典数据结构、多线程编程、“双缓冲buffer”的类似思想
参考点:redis的hash table动态扩容缩容过程
引伸点:
(1)此问题通常是面试者提到“了解、熟悉甚至精通redis”的情况下问出,如其能答出,进一步考察redis其他核心实现的要点,如事件驱动机制、如何写rdb,redis如何做持久化,持久化的时候又有什么问题?进而的解决方案是什么?
(2)进一步可引伸出redis代理,如twemproxy、codis的相关原理及实现;
(3)进一步了解其对底层数据结构的掌握程度,如跳跃表、RB树、B树等各种对比,进一步可引伸出LSM树和基于LSM树的各种DB,如level DB,列式存储等,进一步可考察mysql架构、mysql各种存储引擎的对比,mysql如何做分库分表、sharding、主从同步以及不足之处在哪?
(4)进一步了解其对其他第三方开源组件的了解程度,如常用的消息队列。
5、实现一个简单的3份数据冗余同步复制过程或双机热备主从同步过程
考察点:分布式存储经典问题、分布式原理、各种分布式协议
参考点:hadoop的相关实现
引伸点:
(1)GFS及类似GFS的分布式存储系统的架构及其实现,NWR、CAP、paxos、raft、二阶段提交等协议,以及这些协议到底解决了什么问题?
(2)可引伸出类似zookeeper、etcd等分布式协调服务的同步、选举过程
(3)如何做基于tcp长连接的心跳服务?
(4)实际工程中使用这些分布式系统的经验及了解程度
6、求和的绝对值最大的连续子序列 如{-5,4,-20,16,-2,-3}
考察点:算法
参考点:遍地是
引伸点:
(1)通常能给出O(n^2)算法即为OK,可进一步提示其优化至O(n )算法;
(2)进一步考察常用的算法分析方法,即分治、动态规划、回溯等,可进一步考察某些排序算法,如快排,但如果问到了快排,可进一步考察各种库如何实现了快排,做了哪些优化来避免最坏情况的发生?
(3)分析问题能力,是否用比较合适的方法来解决一个问题。
======其他人见解====
转至元数据起始
1.意识(下意识,条件反射式的修养,训练成与生俱来的能力)
(1)化繁为简(抽象建模,模型)
(2)运营(保证系统的可持续发展)
(3)有损(意外随时都会发生)
2.能力(是量的积累与升华沉淀的过程,需要不断的回顾与总结) 基本功,是一切的根源
(1)技术能力
初级:
中级:
高级:
(2)架构能力
初级( 达到上线水平):
中级:
高级:
(3)产品能力(产品意识,对产品的敏感程度,抓大去小)
(4)行业认知(对通用架构的补充)
(5)管理能力(技术管理)
3. 胸怀
(1)大局观(前瞻性)
(2)大将之风 (无畏,气度)
(3)好学(不耻下问)
敢于向职位级别低的人讨教问题
(4)乐于分享(成就他人)
突破个人天花板的关键,因为在分享的过程中才能发现自己到底有没有掌握,而且互相分享以后自己能力的提升速度会变的快
4.经验
(1)过载应对方案(学习海关)
注:队列也是一种方法,不过队列有可能超时(想象一下在银行取钱时排到自己时取款机没钱时或者打饭时轮到自己就没饭了是一种什么样的感受)
要敢于丢弃应付不过来的流量,并且提供一个很好的UI来减少用户的烦躁与忧虑感,提升用户的忍耐程度
流量控制(类似于TCP,流量越大则队列长度应该越短,以防系统处理不过来造成拥堵)
(2)下一层永远不相信上一层,上一层要充分保护下一层(即优先在最前端机绝大部分问题,越往后处理的代价就会越大)
(3)协程
(4)协议及通讯不受易购系统的影响
(5)边重构边生活是架构师的常态(要勇于重构,勤于重构,以防积重难返导致重构难度巨大)
(6)MCP