分布式系统 并不是我想象中的那样!



过去两个月深入的参与了一个分布式系统的开发,记得之前有人说过“想成为架构师之前,都是从微观架构开始的”。尽管我从没想过将来的某一天要成为一个架构师,或者领域专家,我只是想萌萌哒的编码,写着自己喜欢的Code,和一群志同道合的朋友做出大家喜欢的商品和产品。

前言

过去两个月深入的参与了一个分布式系统的开发,记得之前有人说过“想成为架构师之前,都是从微观架构开始的”。尽管我从没想过将来的某一天要成为一个架构师,或者领域专家,我只是想萌萌哒的编码,写着自己喜欢的Code,和一群志同道合的朋友做出大家喜欢的商品和产品。但是工作久了慢慢的搭架子的事情还是会来到你的面前,因为时间总会把一部分人慢慢推向海边,使得他们成为最早见到阳光的人。

不扯淡了,为什么要说阳光呢,还是因为过去的两(三)个月可能过的太充实也太痛苦了,完成之后,曙光来临的时候整个人是会发光的哦。“深度”参与是因为我终于有机会在搭架子的过程中有了话语权和选择权,同时也会承担70%以上的编码工作。

之前我的自我认知是我可能在软件方面的积累还可以,比如设计模式,架构分层,程序解耦,API入手等方面,但是总觉得我在硬件网络方面积累的太少,太薄了。

比如:

  • 不同操纵系统之间的特点;
  • 网络端口管理与分发;
  • 哪些网络协议可以帮助我们更好的完成工作,监控虚拟机的时候是在虚机上加代div理好还是用协议去控制;
  • 硬件是否支持分布式,在扩展过程中对于.net C#的兼容怎么样;
  • 什么时候使用多线程,在把线程交给程序调度的时候我们怎么控制和捕捉线程的异常;
  • 日志系统对于整个分散的系统是多么的重要;
  • 何时使用关系数据库,什么时候使用Nosql;
  • 消息队列用擅长的MSMQ还是RabbitMQ.
  • 怎样有效的和其他部门的同事沟通;
  • 用什么样的方式去有效调度不同语言开发的系统;
  • 测试用例对于大系统从零散到完整是多么的重要;
  • 系统标准,代码原则对于后期的维护余扩展是多么的重要;
  • 等;

项目简介

首先项目详细内容不便多说,简答的说,就是为国内某大型厂商建立一套协调其自身搭建的私有云以及其购买的公有云的一套系统。说牛X一点就是:一套混合云系统。



使用Restful

这是在构建完整个系统最大的收获,之前使用web api的经验只是为电商系统的移动终端提供数据交互的接口,但是在这次项目之后发现Rest接口的不仅作为我们系统向外部系统提供交互的方式,同时在一些开源工具其暴露出来的接口也是基于rest的,可见全世界的程序员对于json对于rest有多么的喜爱;

为什么装上软件配置完成之后使用不了

之前的开发经验由于使用的都是微软的技术包括组建,工具。但是在项目中使用一些开源工具之后,配置成功之后却总也跑不起来,同时由于开源工具已将Exception封装起来,我们很难知道具体是什么样的问题,有的时候调试好久还是跑不起来,很沮丧也很懊恼,结果最后发现是由于公司IT只是将常用的端口打开,其他的都干掉了,如果申请开放端口的话还要走流程,于是对于开发人员有时候有一台外网的开发虚拟机也是相当的有必要的。

使用RabbitMq

个人是非常的喜欢使用Mq的,之前做电商总喜欢在Application层下面放入一层Service,你可以不用但是总会强迫症似的不去不写。为什么不用Msmq呢,原因是有很多了,简单点就是rabbit要比Msmq的协议更加高级,支持的处理功能也更加丰富,最重要的原因是Rabbit在开源语言使用上是占领先地位的,而且我们的系统又要嫁接太多的开源语言系统,最后只能适配他们喽。

