作者 | 王晔倞
责编 | 郭   芮

去年,我曾写过一篇#架构设计与开发、运维之间关系#的文章,大体对在架构设计时如何权衡面向运维与面向开发进行过一通理论化梳理。也许是因为当时才刚刚开始写作,无论是案例还是措词,都显得极其平庸,总感觉有一肚子话无法倾囊抖出。

又是一年过去了,时间是否虚度?虽然这一年的工作场景略显单调,但是却很充实,帮助我取得了更大的长进。

今天,我以中间件为载体,再次探讨一下 “如何与中间件的各种利益相关者相互协调?他们的关注点一般又会有哪些?”的相关话题,也许你在曾经想到过,或思绪一闪而过,却没有探究其深层的根由。

就这个问题,我觉得是开发与运维对中间件需求不一致引起的,这其实没什么大不了,因为跟架构有关系的任何话题,如果权衡不好这两者之间的权重,那你的方案基本上也就告吹了。

那么,作为一名应用研发,你一般会有哪些疑问?或作为一名系统运维,你会如何理解“面向开发”与“面向运维”之间的关联呢?

设计之初的常见疑问

对于应用研发来说,即学即用,且接入成本低廉的中间件是最好的,因此在中间件设计之前,他们通常会提出一些疑问。

疑问1:当架构师提出缓存自主研发方案时,他们会问 “为什么非要自主研发?下载个Redis用起来就行了呀,集群及高可用方案官方都提供了,很成熟呀”。

其实不然,如果站在 “比数据库快,满足Request/Response就行” 的角度看当然没问题,但实际中间件需解决 “应用交互之间的技术解耦”,如某业务线因“特殊原因“”提出要使用HBase作为介质时,你只能再为他提供一个客户端,常此以往,运维侧需要投入的时间、人力及风险制衡将增大,更何况同时管理那么多SDK(或协议)也是个头痛的问题。

疑问2:当架构师提出通过添加代理层,解决客户端与服务端之间的解耦问题,他们又会问 “为什么要增加代理层?将SDK再次封装下,并把配置外移,便于维护就可以了呀。”

也不尽然,增加代理层的目的是将所有现有与将来可能出现的处理逻辑与规则(如路由控制、服务降级、协议转换)尽可能的放在代理层来实现,并在发布、维护及弹性伸缩、出现故障、冗余时,能够更快更灵活的变更,不仅达到技术解耦的效果,而且整个过程对于应用无感知。

值得一提的是,增加代理层,也方便在多机房场景中进行来回切换。

聊完了应用研发,再来说说系统运维。也许分布式或微服务架构,对于运维来说不是什么好事,不仅管理成本高,而且治理难度大,所以在设定中间件的目标过程中,他们似乎也有话要说。

疑问3:为了满足用户增长,当架构师提出利用分布式架构来提升扩展性,他们会说 “为什么要采用分布式架构?集群化架构也能扛住啊,我们的流量有那么大吗?你们有考虑过运维的感受吗?”

通过实际案例说明下,某调度中间件系统采用集群化架构,把几万个调度逻辑都放在一个WAR包里部署,然后运行在几十个同构的虚拟机上。过了不久,因为A调度出现阻塞,导致实例异常挂起,尽管几十个实例在运行,但由于资源互通,最终触发雪崩效应。

设想一下,如果这个场景使用的是分布式切片服务,每个切片服务于不同的应用,那影响的也只是有A调度和其他相关联的服务,而不会导致整个系统都不能使用。

这些疑问和见解,在许多公司的系统演变过程中或多或少都出现过,当然,纯靠 “堆人+堆机器” 打通关的也不在少数,甚至一年之间系统重构过2-3次的也屡见不鲜。在我看来,大部分原因都是前期没有调研,尤其没有在设计目标上做出权衡(如开发与运维之间的资源投入倾向),进入研发周期时才发现,对于快速发展的创业型公司来说无疑是沉重打击。

怎么理解 “面向开发” 与 “面向运维”?

我们先来看看网上热门多年的话题,在绝大多数人的印象中 “开发工程师与运维工程师的区别”。

  • 开发工程师:能够使用一种(或多种)编程语言,完成某个产品(或项目),通常更关注制造过程,不关心运营生命周期;

  • 运维工程师:管理(或维护)系统、主机及产品,通常更关心运营生命周期,不关心制造过程,相比之下,心理素质较高。

从客观的叙述可以看到,由于岗位职责的不同与视角上的差异,无论是架构设计还是技术选型,在目标设定之初就容易引起开发与运维之间的博弈,尤其在使用者日趋大众化的今天,许多系统在设计之初并未明确技术的原则与目标,导致利益相关者(如开发和运维)之间失衡,引发复杂性向后倾斜,使得运维的工作越来越沉重,而且系统也越改越复杂,最终增大了事故发生率,甚至推倒重来、互相推诿。

