非等出 Bug 了才想到架构升级?

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 王晔倞

责编 | 郭芮

每个季度末,我都会抽出一周的时间与团队核心人员逐一谈心,一来帮助他们舒缓下疲劳的情绪,二来给大伙创造一个吐槽的环境。

在以往的谈话中,我会有意识地避免总结与回忆,多聊一些与畅想未来相关的话题,为什么呢?因为时间是无法逆转的,过去就是过去了,与其强忍尴尬回忆过去,不如试着畅想未来,让气氛变得更轻松——至少这种方式使得整个谈话过程笑声变多了,苦瓜脸变少了。

今天在与某架构师谈话中,他的某些观点却让我感到有些意外。为什么呢?我们都聊了些什么?


640?wx_fmt=png

非要系统出故障了才想着架构升级?


我整理了他的内容,大致是觉得系统架构升级的驱动力多半来自于故障,比如2012年11月11日,各大电商风云大战,淘宝网和京东网虽做足准备,但还是由于流量太大导致服务器瘫痪。回望自己,虽说会做一些高可用测试,也确实能在测试阶段发现大量性能、高可用的潜在问题,但基本都浮于表面,“我说的不对吗?还记得半年前的机房迁移吗?做足准备了吧,那为什么结果还是被冲了个七零八落呢?”

他接着说,说完技术,再来说说人,由于 “客观原因”,“我们的架构师在高可用,在分布式,甚至在自动化方面都缺乏经验”,除非高薪聘请大咖加入,想要通过自身规划得到稳定、高效的技术架构,几乎没有可能。

这番话很实在,也很直接,让我当场有些措手不及。

仔细想想,有这样想法的架构师或程序员不在少数。他们坚信自己系统升级的必要性来源于是否出现故障,只要认真且较真的抓住这次机会、修复它、搞定它、让它下次不再发生,我就是棒棒哒。至于那些还未发生的,就是不存在的,既然不存在,我怎么能知道?靠瞎猜吗?

不仅如此,他们始终相信,我没经验,就没法开展,至于什么未来规划,更是无稽之谈。也许这是遮掩自己的不足,找准时机展露自己是救世主的一种另类方式,但事实证明他们把自己定义为一名消防队员,而不愿意成为一名规划者。

有人说了,架构的发展多半来自于业务的需要,现在业务放缓,现有架构也满足当前需求,那我还需要主动规划吗?我觉得,不仅需要,而且要加大投入,为什么呢?

我觉得,将产线发生故障作为架构升级驱动力的想法纯属鸵鸟思维,有些故障会导致业务一击毙命,还有然后吗?再说了,一般考验系统架构的最好方式是大流量,而有意思的是,流量这东西不仅不好预估,而且不确定性极强。为了应对这样的场景,所以我们常会听到架构师说,“我这东东是带自动扩展的,可大可小,可根据流量快速的自动调整。” 听上去真棒,但当真的 “狼来了",需要你在产线施展神通之时,咋哑火了呢?仔细一查,原来同时扩展小于十个节点没问题,大于十个节点就触发了某BUG,其他都测了呀,就差这个场景没想到呀,你能怪他没好好测试吗?

所以,请收起那些可笑的想法,将明确的目标与实施路径写入规划,耗费上千次讨论,废弃数套环境,奉献半生精力,去执行,去折腾。

在宏观经济与金融监管风云突变的客观环境下,我们如何进行技术架构规划呢?


640?wx_fmt=png

寻找目标企业,不耻下问,关注细节


常听见某某人自夸,说自己认识这个,有哪个人的微信,这能证明啥?最多能证明你的社交能力强,人脉广泛,所交流的技术话题也多半偏向顶层设计,或概念构思,对实质性规划没什么太大帮助。

我所采取的是,将目标分拆为不同技术类型,比如分布式中间件、持续集成与交付、DevOPS等,利用这些人脉关系,寻找行业内不同的目标企业进行学习。比如阿里的中间件团队,携程的持续集成与交付,带领小伙伴们登门拜访,不耻下问,关注他们的发展历程、技术选型及用人标准等细节。

每次都有收获,每次都会得到启发,今年许多版本的迭代均得益于这项方式。


640?wx_fmt=png

构建适合自己的非功能性测试套路


按之前的方式,是否可以把某某年度的OKR定义成 “必须达成A系统P0级事故3次,并导致10台以上服务节点宕机。”为啥这么定?逻辑很简单啊,事故级别越高,服务节点宕机数越多,架构设计的驱动力越大呀,哦耶!

