静儿来面试新美大这个部门的时候,HR跟我说我们是最核心的部门,没有之一。我以为这是句夸张的招人用的玩笑。结果来了发现,额,这句话是很公正客观的。现在上上下下组成了一支牛人团队,请来了其他部门很多资深高手进行封闭开发,确保我们系统的稳定性。
选择一份工作,必然要考虑的是:我们是做基础设施的,还是做平台的,还是做核心链路的。业务方面讲究领域驱动,各个领域目标也不同。
基础设施最重要的指标是稳定性、性能、扩展性。平台讲究多业务,通用性,人效。所谓人效就是我这个平台有些自动化的东西不能满足需求,需要靠手工来完成,这样开发人员的人效就低。如果一个平台需要输入的东西很多,而且还需要多步骤审核,审核不够自动,那么输入人效低,运营的人效也低。如果平台的用户是外部用户,他们输入繁琐,这个用漏斗分析法来分析,得出来的流失率会高。
checklist:
核心链路最重要的是稳定性。如果拿到一手烂代码,到了非重构不可的程度。那么重构之前要弄明白几个问题:原系统TOP5的主要问题是哪些?我重构了就能解决这些问题吗?重构之后怎样保证很长一段时间内不需要再次大规模重构?
对于任何一个系统,都要设计一个checklist。比如比较重要的:
大分类 | 小分类 | check项目 |
基础组件依赖 | 缓存 | 挂了是否可用、跟其他系统共用? |
MYSQL | 跟其他系统共用、慢查询、大事务、连接池监控状况、大表、读写分离、主从延时敏感? | |
MQ | 挂了是否可用、依赖消息的发送顺序? | |
日志 | 建议应用日志不超过磁盘的30%,使用日志组件的性能和稳定性? | |
其他组件,如databus | 是否有监控?是否单点?自动fail over? | |
依赖内外部系统 | 下游系统1 | timeout配置?重试次数?满足幂等性?TP99?挂掉后是否稳定? |
下游系统2 | timeout配置?重试次数?满足幂等性?TP99?挂掉后是否稳定? | |
被依赖内外部系统 | 上游系统1 | 是否限流?timeout配置?重试次数?满足幂等性?TP99?挂掉后是否稳定? |
上游系统2 | 是否限流? timeout配置?重试次数?满足幂等性?TP99?挂掉后是否稳定? | |
核心接口性能 | 核心接口1 | QPS、TP99、可用性? |
核心接口2 | QPS、TP99、可用性? | |
JVM | 基本配置 | 堆栈配置、线程使用的监控报警、fullgc异常、无界队列、批量更新cache? |
容量预估 | 高峰期CPU load、高峰期内存、高峰期磁盘IO、高峰期网卡、是否有两到三倍冗余? |
组件和版本:
维护系统稳定性要注意选择合适组件和版本。
比如Apache Tomcat被纰漏有高危漏洞。当在应用配置文件web.xml中显式的配置DefaultServlet的readonly属性值为false时,恶意用户能够通过PUT请求方法上传文件,如果上传的是可执行文件,将会导致远程命令被执行。
jackson-databind2.9版本前有反序列化漏洞,它可能语序未经身份验证的用户通过将而已制作的输入发送到ObjectMapper的readValue方法来执行代码。如果服务器反序列化了不安全的数据,能造成服务器执行恶意代码。建议升级到2.9.2以上。
比如Apache Struts发布S2-054和S2-055安全公告,两个漏洞皆是因为调用了有问题的组件而产生的漏洞。
S2-054漏洞由于Apache Struts REST插件使用了过时的JSON-lib库,这个库很容易受到攻击,攻击者可以构造特制的JSON恶意请求造成DOS攻击。
由于Apache Struts调用了存在反序列化漏洞的Jackson JSON库,导致了反序列化漏洞。
外部依赖:
外部依赖,比如我们的下游系统、或者缓存,MQ等等。都需要在系统里处理好它们出问题的情况。测试方法是:将这些依赖的端口禁用,流量打过来后观察系统。系统线程数有没有飙升,超时是否合理,有没有异步化,有没有熔断?最重要的是:事务里不允许有外部依赖。