之前知道Mq在企业系统间数据交互使用频繁,不但能有效的划分层次,解耦依赖,同时数据交互方式上也相当的便捷。总会有消息没有被消费者使用,那我们就需要程序异步的去处理这个消息队列了。

Redis

系统中使用了三种数据存储,MySql,SqlServer,Redis,当然前两种适用于开源和C#,而Redis的使用则是为了那些总是难以找到有效关系和依赖的数据,比如之前只是知道Reids可以作为数据的存储,可以分布式,可以主从复制,但是在这次开发之后更真真的发现Reids或者Nosql对于一个数据规则难以掌握,数据量大的系统是多么的重要,因为有的时候一批的Json串过来之后,难以有效的挖出里面的关系与逻辑,索性就一次性将他们放入Redis中吧,使用时再反序列吧。同时建立读写分离的原则,我们主要将读放在了Redis里面,写到了Mysql,并通过Mysql的触发器实现服务器段数据的主从复制同步。

日志系统

之前我们的单一系统的时候,比如只是简单的3层架构的话,我们通过Debug可以从头debug到数据库,每一步都是掌握在手底下,每一步都尽收眼底。可是对于这一个层次太深,组建调用较多,同时又是多线程的系统来说,挖到雷的机会,时间,成本都是要考虑的。于是有效的使用日志组件,有效的在代码中埋雷就显的尤为迫切和必要,能够更好的帮助我们找到问题所在。

组件式开发

之前的简单分层系统我们通过Svn或其他的代码管理工具,每次提交都可以Merge看的到,但是当系统庞杂同时系统独立性很强的时候,分组建,分模块开发就显得很重要。因为不想浪费大家一起Merge的时间,我们习惯性每个人有自己的Branch每周2的时候提交代码,大家一起参与,这样减少了好多因为代码管理浪费的时间。

测试用例

之前小的系统使用测试用例基本就是装B用的,本来小小的系统整套流程脑子一想就可以知道怎么做啦,为什么还要浪费时间。可是在这次开发中充分理解了测试用例的重要性。比如我需要你给我提供多台服务器的监控数据包括CPU信息,IO信息,NEt信息等等,但是你还没有想到怎么样去抓取虚拟信息,不能因为你的问题去影响其他人的进度的,最好的方式从使用者角度获知他希望使用什么样的数据,为其建立API,同时为API建立测试用例并保证测试稳定。而后期我有了监控虚机的方式之后我在建立对应的适配方法适配到对应的API上。

所以首先肯定要保证API的稳定,因为他之上的东西已经稳定了吗,你只好辛苦啦,有效的测试用例可以帮助我们更好的剥离项目逻辑与协调组件系统。

编码原则

这个主要是每周有时间大家一起参与Code Review,由于开发人员的能力不同资历不同,所以总会在代码的编写上和建立出现太多的不统一。比如命名啦,变量声明啦,有的时候会发现刚毕业的小朋友会将好多的私有变量放在类的顶部,同时一个类里写太多的方法,而且有的方法好长,还没有注释。于是有的时候你想了解一个方法的真正含义,要鼠标各种滚动,到变量声明去了解真正用途,好烦的。

有的时候代码的职责不明确,总是瀑布的思想方式去写代码,比如我们两个功能:一个是发送API请求建立虚拟机,另一个是在虚拟机建立成功时候将操作Log写入db。他们习惯性的将写DB的逻辑放在了发送HTTPRequst的方法里面,这完全是两个逻辑。另一个问题是由于创建虚拟机是需要时间的,同时尽管虚拟机操作成功有可能你写DB的时候网络原因DB失败了。我认为这应该是个原子的操作,两者的状态必须统一,就像是你在手机充值的时候显示银行卡扣金额成功,可是手机充值是出现问题,钱不是白花了吗。所以在这些有特殊逻辑的地方要建立特殊的统一的机制,不能每个人有各自的实现。

之后就是沟通了