如果技术负责人的脑子没被驴踢的话,不可能这样设定OKR,那该怎么解决这个矛盾呢?

我所采取的是,建设随机破坏性故障演练系统,并制定模拟性场景演练,比如拔网线、丢包、I/O不规则波动、消息阻塞等,由于曾写过一篇有关 随机故障测试系统 的文章,在这里就不详细介绍了。

当然,这些看似简单的思路,想要做到,并非易事,毕竟扯淡总是容易的,刷新认知才是最难的。

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

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

微信改版了,

想快速看到CSDN的热乎文章,

赶快把CSDN公众号设为星标吧,

打开公众号,点击“设为星标”就可以啦!

640?wx_fmt=png


征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。

640?wx_fmt=gif

640?wx_fmt=gif

展开阅读全文

从电脑系统软件激活与联机升级想到的.....

11-17

我是一名普通的计算机科技工作者,对目前广泛部署的系统软件打着“遏止盗版”施行所谓的激活及联机升级策略深感忧虑!目前已知几大省会城市政府通过广泛部署海外研发的系统软件构建电子政务系统,尽管都声称已被预“激活”但却被“强烈”建议打开“在线升级”功能!这里隐藏怎样的国家安全隐患,请大家一起讨论!rnrnrn新版本系统软件越来越庞大,隐藏期间的二进制代码不计其数,试想每天政府部门里无数计算机自动登录系统软件开发厂商设立在境外的所谓“安全补丁” 升级服务器自动“当”一个又一个我们无法轻易了解其二进制内容的打包补丁,即使安装了国家安全部门认证的防火墙产品也无法防范——因为“升级”操作产生的有关网络通讯数据早被“建议”防火墙产品悉数“放行”!rnrn如此一来,每天都会从本地机器“采”些什么“送”出去,从境外服务器“当”些什么“送”进来,简直如入无人之境!如果是家庭用户也就罢了,关乎国计民生的社会运行保障部门及涉及国家安全的军事单位,结果就触目惊心了!“和平”时“风平浪静”一旦“先发制人”后果不堪设想!rnrn在我国电视新闻里不时能看到我们的军队也部署了这样的系统软件,不知道是否指挥员系统也部分基于这样的系统软件开发,如果真实情况是这样,那真是太可怕了!前段时间国家电视台播放的连续剧《石破天惊》里那几枚可兼 GPS 定位的 100 公里无线传输芯片,我想不会是空穴来风!如果在军队部署了上述需要激活与联机升级的系统软件,因为没有彻查其二进制代码,一旦国家间重大冲突,原本处于 “激活”状态的机器就能轻易被反“激活”!结果怎样,不用多说!rnrnrn我在这里将这个问题列出来,大家一起讨论,看看有没有比较好的办法?rnrnrn我的一个不成熟想法是国家信息产业部,以国家意志要求系统软件厂商:rnrnrn[]、专门针对中国用户在大陆单独设立有关“升级”服务器,且该服务器由国家信息产业部托管;rn[]、上述服务器不得访问国家互联骨干网出口节点;rnrn[]、今后系列升级补丁,系统软件厂商必须以源代码形式提交国家信息产业部;rn[]、国家信息产业部审查后独立应用已通过国家安全部门认证的相应编译器联编;rnrn[]、最后由国家信息产业部将联编结果发布到上述托管服务器上供中国大陆用户特别是政府职能部门联机升级(升级过程里的有关网络通讯在公钥握手后必须至少以256位的对称密钥加密传输)。rnrnrn尽管系统软件核心源代码短期内有关厂商不会公开(现在即将发布的新版本系统软件,就连其本国的头号反病毒软件厂商也没能接触到该版本系统软件的核心),但升级补丁源代码以国家意志形式要求有关厂商提供,还是有可能的,也是必要的!rnrn当然最安全的办法是国家职能部门全部部署我国自主研发的系统软硬件,最起码也要得到系统软件全部源代码且由国家信息产业部独立编译后压制母盘再依据严格的安全制度在各级政府部署!如果做不到,就不能广泛部署这样的系统软件,在国家要害部门,不论内部网络是否连接外网都不能部署!rnrn平头老百姓容易受广告营销的影响,紧跟潮流争“鲜”购买安装系统软件的新版本,可以理解也不必干预,以免又有自居的“警察”嚷嚷着贸易不“平衡”!但是政府职能部门特别是涉及国家安全的要害部门也这般“时尚”也这般强调“娱乐”功能强调“多媒体”特性则确为不妥!受制于人的程度不是我们普通人可以想象的!打着“奥运”的旗号要求广泛部署海外研发的系统软件还美其名曰方便国际通讯接轨,海外企业在这里头深层次的真实意图值得细究!rnrn我国不是没有自己的系统软硬件产品!既有大家熟悉的“红旗”与“龙芯”也有不为公众所“熟悉”的!rnrn我们都知道,任何自主研发的工业产品得以成熟,需要长时间的广泛应用测试及改进,尽管起初问题会很多,但随着测试改进步伐的逐步加大,成熟应用就指日可待!相反,动辄就以国产的软硬件产品质量不过关应用不兼容为由,各级职能部门就不愿意在办公室里应用民族工业产品,这如何能帮助我国民族工业产品更快“长大”?!“神舟”一次比一次地顺利上天又顺利回家不正是缘自我国航天工业坚持独立自主研发及应用长征系列运载火箭而取得的令国人倍感自豪的丰硕成果么!rnrn当“联想”收购某品牌个人计算机后,在西方某国家就出现该品牌产品应用受限的情况!这些国家不“信任”我国计算机产品应用于其“敏感”部门,我们何以还上杆子在我国自己的“敏感”部门应用来自这些国家的计算机产品?科学是没有国界的,但科学家却是有祖国的!人家防贼一样防着我们,我们理所当然毫不客气以牙还牙!说什么都苍白无力,国家利益高于一切!rnrn作为一名普通计算机科技工作者,期待着哈尔滨、湖南等地的有关高等院校在计算机系统软件领域传来越来越多的好消息! 论坛

