朱晔的互联网架构实践心得S1E1:Pilot

最近几年写博客确实写得少了,初出茅庐的时候什么都愿意去写,现在写一点东西之前会反复斟酌是否有价值。工作十几年了,做了N多个互联网系统,业务涉及教育、游戏、电商、O2O、P2P,算是各种类型的互联网系统都摸过,多少有一些心得,架构方面的文章网上很多很多,有些是说一些方法论,有些是说一些具体的案例,感觉自己想分享的东西和别人已分享的是有点不同的,还是应该留下点什么。在这里我更多想分享一下搭建一套完整的互联网系统架构方面一些具体的实践心得,大概会从这几个方面来写:

  1. 各种废话的闲聊和吐槽
  2. 屡试不爽的架构三马车:介绍一个简单实用的可扩展的互联网架构
  3. 相辅相成的存储五件套:介绍一下个人比较喜欢的一个存储组合以及适用场景
  4. 简单好用的监控六兄弟:介绍监控方面一直在用的一些工具以及强调监控的重要性
  5. 不断耕耘的基础中间件:中后期的项目需要有完善的基础中间件,这里进行逐一介绍
  6. 给飞机换引擎和安全意识十原则:分享一些对高速发展项目进行重构以及安全方面的一些经验
  7. 三十种架构设计模式(上):微软一些架构方面的设计模式
  8. 三十种架构设计模式(下):微软一些架构方面的设计模式
  9. 架构评审一百问和设计文档五要素:架构评审考察点和如何写设计文档
  10. 数据的权衡和折腾:以数据的维度谈谈架构设计中的权衡和复杂点

有关All-In-One架构

很多项目起步的时候都会以一个All-In-One的项目起步,使用一套MVC框架,对外提供数据的Controller、包含业务逻辑的Service、访问数据库的DAL、定时任务,所有的东西都在一个项目内,然后在半年和一年之后业务发展起来了急需对现在的架构进行重构(说的不好听就是推翻重来了),原因如下:

  1. 超过5人在同一个大项目中修改代码,分支管理代码冲突解决成本太高了。
  2. 随着压力的上升这么简单的直肠子架构很难去拆分分散压力从而顶不住高并发。
  3. 虽然对于MVC我们会有明确的目录来存放三大组件的逻辑但是随着业务逻辑越来越复杂,我们会有聚合的Controller和聚合的Service产生,所有组件不再位于同一个水平面,代码全都堆积在一起腐化很快,容易形成复制粘贴的趋向。

除非已经明确是实验性临时性的项目,我个人不建议以这样的方式起步,使用一个相对简单的架构(见文2)并不会浪费太多的时间,但是这个开局往往可以避免之后的推翻重来。

有关百花齐放的平台和语言

我个人从.NET转到Java平台,之前的公司有使用过PHP,Python,Go。经历过.NET和PHP转Java,经历过混用各种语言的公司。在这几想说几点:

  1. 曾经犯过错,在团队不大的时候允许保留两种技术PHP和Java同时发展。无论大小,每个团队的成员都需要自己的技术发展和晋升,每个技术栈都有不同的运维方式,每个技术都会有各自的妖怪问题,在一个规模不大的技术团队里同时使用多个技术,对于团队来说真是一个很大的消耗。语言的确有各司其职发挥所长之说,但是小于30人规模的开发团队真没必要这么早进行技术栈的分叉。
  2. 随着团队规模的扩大,处于招聘成本、使用成本、性能、资源丰富性等等问题,往往会进行技术转型,许多平台花了几年时间都无法彻底从.NET或PHP转到Java,这是一个痛苦的过程。虽说技术负责人总是趋向于一开始使用自己熟悉的技术栈来搭建系统,但是不得不承认Java这门综合性很强的语言是一个不错的开局方式,开源资源丰富、好招人、高手多、开发效率还凑活、性能也不算差、少点折腾就能把精力更多放到业务上。倒不是说.NET和PHP不好,而是我们最后需要接受很多残酷的现实。
  3. 随着项目规模的扩大,很多东西势必需要自己来写,开源往往不适合,这个时候发挥语言各自的所长又会显得很重要。Go在性能方面、可移植性方面、开发效率方面、高并发友好性方面有独特的优势,是开发(网络)中间件的很不错的候选语言,往往可以替代C。Python的开发效率奇高,丰富的类库基本任何需求都是一行代码一句API解决问题,作为运维平台各种工具和爬虫的开发语言再适合不过,在AI方面也是鹤立鸡群无可替代。
  4. 开发应该多接触几门语言,这是非常有好处的。有些语言在高并发方面有优势,有些语言在函数式编程方面发展的很好,有些语言在语法糖方面设计的很漂亮,每个语言在其特色上所在的层次会比较高一点,也容易被其它语言借鉴,多看一些语言会让自己知道每一个技术能好到什么程度,不容易在综合性语言中成为井底之蛙。

有关平台架构团队和业务团队

技术团队到了一定程度不但会横向拆分为前中后台,还会纵向拆分为框架架构团队和业务团队,研发中间件或框架的平台架构团队和一心耕耘业务代码的业务团队我都待过。在架构团队的时候我们总会吐槽:

  1. 业务团队不愿意配合架构团队做技术升级,架构团队辛辛苦苦搞这些还不是在解决业务团队的问题?
  2. 业务团队太谨慎保守了总是担心架构升级影响现有系统,想法太老旧了一点架构意识都没有?

