PHP架构师之路-长期持续

PHP架构师之路–长期持续

重点

  • LNMP系统架构能力,至少选择一个领域彻底深入进去,同时尽力拓宽知识面,为架构和技术决策提高眼界能够独立完成各种LNMP系统的架构工作,能够在某个领域Hold住全场,能够解决该领域各种复杂问题,提供较为专业的技术支持和决策

目标

  • 能够独立完成各种LNMP系统的架构工作,能够在某个领域Hold住全场,能够解决该领域各种复杂问题,提供较为专业的技术支持和决策

知识点

Linux

  • 能够使用很多高级复杂的命令完成工作(watch/tcpdump/starce/ldd/ar等)
  • 能够编写比较复杂的shell脚本(超过500行)来协助完成很多包括备份、自动化处理、监控等工作;
  • 对awk/sed/perl等应用已经如火纯青,能够随意操作控制处理文本,统计分析各种复杂格式的数据;
  • 对Linux内部机制有一些了解,对内核模块加载、启动错误等等有个基本的处理;同时对一些其他相关的东西也了解,比如NFS、磁盘管理等等;

Nginx

  • 能够把Nginx操作的很熟练,能够对Nginx进行更深入的运维工作,比如监控、性能优化,复杂问题处理等等;
  • 看个人兴趣,更多方面可以考虑侧重在关于Nginx工作原理部分的深入学习,主要表现在阅读源码开始,比如具体的master/worker工作机制,Nginx内部的事件处理,内存管理等等;
  • 同时可以学习Nginx扩展的开发,可以定制一些自己私有的扩展;
  • 同时可以对Nginx+Lua有一定程度的了解,看看是否可以结合应用出更好模式;这个阶段的要求是对Nginx原理的深入理解,可以考虑成为Nginx方向的深入专业者。

MySQL\MongoDB

  • 能够完成一些复杂操作,比如大批量数据的导入导出,线上超大表的表结构更改或者增删索引字段等高危操作;
  • 能够处理更多复杂的MySQL的问题,比如各种问题的追查,主从同步延迟问题的解决、跨机房同步数据方案、MySQL高可用架构等都有涉及了解;
  • 对MySQL应用层面,对MySQL的核心关键技术比较熟悉,比如事务机制(隔离级别、锁等)、对触发器、分区等技术有一定了解和应用;
  • 对MySQL性能方面,有包括磁盘优化(SAS迁移到SSD)、服务器优化(内存、服务器本身配置)、除了二阶段的其他核心性能优化选项(innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout等)、连接池软件选择应用,对show*(show status/show profile)类的操作语句有深入了解,能够完成大部分的性能问题追查;
  • MySQL备份技术的深入熟悉,包括灾备还原、对Binlog的深入理解,冷热备份,多IDC备份等;
  • 在MySQL原理方面,有更多了解,比如对MySQL的工作机制开始阅读部分源码,比如对主从同步(复制)技术的源码学习,或者对某个存储引擎(MyISAM/Innodb/TokuDB)源码的学习理解,如果条件允许,可以参考CSV引擎开发自己简单的存储引擎来保存一些数据,增强对MySQL的理解;
  • 在这个过程,如果自己有兴趣,也可以考虑往DBA方向发展.MongoDB层面,可以考虑比如说在写少读多的情况开始在线上应用MongoDB,或者是做一些线上的数据分析处理的操作,具体场景可以按照工作来,不过核心是要更好的深入理解RMDBS和NoSQL的不同场景下面的应用,如果条件或者兴趣允许,可以开始深入学习一下MongoDB的工作机制

Redis/Memcached

  • 建议阅读Memcached的源码,特别是内存管理部分,方便深入理解;
  • Redis部分,可以多做一些复杂的数据结构的应用(zset来做排行榜排序操作/事务处理用来保证原子性在秒杀类场景应用之类的使用操作);
  • 多涉及aof等同步机制的学习应用,设计一个高可用的Redis应用架构和集群;
  • 建议可以深入的学习一下Redis的源码,把在第二阶段积累的知识都可以应用上,特别可以阅读和充分学习一下包括核心事件管理、内存管理、内部核心数据结构等。如果兴趣允许,可以成为一个Redis方面非常专业的使用者。

MySQL\MongoDB:

  • 能够完成一些复杂操作,比如大批量数据的导入导出,线上超大表的表结构更改或者增删索引字段等高危操作;
  • 能够处理更多复杂的MySQL的问题,比如各种问题的追查,主从同步延迟问题的解决、跨机房同步数据方案、MySQL高可用架构等都有涉及了解;
  • 对MySQL应用层面,对MySQL的核心关键技术比较熟悉,比如事务机制(隔离级别、锁等)、对触发器、分区等技术有一定了解和应用;
  • 对MySQL性能方面,有包括磁盘优化(SAS迁移到SSD)、服务器优化(内存、服务器本身配置)、除了二阶段的其他核心性能优化选项(innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout等)、连接池软件选择应用,对show*(show status/show profile)类的操作语句有深入了解,能够完成大部分的性能问题追查;
  • MySQL备份技术的深入熟悉,包括灾备还原、对Binlog的深入理解,冷热备份,多IDC备份等;
  • 在MySQL原理方面,有更多了解,比如对MySQL的工作机制开始阅读部分源码,比如对主从同步(复制)技术的源码学习,或者对某个存储引擎(MyISAM/Innodb/TokuDB)源码的学习理解,如果条件允许,可以参考CSV引擎开发自己简单的存储引擎来保存一些数据,增强对MySQL的理解;
  • 在这个过程,如果自己有兴趣,也可以考虑往DBA方向发展.MongoDB层面,可以考虑比如说在写少读多的情况开始在线上应用MongoDB,或者是做一些线上的数据分析处理的操作,具体场景可以按照工作来,不过核心是要更好的深入理解RMDBS和NoSQL的不同场景下面的应用,如果条件或者兴趣允许,可以开始深入学习一下MongoDB的工作机制