myeclipse6.0配置ssh架构bug

04-06

这几天我用ssh架构写项目的时候发现会有莫名其妙的错误,经仔细检查也无法找出问题所在,后来索性将以前能运行的项目架构导了进来,可是发现居然也运行不了!!!rn所以我怀疑是ide的bug,具体提示信息如下:rnrnorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orgManager' defined in file [C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\OA\WEB-INF\classes\applicationContext-beans.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in file [C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\OA\WEB-INF\classes\applicationContext-common.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: could not instantiate id generatorrnCaused by: rnorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in file [C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\OA\WEB-INF\classes\applicationContext-common.xml]: Invocation of init method failed; nested exception is org.hibernate.MappingException: could not instantiate id generatorrnCaused by: rnorg.hibernate.MappingException: could not instantiate id generatorrnrn信息: Illegal access: this web application instance has been stopped already. Could not load java.net.BindException. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.rnjava.lang.IllegalStateException ...rnps:提示说应该是hibernate映射的问题,可是映射确实没问题!导入的架构也没问题!两天前还能正确运行!rnrn请哪位大哥大姐帮帮小弟!rn 论坛

升级GTK+是出错了

07-22

安装步骤:rnrn1.安装glib2.12.0 成功rn2.安装atk1.9.0成功rn3.安装pango1.13.0成功rn4.安装1.2.0成功rn上述4个安装指令统一为: ./configure --prefix=/usr&&make&&make installrn不过在安装pango的时候我改为: ./configure --prefix=/usr --libdir=/usr/X11R6/lib --sysconfdir=/etcrnrn5.安装GTK2.10.0出错了,错误信息如下:rnrn安装指令为: ./configure --prefix=/opt/gtkrn.........rnchecking whether make sets $(MAKE)... (cached) yesrnchecking for pkg-config... /usr/bin/pkg-configrnchecking pkg-config is at least version 0.9.0... yesrnchecking for BASE_DEPENDENCIES... Package pango was not found in the pkg-config search path.rnPerhaps you should add the directory containing `pango.pc'rnto the PKG_CONFIG_PATH environment variablernNo package 'pango' foundrnconfigure: error: Package requirements (glib-2.0 >= 2.12.0 atk >= 1.9.0 pango >= 1.13.0 cairo >= 1.2.0) were not met:rn rn rn rnConsider adjusting the PKG_CONFIG_PATH environment variable if yourninstalled software in a non-standard prefix.rn rnAlternatively, you may set the environment variables BASE_DEPENDENCIES_CFLAGSrnand BASE_DEPENDENCIES_LIBS to avoid the need to call pkg-config.rnSee the pkg-config man page for more details.rnrn我已经在PKG_CONFIG_PATH中设置了参数,具体如下:rn[root@localhost gtk+-2.10.0]# echo $PKG_CONFIG_PATHrn/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:/usr/X11R6/lib/pkgconfigrnrn在/usr/X11R6/lib有库存在:rn[root@localhost gtk+-2.10.0]# ls /usr/X11R6/lib/pango/1.5.0/modulesrnpango-arabic-fc.la pango-basic-x.so pango-indic-fc.la pango-syriac-fc.sornpango-arabic-fc.so pango-hangul-fc.la pango-indic-fc.so pango-thai-fc.larnpango-basic-fc.la pango-hangul-fc.so pango-khmer-fc.la pango-thai-fc.sornpango-basic-fc.so pango-hebrew-fc.la pango-khmer-fc.so pango-tibetan-fc.larnpango-basic-x.la pango-hebrew-fc.so pango-syriac-fc.la pango-tibetan-fc.sornrn在/usr/X11R6/lib/pkgconfi有pango.pc存在:rn[root@localhost gtk+-2.10.0]# ls /usr/X11R6/lib/pkgconfigrnpangoft2.pc pango.pc pangoxft.pc pangox.pcrnrnrn在/etc/ld.so.conf文件中我也把编译所需要的LIB库的路径加了进去:rn[root@localhost gtk+-2.10.0]# more /etc/ld.so.confrn/usr/kerberos/librn/usr/X11R6/librn/usr/lib/sanern/usr/lib/qt-3.1/librn/usr/local/librn/usr/librnrn为仕么我安装GTK时还会出错?rnrn这个信息:rnchecking for BASE_DEPENDENCIES... Package pango was not found in the pkg-config search path.rn是么子意思?是不是我还需要配置BASE_DEPENDENCIES这个环境变量,如何配置?我也试过,配的与PKG_CONFIG_PATH一致,但是不行,请各位高手帮我一把,谢谢!rnrnrnrnrn 论坛

SSH框架整合出BUG了,求高手帮忙,在线等。。。

07-26

信息: Initializing Spring root WebApplicationContextrn23:05:50,453 ERROR ContextLoader:213 - Context initialization failedrnjava.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)Vrn at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:254)rn at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)rn at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)rn at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)rn at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)rn at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)rn at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)rn at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)rn at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:987)rn at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:909)rn at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:495)rn at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)rn at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)rn at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)rn at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)rn at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)rn at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)rn at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)rn at org.apache.catalina.core.StandardService.start(StandardService.java:516)rn at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)rn at org.apache.catalina.startup.Catalina.start(Catalina.java:583)rn at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)rn at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)rn at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)rn at java.lang.reflect.Method.invoke(Method.java:585)rn at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)rn at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)rn2010-7-26 23:05:50 org.apache.catalina.core.StandardContext listenerStartrn严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListenerrnjava.lang.NoSuchMethodError: org.springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)Vrn at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:254)rn at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)rn at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)rn at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)rn at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)rn at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)rn at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)rn at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)rn at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:987)rn at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:909)rn at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:495)rn at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)rn at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)rn at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)rn at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)rn at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)rn at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)rn at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)rn at org.apache.catalina.core.StandardService.start(StandardService.java:516)rn at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)rn at org.apache.catalina.startup.Catalina.start(Catalina.java:583)rn at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)rn at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)rn at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)rn at java.lang.reflect.Method.invoke(Method.java:585)rn at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)rn at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)rn2010-7-26 23:05:50 org.apache.catalina.core.StandardContext startrn严重: Error listenerStartrn2010-7-26 23:05:50 org.apache.catalina.core.StandardContext startrn严重: Context [/book] startup failed due to previous errorsrn2010-7-26 23:05:50 org.apache.catalina.core.ApplicationContext logrn信息: Closing Spring root WebApplicationContextrnlog4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.rn2010-7-26 23:05:51 org.apache.coyote.http11.Http11Protocol startrn信息: Starting Coyote HTTP/1.1 on http-8080rn2010-7-26 23:05:51 org.apache.jk.common.ChannelSocket initrn信息: JK: ajp13 listening on /0.0.0.0:8009rn2010-7-26 23:05:51 org.apache.jk.server.JkMain startrn信息: Jk running ID=0 time=0/109 config=nullrn2010-7-26 23:05:51 org.apache.catalina.startup.Catalina startrn信息: Server startup in 4837 ms 论坛

没有更多推荐了,返回首页