在业务团队的时候我们又会吐槽:

  1. 架构团队总是高高在上的样子,他们体会不到业务的复杂性,做出来的东西根本不实用,这么难用的东西还不如我们的土办法。
  2. 架构团队的人是不是很轻松,业务团队天天加班搞项目,架构团队貌似都是在喝茶聊天研究一些不实用的东西。

在这里想表达几个观点:

  1. 技术发展到一定的程度,一定是需要一些中间件或框架来做统一的事情,这些中间件结合在一起形成一个平台(见文5)可以大大减少出问题排错的时间,也可以让一些高并发下的优化工作更简单。
  2. 架构团队的架构师最好是在业务团队深耕过,知道痛点所在的,这样研发出来的系统和工具能够和公司目前的项目所匹配发挥最大的作用,让大家爱不释手。
  3. 在做架构升级的时候对业务侵入性越小越好,业务团队无感知最好,前提是我们的一些核心架构框架和中间件已经是统一的标准化的,有一些框架还是自己研发比较好,在之后的一些文中会提到这个观点。
  4. 做业务往往变动大,我们总是会习惯很多事情先手动来做,慢慢形成了对工具化自动化理念没有这么敏锐。如果在这个时候有局外人能参与一下说不定可以碰撞出很多好的框架和工具来帮助我们提高生产力,这其实是一个好事情。

朱晔的互联网架构实践心得S1E1:Pilot的更多相关文章

  1. 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招

    朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...

  2. 朱晔的互联网架构实践心得S1E10:数据的权衡和折腾【系列完】

    朱晔的互联网架构实践心得S1E10:数据的权衡和折腾[系列完] [下载本文PDF进行阅读] 本文站在数据的维度谈一下在架构设计中的一些方案对数据的权衡以及数据流转过程中的折腾这两个事情.最后进行系列文 ...

  3. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

    朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...

  4. 朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下)

    朱晔的互联网架构实践心得S1E8:三十种架构设计模式(下) [下载本文PDF进行阅读] 接上文,继续剩下的15个模式. 数据管理模式 16.分片模式:将数据存储区划分为一组水平分区或分片 一直有一个说 ...

  5. 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)

    朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上) [下载本文PDF进行阅读] 设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践.在经过多年的软件开发实践之后,回过头来去看23种设 ...

  6. 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则

    朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则 [下载本文PDF进行阅读] 本文有两个部分,先介绍一下给飞机换引擎这个事情我的一些经验,因为篇幅较短然后介绍一下安全意识方面的一些心得. ...

  7. 朱晔的互联网架构实践心得S1E5:不断耕耘的基础中间件

    朱晔的互联网架构实践心得S1E5:不断耕耘的基础中间件 [下载本文PDF进行阅读] 一般而言中间件和框架的区别是,中间件是独立运行的用于处理某项专门业务的CS程序,会有配套的客户端和服务端,框架虽然也 ...

  8. 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟

    朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟 [下载本文PDF进行阅读] 这里所说的六兄弟只指ELK套件(ElasticSearch+Logstash+Kibana)以及TIG套件(Tele ...

  9. 朱晔的互联网架构实践心得S1E3:相辅相成的存储五件套

    朱晔的互联网架构实践心得S1E3:相辅相成的存储五件套 [下载本文PDF进行阅读] 这里所说的五件套是指关系型数据库.索引型数据库.时序型数据库.文档型数据库和缓存型数据库. 上图显示了一套读写服务搭 ...

随机推荐

  1. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  2. Jmeter学习——http请求Content encoding的重要性

    今天在测试一个接口的时候,遇到的问题,困扰了我一天 下面是一个接口,使用的是post请求,Content-Type为application/json 返回参数如下: 瞬间懵逼了!!!为什么呢?渠道是存 ...

  3. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  4. Q2Day81

    性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...

  5. adb入门学习笔记

    连接模拟器(模拟器桥接模式) 使用adb devices列出已连接到工作站的设备. 使用adb shell 启动设备或模拟器上的shell. 列出设备已安装的所有软件包 将电脑文件移动到手机模拟器上( ...

  6. 【转载】failed to initialize nvml driver/library version mismatch ubuntu

    英伟达驱动版本是384.130 显示的NVRM version: NVIDIA UNIX x86_64 Kernel Module是:384.130. 若是旧的版本就会出现如下问题. 这个问题出现的原 ...

  7. Git Extensions 使用小结

    1.查看仓库 2.创建分支 然后会自动创建一个 Commit ,推送到远端分支即可. 3.合并分支 注意1.自动提交需要没有无法自动合并的冲突才行. 注意2.快进线指的是将别人的提交原封不动附加到自己 ...

  8. 【算法】LeetCode算法题-Search Insert Position

    这是悦乐书的第152次更新,第154篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第11题(顺位题号是35).给定排序数组和目标值,如果找到目标,则返回索引. 如果没有, ...

  9. Docker: docker image常用命令实战

    #docker列出镜像[root@192 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx latest 881bd08c0b08 ...

  10. 新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo

    新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo ...