热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

“乐高式松耦合”架构实战

作者:王康白山联合创始人兼产品副总裁。王康先生主要负责产品的完善与升级、产品开发流程把控及进度协调、产品设计改进及定期优化、产品全生命周期管理等工作。他带领团队实现白山首款产品CD

作者:王康

白山联合创始人兼产品副总裁。
王康先生主要负责产品的完善与升级、产品开发流程把控及进度协调、产品设计改进及定期优化、产品全生命周期管理等工作。他带领团队实现白山首款产品CDN-X的多项创新,降低CDN使用门槛,极大拓展了CDN客户资源,提升了白山品牌价值,促进整体CDN市场的扩大与发展。
王康先生曾就职于网宿科技,任该公司产品及售前高级总监,负责技术团队的运营工作;拥有10年CDN行业经验,专注于提高产品输出的高质量和高可靠性。
王康先生拥有三项发明专利。

现在很多公司都在做松耦合,因为随着业务发展、需求增加,紧耦合系统的问题会慢慢凸显,并日益加剧。
以云分发行业为例,其属性在逐渐发生变化。过去,极少人产生内容,绝大多数人消费内容,云分发主要以下行流量为主,而随着全民直播的兴起,云分发变成了云交互;物联网的发展使物与物的数据交流成为主要方式,例如智能家居每天会产生上千条数据,但其中只有几条会被消费;VR爆发,用户产生的数据逐渐会从图片、视频转变为VR内容;基于此我们可以预料到上行流量将逐步增加,并逐渐超过下行流量,成为基础网络架构的巨大挑战。
用户需求与网络基础环境的快速变化,使得我们需要越来越快的实现需求,然而紧耦合系统却为研发带来诸多困难,使功能实现越来越耗费精力与时间,所以在白山创立之初就决定做“乐高式松耦合”架构,来构建整个产品体系,像搭积木一般灵活自如。

一、 传统难点
(1)需求堆积,收敛周期长
很多创业公司在成立之初采用野蛮生长的模式,原则是越快越好。紧耦合架构可以很好的满足这些要求,他们可以快速的建立CMDB与资源管理平台,并配置自动化、portal、监控等功能。但随着功能增多与需求开发的增加,这个系统逐渐变为一盘散沙。当有新需求发生时,他们需要为其做很多硬编码动作,收敛周期越来越长。
(2)“老中医”资源的浪费
在紧耦合系统中,看似一个没有什么关系的小改动,极有可能会引起一个重大bug;为防止错误发生,只能将系统设计的越来越复杂。例如为防止客户端挂掉,研发通常会为其添加一个守护进程;当守护进程不稳定时,新入职的研发常用的解决方案是再添加一个守护进程,这就导致了系统越来越臃肿。
这时候,公司往往就需要经验丰富、了解系统整体情况的“老中医”才能对平台进行改造。而作为核心资产的“老中医”在忙于救火、进行技术攻坚,很难抽出时间来进行系统重构。

二、 “乐高式松耦合”架构落地
快速实现需求与需求实现越来越慢的矛盾如何解决?最终白山的产品架构聚焦在解耦上,方便平台快速迭代,减少系统间依赖程度,打通无关联项目,为运营互动提供高效支持,确保服务质量。
(1) 第一层松耦合架构
以白山云分发CDN-X系统为例,其根本核心是运营。为使运营支撑系统通过解耦让公司的研发、运营灵活运转,需要进行第一层抽象。将运营支撑系统抽象为5个组件,包括:客户管理类、账单信息类、资源管理、运营监控和配置管理。并对这5个组件进行画像,确定边界、输入输出,按照运营场景描述用户场景。
几个组件之间通过消息总线交互指令,通过标准的reset接口交互数据;同时将5个组件投入到实际开发中,按照不同类型做实例化。
“乐高式松耦合”架构实战

(第一层松耦合架构)

(2)第二层松耦合架构
做完第一层解耦之后,我们发现第二层还可以继续做抽象。以配置管理系统为例,又可抽象出4部分。

  1. 生成配置:主要负责配置的生成以及配置到git仓库;

  2. 分发控制:管理灰度发布过程;

  3. 执行分发:分发收到的指令,并通过一些工具(如:salt、ansible、http get)汇报给上面的组件;

  4. 执行测试:调用已经写好的测试用例仓库测试这一次配置分发过程的最后效果。

“乐高式松耦合”架构实战
(第二层松耦合架构)

运营支撑系统中的各个组件都可以一直抽象下去,抽象概念贯穿整个设计平台的始末。
核心组件设计时再经过进一步抽象成工厂模式或单例模式,形成针对不同特性服务及场景,只需编写极小的落地代码即可获得整个运营支撑服务的可插拔架构。

(3)建设原则

  1. 组件即服务
    研发中人人都是架构师,收到研发需求后不是研究输入输出与边界,而是了解业务。根据情况输出需求文档,并与业务方进行确认,按照需求设计架构。每一个组件,不再是功能,而是服务,有自己的服务对象;研发人员从最初的对代码质量、输入输出负责,发展为对服务质量负责。

  2. 事件组件化
    在最初设计过程中,我们发现,很多运营中的动作称不上是平台上的动作,而是由事件组成。如果这些事件通过自动化来完成,就需要投入大量的精力。以节点上架自动化为例:包括自动化扫描端口、监控、安装、配置下发管理,甚至可以将自动化加入当前系统平台为用户提供服务。组件自动后,如果包装成事件,将浪费不必要的人力成本。如果将事件组件化,运维管理人员则可以在平台上方便的拖拽、引用、规范组件,通过拖拽、配置工作实现整体自动化。

  3. 数据聚合管理系统
    数据往往是运营中的判断标志,通过数据与数据间的关系来组建成组件。由于数据源之间的API不同,会导致花费过长的时间来对接API。我们将机房质量、监控负载、慢速比、卡顿率等数据进行整理,部分进行二次转化,通过统一的接口调用,做成一个数据聚合管理系统。

实例分享-节点自动上线
“乐高式松耦合”架构实战
(运维完成过程)

这个过程中运维人员完成了很多组件,如:配置管理、内部测试以及外部测试、入覆盖地区等;随后引入多种数据源进行追踪。事件模版完成后只需运维人员选择需上架的节点及其覆盖方案与地区,其余过程均有系统自动化完成。
此模版还可以根据需要不断修改,例如:丢包率组件等可以随时加入,不会影响业务的进行。
很多公司也在做同样的事件管理系统,不同的是其管理的是动作;而我们发现往往动作完成后还需要进行人工跟踪。鉴于此我们将事件做成一个完整的生命周期,同时引入数据源来跟踪异常服务状态码。
这个事件的完成过程中运维人员所需的操作已经从写脚本、人肉分析,简化为在模版上拖拽、引用组件,根据经验设置阀值,甚至使用其他的事件模版来完成事件。

三、 松耦合需要坚持的细节
(1)保持简单
随着时间的推移与功能的不断增加,系统必然会出现复杂性,而这种复杂性很多是由我们自身操作导致的,如上文提到的“守护进程”的例子,当使用复杂方案解决问题时往往会导致系统的臃肿。如果保证系统具备容错能力,组件运营不正常时系统可以自动修复,这个问题就会简化。
以消息管理机制为例,强消息管理机制要求确认消息确实可以被每台设备收到并执行。我们对此进行了改善,使消息病毒式传播,每台设备可以向周围5-6台设备发出消息,即便中间有一次失败,还会有其他设备再次向这台设备传输。这样的容错能力保证了系统可以简单地自动实现强研发、强跟踪等功能。
(2)在平台的基础上构建应用程序
例如在大数据平台上构建应用,研发人员在开发组件时无需考虑数据库的设计以及瓶颈优化问题,只需要对接数据聚合平台,大幅提高研发效率。
(3)不断迭代
以Facebook为例,目前每秒可以处理12亿张图片;而其第一版系统只能允许用户上传图片,并将其保存在数据库中,该系统只存续3个月;随着活跃用户的增加, 其后端压力不断增加,于是将存储改为二进制存储方式;Facebook的每一次迭代都不是为了某一特定目标,而是为了解决业务上的痛苦。
所以最开始做开发时,我们只需要考虑需求与业务,设计足够简单的方案,再进行不断迭代以满足新增需求。

四、 带来的变化
(1) 快捷引入新特性
我们使用P2P消息管理机制结合收敛算法,将文件删除由5分钟改进至0.7秒,我们对系统没有进行大范围改变,只是替换了其中的消息机制,利用当前基础的通讯机制和基础数据,过去所做的优化与UI仍可以继续使用。引用这些新特性时保持轻量级,对其他组件几乎没有影响。
(2) 开发效率高
例如游戏交互过程中的数字包交互,业内公认很难做到。目前我们正在进行尝试,我们引入开源的TCP代理软件,并规划新的应用服务类型,软件按指定好的打包方式放在指定位置,就可以实现软件的自动发布,同时调用其他组件接口对新业务进行监控,编写配置生成逻辑实现业务配置自动化。只需要编写非常轻量级的落地代码,整个组件落地之后就可以服务运营。
(3)运维自动化提高
在问题定位时,如果人工跟踪一般是“是与否选择”的串行计算,而在事件管理系统中,则进行并行计算,即:调用监控系统,判断节点是否正常;调用第三方数据进行及时测试,判断节点当前服务是否正常;调用客户App数据验证服务质量;使用ELK系统分析日志,精准、快速的定位问题,分析时间由10分钟大幅度缩减为3分钟。


推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 使用种子数据在Asp.NET Core 3.0 Web API迁移过程中写入数据库的详细步骤
    本文详细阐述了如何在Asp.NET Core 3.0 Web API的迁移过程中利用种子数据将信息写入数据库的具体步骤。对于开发人员而言,掌握这一技术能够显著提高数据初始化的效率和准确性。文章不仅提供了详细的代码示例,还深入解析了每个步骤背后的原理,帮助读者更好地理解和应用这一方法。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 体积小巧的vsftpd与pureftpd Docker镜像在Unraid系统中的详细配置指南:支持TLS加密及IPv6协议
    本文详细介绍了如何在Unraid系统中配置体积小巧的vsftpd和Pure-FTPd Docker镜像,以支持TLS加密和IPv6协议。通过这些配置,用户可以实现安全、高效的文件传输服务,适用于各种网络环境。配置过程包括镜像的选择、环境变量的设置以及必要的安全措施,确保了系统的稳定性和数据的安全性。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • MySQL压缩包安装教程:轻松完成数据库环境搭建
    MySQL压缩包安装教程:轻松完成数据库环境搭建 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 基于 Bottle 框架构建的幽默应用 —— Python 实践 ... [详细]
author-avatar
8090互助联盟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有