简而言之,从中间件设计的原则与目标来看,我们可以基本得出以下公式:

  • 如果设计目标 = 遵守轻量级接入原则(如SDK或Socket),通过代理层处理逻辑与规则的实现,并支持服务的编排部署、弹性伸缩,在出现故障、冗余或性能需求时,能够更快、更灵活的变更规则与逻辑,整个过程应用无感知。

  • 那么我认为这个中间件的设计目标 = 面向运维。

  • 如果设计目标 = 采用轻量级开发框架处理逻辑与规则的实现,利用客户端直连的方式提供服务,无代理层,缩短应用开发时间,屏蔽应用升级风险,最终帮助实现敏捷式开发,而编排部署、弹性伸缩等高可用方案由应用架构本身提供。

  • 那么,我认为这个中间件的设计目标 = 面向开发。

这样得结论已很明确,这两者之间并非互斥关系,而是一种互补关系。

具体案例说明

我来通过一个案例,说明一下当遇到 “如何权衡中间件在面向运维与面向开发的设计目标” 时,该如何做出选择。

先来介绍下故事情节,假设我们公司的业务在近几年突飞猛进,从业务视角来看,从“单业务”发展为“事业部(多条业务)”;从技术视角看,传统关系型数据库已无法承受持续增长的性能需求——这个时候,我们就需要一个缓存系统来解决当前的性能痛点。

在十万火急的前置下,必须快速满足业务要求,所以没有仔细考虑,简单实现Jedis封装,并支持主动感知Master切换,匆忙上线了V1.0版本。

图1 我们的分布式缓存V1.0

又过了一段时间,随着接入的应用系统越来越多,版本混乱、维护成本等现象频发,今天这头告急,明天那头起火,对于中间件运营及运维而言,真是苦不堪言。

当遇到这些问题时,我们对原因进行了复盘整理:

  • 业务增长,服务拆分:从项目切换至产品,而每种业务产品都以服务的形式提供;

  • 资源成本,测试手段:由功能迭代或BUG修复引发的SDK变更,无论如何说明、解释,应用侧都认为“基础组建必须全量回归测试”,但自动化测试又是一个长期工程,而传统黑盒测试又人力与时间资源都紧靠业务需求而难以实施,长此以往,污染的速度大大的超过治理的速度;

  • 单一职责,技术债务:虽然都使用Java作为主要编程语言,但每个团队都有自己的开发手法,有的有开发框架,有的没有,连用的JDK&第三方包都不一样;

  • 冷部署、扩容与排障:当出现故障、扩容或部署时,在这个时候就会有人跳出来问“你们没有热切换的方式吗?”,显然除了停机操作这种暴力手段之外,我们几乎没有更好的选择。

从复盘整理可以看出,在无法实施轻量级Java框架的客观条件之下,为了能在面向运维与面向开发间做出权衡,我们发布了V2.0版本。

图2 我们的分布式缓存V2.0

又过了一段时间,随着接入的应用系统越来越多,版本混乱、维护成本等现象频发,今天这头告急,明天那头起火,对于中间件运营及运维而言,真是苦不堪言。

通过增加代理层、支持分片化、协议私有化等功能,基本已达到“主体面向运维,且兼顾开发”的设计目标:

  • 实现技术解耦:轻量级SDK,把更多的逻辑与规则放到代理层实现,避免当需功能迭代或BUG修复时,规避测试与运维的双重压力

  • 独立切片部署:每个系统都能够独立使用自己的缓存分组,就算出现故障,也只影响自己;

  • 热部署、扩容:当出现故障、冗余或性能需求时,可以通过中间层的路由控制、灰度功能更快、更灵活的处理;

通过上面的陈述,我们可以看到既面向运维,又面向开发,是中间件设计过程中始终追求的核心准则,但有时却会因为客观场景、技术债务、硬件环境等原因使其难以兼顾,而我们需要保证的,是在设计目标时做出合理的权衡,以保障系统的持续发展。

小结

现在只要一谈起架构策略,相信许多人的脑海中会浮现出中台战略、基础服务下沉,以及大平台与小团队等一系列高大上的词汇。

中间件作为企业应用级基础建设,在目标设计时的盲目往往会引发后期的故障发生与成本损失,所以我们必须思考 “如何与中间件的各种利益相关者相互协调,并合理满足他们的关注点”,希望对你有所帮助。

相信你在设计目标时,应该有遇到过开发与运维不一致的情况吧?最后你又是如何权衡的呢?欢迎你把答案写到评论区,和我一起讨论。

作者:王晔倞,18年IT从业经验,现任职好买财富平台架构部技术总监,负责好买中间件及平台化的研发及运营,团队管理和实施重大技术决策。曾任大智慧测试总监,在2年内带领团队自研了“大智慧云测试平台”,通过平台化将金融数据服务业务从瀑布式逐渐转型为DevOps。

声明:本文为作者投稿,版权归作者个人所有。

 热 文 推 荐 

☞ ofo 回应海外部门集体解散;罗永浩将现身快如发布会;支付宝更名? | 极客头条

☞ 拥抱开源四年的 .NET,现在怎么样了?

☞ 要来了!国内安卓统一推送标准将于3月开启测试

☞ 2019八大科技趋势,指引你走向技术下一站

☞ 程序员有话说 | 同一起点的程序员,有人累到要猝死,有人清闲得要命

☞ Istio调用链埋点原理剖析—是否真的“零修改”分享实录