PHP:

  • 从基本代码应用上面来说,能够解决在PHP开发中遇到95%的问题,了解大部分PHP的技巧;
  • 对大部分的PHP框架能够迅速在一天内上手使用,并且了解各个主流PHP框架的优缺点,能够迅速为新项目做技术选型;
  • 在配置方面,了解一些比较偏门的配置选项(php auto_prepend_file/auto_append_file),包括扩展中的一些复杂高级配置和原理;
  • 对php的工作机制比较了解,包括php-fpm工作机制,对zend引擎有基本熟悉(vm/gc/stream处理),阅读过基本的PHP内核源码,对PHP内部机制的大部分核心数据结构(基础类型/Array/Object)实现有了解,对于核心基础结构(zval/hashtable/gc)有深入学习了解;
  • 能够进行基本的PHP扩展开发,了解一些扩展开发的中高级知识(minit/rinit等),熟悉php跟apache/nginx不同的通信交互方式细节(mod_php/fastcgi)

C/C++:

  • 除了第二阶段的基础C/C++语法和数据结构,进一步学习一些特殊数据结构(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等);
  • 熟悉多进程、多线程编程;
  • 多进程情况下面了解大部分多进程之间的通信方式,能够灵活选择通信方式(共享内存/信号量/管道等);
  • 多线程编程能够良好的解决锁冲突问题,并且能够进行多线程程序的开发调试工作;
  • 同时对网络编程比较熟悉,了解多进程模型/多线程模型/异步网络IO模型的差别和选型,熟悉不同异步网络IO模型的原理和差异(select/poll/epoll/iocp等),并且熟悉常见的异步框架(ACE/ICE/libev/libevent/libuv/Boost.ASIO等)和使用,如果闲暇也可以看看一些国产自己开发的库(比如muduo);
  • 同时能够设计好的高并发程序架构(leader-follow/master-worker等);
  • 了解大部分C/C++后端Server开发中的问题(内存管理、日志打印、高并发、前后端通信协议、服务监控),知道各个后端服务RPC通信问题(struct/http/thirft/protobuf等);
  • 能够很熟练的使用GCC和GDB来开发编译调试程序,能够迅速追查跟踪解决问题;
  • 通用模块开发方面,可以积累或者开发一些通用的工具或库(比如异步网络框架、日志库、内存池、线程池等),不过开发后是否应用要谨慎,省的埋坑去追bug;

前端:

  • 深入了解HTTP协议(包括各个细致协议特殊协议代码和背后原因,比如302静态文件缓存了,502是nginx后面php挂了之类的);
  • 除了之前的前端方面的各种框架应用整合能力,前端方面的学习如果有兴趣可以更深入,可以自己开发一些类似jQuery的前端框架,或者开发一个富文本编辑器之类的比较琐碎考验JavaScript功力;

其他开发语言:

  • 建议在当前阶段可以尝试学习不同的编程语言,看个人兴趣爱好,脚本类语言可以学学 Python/Ruby之类的,函数式编程语言可以试试Lisp/Haskell/Scala/Erlang 之类的,静态语言可以试试Java/Golang,数据统计分析可以了解了解R语言,如果想换个视角做后端业务,可以试试Node.js还有前面提到的跟Nginx结合的Nginx_Lua等。
  • 学习不同的语言主要是提升自己的视野和解决问题手段的差异,比如会了解除了进程/线程,还有轻量级协程;
  • 比如在跨机器通信场景下面,Erlang的解决方案简单的惊人;
  • 比如在不想选择C/C++的情况下,还有类似高效的Erlang/Golang可用等等;主要是提升视野。

其他专业方向:

  • 看个人兴趣和长期的目标方向。目前情况能够选择的领域比较多,比如、云计算(分布式存储、分布式计算、虚拟机等),人工智能和机器学习(数据挖掘、模式识别等,应用到统计、个性化推荐),自然语言处理(中文分词等),搜索引擎技术、图形图像、语音识别等等。除了这些高大上的,也有很多偏工程方面可以学习的地方,比如高性能系统、移动开发(Android/IOS)、计算机安全、嵌入式系统、硬件等方向。

系统架构设计:

  • 能够应用掌握的经验技能,设计出比较复杂的中大型系统,能够解决大部分线上的各种复杂系统的问题,
  • 完成类似浏览器->CDN->负载均衡->接入层->Nginx+PHP->业务缓存->数据库->各路复杂后端RPC交互(存储后端、逻辑后端、反作弊后端、外部服务)->更多后端这样的复杂系统;
  • 能够支撑每天数千万到数亿流量网站的正常开发维护工作。