由于项目涉及到多个项目组,我们并不是同一个部门,相互也不熟悉,所以沟通上就会有一些需要注意的。首先要了解“对手”,主要是因为如果对方是个技术高手,你不能像个白痴小孩,要有所准备,最起码知道他们用什么开发语言,他们需要关注的业务逻辑,等等,不能让他们得到你是个菜鸟的结论。

由于口头的好多东西可能是没有经过检验的东西,所以前几次达成的协议我们只是做个参考,需要多次沟通之后才能确定结果,比如我们的项目中我们需要和Python组Java组协调消息接口,消息格式的时候。你要知道协调RabbitMQ时候我们需要定义下交互的Exchange,queue name 或者RoteKey等等,同时由于消息格式比较大,需要定义一些关键字或者预设字段的话,需要发邮件进行确认与沟通,避免开发过程中产生误会影响完成的功能返工。

总之这次搭架子的过程收获很多,一时半会也不能想的全面,以后慢慢聊,由于是第一次资历尚浅,好多的技术选型,问题考虑可能不成熟,也希望大家知道更多的能够纠错指导。



下面就说一些我们在架构中使用的一些东西:

  • 开发语言:C#,java,Python;
  • 数据存储:缓存,文件(xml),MSsql,Mysql,Redis;
  • 数据交互:rest,json,RabbitMq;
  • 操作系统:ubuntu,windows;
  • 虚拟机监控:zabbix;
  • 搜索:solr;
  • 多线程,多层架构,模块式开发,组件式开发;
时间: 2024-09-12 12:01:55

分布式系统 并不是我想象中的那样!的相关文章

SEO真如想象中的那么容易么

有很多的站长朋友把SEO理解为很简单的事情,其实恋星辰认为有这种想法的朋友要么是非常的精通SEO优化,要么就是仅仅是处在SEO的入门阶段而已.为什么会这样说呢?所谓会者不难,难者不会,如果一个人对其掌握的非常透彻,那么自然他会感觉到没什么,很简单.反过来说,对于那些仅仅了解了SEO的一些皮毛,就在那嚷嚷SEO不过如此的那些站长,其实是自然的阅历并没有达到相应的高度,自然看不出其中的水深水浅.   很多人理解上的SEO只是停留在表面层次,认为它只是一个提高网站排名的方法,觉得只要平时多发一些文章,

浅谈百度新功能:做好用户体验没有想象中难

对于seo而言,做到最后其实就是为了做好用户体验,因而seoer就不得不重要用户体验.那么,seoer又该如何才能做好用户体验呢?对此笔者以百度最近新添加的功能作为引子,供站长们参考. 首先来看下百度在5月中上线的"添加至百度首页"功能,使用该功能的话就可在百度首页的导航栏里直接访问所添加的网站.这一功能的话,对于SEO是否有影响暂时不得而知.   此功能如同我们常用的收藏夹,不同的是该功能还会智能化的根据用户对网站的访问频率给予自动添加,而用户不需要则可自己删减.而从一功能上,很大的

电商线下体验店没想象中乐观

"对不起,我知道,你在等"的广告语在北京国贸等地铁站随处可见,化妆品网购平台聚美优品将开设线下旗舰店.聚美优品CEO陈欧表示,2013年聚美优品将携手各大化妆品品牌在全国大力开设聚美优品线下旗舰店,并且有消息称,聚美优品线下店的开店计划可能会提前. 实际上,电商从线上走入线下的发展趋势2011年就已有所显现.在百货.家电.时装等行业纷纷"触电"的同时,电子商务企业也在探索发展新模式.2011年5月27日,淘宝抢先开了家居业第一家电子商务线下体验馆,引起了家居行业各方

std::string的Copy-on-Write:不如想象中美好