☞ Google AI骗过了Google,工程师竟无计可施?

☞ 趣挨踢 | 关于遗留代码的那些事儿

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

点击“阅读原文”,打开 CSDN App 阅读更贴心!

喜欢就点击“好看”吧!

程序员该面向运维,还是面向开发?相关推荐

  1. 《地图气球》小程序从产品到运维的个人全栈开发过程分享(长文)

    前言 怕过不了审,先声明一下,这不是广告,因为这个小程序没上架. 从5年前入行的时候就一直想做一个社交产品,最近工作略闲,加之小程序火爆,下班后时间多,于是就花费了一个月业余时间,动手做了一个基于地理 ...

  2. 浅谈运维工程师的开发能力的培养

    写在前面 本文已获得作者授权,作者的博客地址:https://www.cuiliangblog.cn/ 原文链接:浅谈运维工程师的开发能力的培养 一.运维工程师发展路线 1. 传统运维 侧重点是解决具 ...

  3. 基本运维及协同开发 :Linux基本使用

    基本运维及协同开发 :Linux基本使用 文章目录 前言 一.Linux内容介绍 二.Linux入门概述 1.我们为什么要学习Linux 2.Linux 简介 3.Linux 发行版 4.Linux ...

  4. 数据分析真题日刷 | 商汤科技2018校招C++/算法开发/大数据/后端/运维/测试/数据挖掘开发工程师笔试第二场

    断了大半个月没有刷题,进入「数据分析真题日刷」系列第13篇 . 今日真题 商汤科技2018校招C++/算法开发/大数据/后端/运维/测试/数据挖掘开发工程师笔试第二场 (来源:牛客网) 题型 客观题: ...

  5. 遇到跑批时快时慢、或一直变慢,作为运维DBA或开发的你,如何下手?

    作者:黄远邦(笔名小y),长期活跃于国内多家银行总行生产数据中心,擅长解决Oracle方面各类疑难问题.在北京中亦安图科技股份有限公司任数据库团队技术总监. 如果您的日终跑批/清算/报表等程序时快时慢 ...

  6. 【JAVA运维单系统开发-王大师王文峰开发(过年后2.10号已完成)】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,<Java王大师王天师>作者 公众号:山峯草堂,非技术多篇文章,专注于天道酬勤的 Java 开发问题.中国国学.传统文化和代 ...

  7. 当了十年 IT 程序员,我转型做自动驾驶开发的这五年”_《新程序员》编辑部的博客-CSDN博客

    "当了十年 IT 程序员,我转型做自动驾驶开发的这五年"_<新程序员>编辑部的博客-CSDN博客

  8. 4类程序员直呼好用的嵌入式开发辅助工具

    俗话说工欲善其事必先利其器.有了好的开发辅助工具的开发人员就像开了外挂,事半功倍. 下面将会按照不同功能给大家介绍几种身边程序员们力荐好用的开发辅助工具 一.常见硬件芯片 想要开发一款嵌入式产品,首先 ...

  9. python基础 day13 运维堡垒机开发

    本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功 ...

最新文章

  1. 水平集群和垂直集群的区别!
  2. Java数据结构与算法:队列
  3. Android webView 缓存 Cache + HTML5离线功能 解决
  4. 10以内数的组成分解图_学前儿童如何学习20以内的加减法,收藏了
  5. notebook python 内嵌 数据库_python数据分析:在jupyter notebook上使用pythonSQL做数据分析...
  6. maven中的oracle,maven中安装SQL SERVER 和 Oracle JDBC驱动
  7. 日志分析工具 Log Parser
  8. elementUI日期选择器:仅设置可选择时间区间
  9. 基于Metronic的Bootstrap开发框架经验总结(15)-- 更新使用Metronic 4.75版本
  10. Discuz 论坛实现qq小程序
  11. 一些好用的nginx第三方模块
  12. 数据库系统原理教程-作业
  13. android recyclerview item自适应高度_web前端学习:高度自适应知识点
  14. IIS 7 配置备份和还原
  15. 3D立体显示大屏幕拼接视频墙系统解决方案
  16. flutter常见报错处理
  17. Linux查看流量情况以及关闭流量端口
  18. fatal: unable to access 或者 fatal: could not read from remote repository
  19. 逻辑回归使用(参数)
  20. Rust的面向对象(五)——面向对象

热门文章

  1. mybatis 拼接_关于 Mybatis的 $ 和 # , 你真的知道他们的细节吗?
  2. 【论文理解】Learning in the Frequency Domain
  3. 人脸关键点标注工具_谈谈人脸关键点的江湖
  4. QtCreator格式化代码---Beautifier插件使用方式
  5. Python菜鸟入门:day04数字与字符串
  6. D 语言是否可作为入门级的编程语言?
  7. 历史上的今天:乔布斯出生;苹果推出 Thunderbolt 接口;WhatsApp 创始人诞生
  8. Java 序列化的这三个坑千万要小心
  9. 三个锦囊:剖析 5G 安全难题
  10. ​苏宁回应股权质押给淘宝:正常合作;苹果App Store被越狱商店指控垄断;Docker 20.10.0发布|极客日报...