Copy-on-write(以下简称COW)是一种很重要的优化手段.它的核心思想是懒惰处理多个实体的资源请求,在多个实体之间共享某些资源,直到有实体需要对资源进行修改时,才真正为该实体分配私有的资源. COW技术的一个经典应用在于Linux内核在进程fork时对进程地址空间的处理.由于fork产生的子进程需要一份和父进程内容相同但完全独立的地址空间,一种做法是将父进程的地址空间完全复制一份,另一种做法是将父进程地址空间中的页面标记为"共享的"(引用计数+1),使子进程与父进程共享地址空

企业共享威胁情报?困难远远比想象中多

从理论上来说,共享威胁情报是一件很有意义的事情.但在互联网安全领域,这件「美好的事情」要实现并非那么容易. 美国国土安全部三月份的时候部署了自动指示共享系统(Automated Indicator Sharing),无论是私人组织还是公共组织都可以在该系统中进行威胁情报的交换.可以看出美国国土安全部的初衷是好的,在这样的系统中可以加快信息分享和传播的速度,帮助各种类型的企业和组织在威胁刚出现时做好及时的防护工作. 有很多信息安全专家也表示,网络威胁情报信息给组织带来很大的价值.但如果去探究共享过

滴滴大数据:欧洲杯没有想象中火爆 英葡比赛最受关注

四年一届的欧洲杯进入到白热化阶段,不过相比于世界杯,欧洲杯的关注程度并没有想象中那么高.7月1日,滴滴出行公布了欧洲杯期间的出行数据,综合滴滴平台晚上11点到清晨6点的专快车.代驾订单可以发现,去往酒吧等传统聚会看球区域的订单并没有出现井喷式增长.这或许从另一个侧面说明,欧洲杯的吸引力不够,大多数球迷更喜欢在家熬夜看球.   滴滴方面分析,6月下旬去往酒吧等聚会场所的订单增长主要还是受季节因素影响,涨幅也在情理之中,欧洲杯的推动作用并不大. 据悉,本届欧洲杯由于进球数量低,一度被球迷形容为"史上

中国外贸B2C:远没想象中那么美好!

外贸B2C网站兰亭集势(Lightinthebox)计划于6月6日登陆纽约证券交易市场,从公布的申请材料看,各项指标都具有不错的吸引力:2012年营收2亿美元,同比增速72%:毛利率42%,直接秒杀做国内市场的电商网站--平日里很少关注外贸电商的媒体找到了兴奋点,对兰亭集势不吝看好和赞美之词:而所谓"外贸电商闷声发大财"的观点被疯狂传播,羡煞了中国绝大多数电商人.事实果真如此?以下笔者结合已经上市的DX财报和兰亭集势披露的部分数据来分析中国外贸B2C现状,情况远远没想象中那么美好! 毛

检测内部威胁比想象中简单

本文讲的是检测内部威胁比想象中简单,内部威胁指的是公司内部员工,但入侵者却不再仅仅局限于身处公司大楼内部的人.甚至本地咖啡馆这种公共场所,都能连上公司网络. 由于企业系统的边界正在模糊,网络安全的难度加大,企业需要调整策略和规程.虽然很多技术都在改变,但限制依然留存,公司必须在阻止恶意攻击上继续保持积极主动.他们必须了解自己的威胁,并调整自己的技术以适应威胁.更重要的是,招募合适的团队,打造正确的技术. 对内部威胁的遏阻,应与期望缓解的风险类型相匹配,要基于环境因素制定计划,比如公司文化.公司状

天弘基金为何亏损?高管称余额宝没想象中赚钱

余额宝的成功让天弘基金无限风光,风头直盖华夏基金.不过,一则物产中拓公告却透露出天弘基金另一番风景:尽管余额宝规模突破2500亿元,天弘基金2013年却出现亏损. 物产中拓http://www.aliyun.com/zixun/aggregation/33721.html">2014年度非公开发行股票预案中披露,天弘基金2013年营业收入3.1亿,净亏243.93万元.而天弘基金2012年营业收入1.14亿元,亏损1535.5万元. 内蒙君正(天弘基金股东)2013年半年报显示,天弘基金2