前端开发都应该知道的配置中心

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zouzhigang96/article/details/96436230

前端开发都应该知道的配置中心

动态化方案一般都是比较大型的, 比如react native 、flutter 等都是从UI,运行逻辑等多方面完整的动态更新。但实际上,移动端还有很多细粒度的配置类数据需要支持动态更新的。

比如某一个文案或者广告的位置希望可以根据用户表现来随时改动,又比如你开开发了一个线上功能,但上线后才发现里面潜藏了一个严重的问题, 希望可以同过一个线上开关立即关闭此功能。

这一类需求用一句话来讲就是叫做:千万不要写死。

Android里面大家都很数据的sharedpreference,里面可以存储很多的K-V类型的数据。那我们如何来实现一套可动态更新的K-V存储机制呢? 从而将这类小型配置或AB开关准时下发到所以的客户端。

为了实现这个功能,很多公司都研发了一套自己的配置中心系统,比如阿里内部的orange系统,能狗做到秒级下发所以配置到全量客户端。

要实现这样一套系统,需要考虑到几个问题点:

  • 首先,远端配置更新后,如何实时通知给所有客户端呢?
  • 配置数据体积越来越大,下载失败率变高,如何优化数据包大小呢?
  • 配置数据的安全性如何保证?
  • 如何灰度发布配置?
  • 实时全量下发的话,CDN会存在什么问题吗?
  • Android 如何实现多进程监听配置变更?

如何通知客户端配置更新

首先我们要解决的问题是:如何才能尽快告诉客户端,配置数据以及更新了?

1.主动拉取(Pull)

第一种方式,我们可以让客户端进行主动轮询:

  • Polling定时轮询:定时发起请求到后端,拉取最新的配置数据。。
  • Long Polling长轮询:后台起一个service,持续去发去长轮询判断后端是否有配置数据更新,一旦发现有更新,再发起请求去拉取配置

关于长轮询说明下,普通的短连接是客户端发起socket请求,服务端收到后,不管有没有数据,都会立即返回。

而如果长轮询,服务端如果没有数据则会hold该请求,将socket等请求信息保存起来, 不立即返回, 等到有数据时才通过socket重新写回客户端。当客户端收到结果,或者判断请求超时,便会发起下一次的长轮询请求, 此时的超时时间一般会比正常的http请求的超时时间长, 比如一分钟,比减少请求次数。

这种方式可能能够达到比较好的实时性,但很显然,会带来非常多的流量浪费,而且对后端也会带来非常多无用的请求,造成机器资源的浪费。

2.推送(Push)

这种方式可以借助长连接

当我们发布更新配置后,可以通过长连接通道向在线用户下发配置变更通知, 用户收到通知后便会主动去拉取配置。

这种方式可以极大的降低流量损耗,只有配置变更时才会拉取数据,但也存在一些问题:

* 需要维护稳定长连接通道,存在一定的技术成本。
* 如果用户长连接断开,会导致无法接收到消息,从而不能保证实时变更。

因此,这种非方式虽然节省流量,但不能够保证100%的实时配置生效率。

3.推拉结合

既然主动拉取和推送都做不到,很自然的,我们会想到能不能两种方式结合起来,方案如下:

* 客户端与服务端保持一个长连接,当有配置变更时,立即下发;
* 为防止长连失效导致更新不及时,客户端还会作定期轮询,拉取配置;

通过这种方式,可以获得较低的流量开销和较高的更新率。业界不少企业采用的是类似的方案,比如携程的配置中心系统Apollo。

4.统一网关

这里介绍第四种更新机制,来自阿里的Orange移动配置系统,它无需任何轮询请求和长连接通道下发,而且可以做到在线用户100%的秒级更新率。

它的秘密就是利用了全集团的统一网关,这套网关同时运行在客户端(Android、iOS)和服务端。移动端网关会接管所有客户端的请求,而后端网关则会承接所有移动端发过来的请求。具体流程如下:

* 客户端的任何网络请求在经过移动端网关时,带上本地配置的版本号;
* 服务端网关收到请求后,抽取出配置版本号,发送给配置中心服务,其他参数透传给业务后端
* 配置中心服务基于当前APP的版本号,配置版本号信息,判断是否有新配置,如果有则返回新配置版本号给网关
* 当业务后端返回时,带上这个新配置版本号给客户端
* 客户端发现新配置版本号,则去CDN拉取最新配置数据,完成更新。

在这个流程里,我们没有为配置单独发起轮询请求,也不需要依赖长连接服务进行下发,而且借助现有的业务数据,加上网关的协议,来实现配置的动态更新。只要客户端处于活跃状态,就能立即发现配置更细你, 而且非常稳定。

配置文件的增量更新,压缩与加密

很多开发者担心自己开发的功能上线后悔出现问,所以会加上各种各样的配置开关,随着版本的不断迭代,配置数据肯定会越来越大,如果每次数据更新,都需啊哟去全量下载,那消耗的流量会越来越多,而且,数据包越大,下载更新失败率会也会逐步变高。

因为,我们还要想办法减少下载配置数据包大小,一般会从两个角度考虑

1.增量更新
2.压缩

除此之外,有些配置数据是敏感的,所以应该要实现加密。

增量更新

增量算法有很多,我们可以结合具体场景来选择。

由于我们的配置都是纯文本,所以可以优先考虑文本Diff算法,如Google的diff-match-patch,就是专门针对纯文本的高性能Diff/Patch算法。而且它提供了多种语言版本实现,包括Java、Objective-C、Python、Dart等,

diff-match-patch内部是基于Myers算法,这个算法就是我们天天用的 git diff 和 RecyclerView 里的 DiffUtil的实现原理。而且diff-match-patch在这个基础上还做了不少性能优化。

当然,除了纯文本Diff,我们也可以考虑二进制Diff算法,如BsDiff算法,一般apk的更新、Tinker补丁包更新都可以采用这个增量算法。

压缩

对于文本压缩,用的最多的就是Gzip了,Http协议传输也是用的Gzip压缩,兼具压缩率和性能。所以此处也可以考虑Gzip压缩,接入成本最低,效果也不错。另外也可以考虑zStd压缩和Brotli压缩,感兴趣的读者可以去深入了解下。腾讯云CDN服务目前已经支持了Gzip压缩和Brotli压缩,当文本文件大小在256Byte - 2048KB之间时,采用Gzip压缩;更大的文件则采用Brotli压缩。

加密

不少情况下,我们会用配置中心来下发一些敏感数据。比如双十一活动,某个优惠券的生效时间戳,如果用户分析出来了,可以人为修改配置数据从而导致程序运行异常。因此,为了保护下发的敏感配置数据,我们需进行加密。

第一种方式,下发链路加密。我们可以对下发的配置数据压缩包进行整体加密,客户端拿到后,流式解密和解压到本地文件。以后客户端读取配置时可以直接读取明文。这种方式的问题就是配置数据是以明文形式落盘(存储到磁盘)的,这可能存在数据泄漏风险。

第二种方式,单Value加密。我们会对每个Key对应的Value进行加密,然后下发到客户端,解压后存储在磁盘里的是明文Key+密文Value,在需要读取某个配置时,再实时解密并缓存在内存里,从而降低数据泄漏风险。

在选择具体加密方式方面,考虑到客户端的解密耗时,可以使用类似AES/CBC/PKCS7Padding加密算法,密钥可以存储到客户端保护起来(为了安全可以放到so 内部,通过混淆提高安全性,或者采用白盒加密方案,将密钥与算法一起编译生成代码从而隐藏密钥),也可以支持动态更新。

另外,Value加密后是二进制数据,此时要利用Base64编码,把二进制数据转成文本写入配置文件中。

灰度、回滚及CDN压力

前面说了,我们的配置中心能够做到秒级下发,那这里会存在一个问题:如果配置有问题,可能会立即导致大规模线上故障。因此,这里需要支持配置的灰度发布。

一般可以支持多维度灰度,比如基于用户的App版本区间、Uid或者DeviceId、城市、渠道等维度信息来进行灰度。灰度发布后开始观察线上数据表现,确定逻辑运行正常且稳定,如果没问题,才可以全量发布。

那如果出了问题呢?那就要进行回滚。这里我们可以通过重新发布一个历史版本的配置数据来实现回滚。

另外,全量发布后,我们会将更新的配置数据压缩发布到CDN。这时,大量客户端在检测到更新后,会立即访问CDN下载对应的更新配置数据。如果用户量级很大,需要考虑会出现的CDN请求高峰,要确保CDN能承受对应的访问压力,不能被打挂。而且,由于CDN同步需要一段时间,所以此时肯定会有很多CDN发生回源,对源服务器也会造成一定的压力。因此,在每次发布后,可以结合具体场景及用户QPS,有选择地考虑对CDN进行预热。

小结

配置中心逐步成为各家公司的标配,一套好的配置中心系统,不仅能够支持各种维度的配置下发,如业务配置、技术配置、开关配置等,也要能够做到实时下发,能够尽快触达所有用户。尤其在一些用户量较大的场景下,要能够考虑流量压力,保证CDN等基础设施能够稳定运行。

展开阅读全文

每个程序员都应该知道的福利

04-22

眼下正是年后跳槽的黄金时期,园里的大牛小牛拿了去年的年终奖后,有些肯定想给自己加点工资。园里的大牛小牛都是我们中国软件业的精英,跳槽的时候 肯定手里握着好几个Offer, 不知道选择哪家。先不管工作的内容和前途,就工作本身的待遇,我们还是可以比较的。 HR是专门负责谈薪资的, 当我们跟HR讨价还价的时候, HR会介绍公司有的福利,而回避公司没有的福利。 作为程序员,我们一定要对跟我们利益息息相关的各种福利细节了如指掌, 各项福利都要跟HR询问清楚,才能比较公司之间的总体福利。 同时还需要掌握些技巧,别让我们的利益会受到损害。rnrn工资每个月多少rnrn工资是需要谈的,我见过很多优秀的人工资很低,就是因为他们不懂谈工资。公司之所以要求薪资保密,就是说明同等职位的工资存在较大的差异rnrn入职时候的工资可能在很长的一段时间内都不会变, 不要指望你入职后,再涨工资。rnrn例如:公司招了两个程序员,程序员A 5000,程序B 8000,用了一年。感觉两个人水平差不多,工资还是那样维持着。如果非要公司做解释,公司会说当初就是那么谈的。rnrn年底奖金有多少rnrn我们在计算自己的年薪都是用 (月工资*一年发多少个月)来算的, 年底的奖金非常重要, 这个一定要跟HR问清楚。 有奖金和没奖金的收入区别非常大, 没奖金的话,你过年怎么过?rnrn一般的公司都会在1月份的时候,农历新年之前发一个月的奖金。 好的公司会发两个月甚至更多, 一些变态的公司竟然发十几个月工资的奖金。rnrn那些年底没奖金的公司,最好别去。rnrn情景对话:rnrn程序员A说: “请问贵公司,年底发几个月的年终奖呢?”rnrnHR说: “奖金是跟绩效挂钩的, 有的人只能拿1个月,有的人能拿五六个月的”。rnrn程序员A说: "那请问我这个职位,表现一般的, 年底一般能拿多少个月呢?"rnrnHR说: “大概一个月吧”rnrn程序员A说: “这样啊, 明白了”rnrn程序员A心里想: “年终奖才一个月,我还以为有几个月,差点被她忽悠了”。rnrn股票期权rnrn上市公司可能会给员工股票,这是个好东西啊,很多人因为这个发财。rnrn试用期几个月,以及试用期工资多少rnrn很多大公司对试用期几个月,以及试用期工资是多少,有着明文规定, 不能谈的。rnrn有些小公司是可以谈的。rnrn试用期最好不超过3个月,试用期的工资应该和转正后的工资一样, 而且试用期内其他福利也应该和转正后一样。rnrn试用期如果是6个月会有比较大风险rnrn1. 试用期被裁。 公司被收购,或者你所在的项目缩减,都很有可能造成试用期被裁。按照法律规定,公司只需要提前3天通知你, 就可以了。不需要给你支付任何赔偿金。 这时候你会直接失业, 一下子陷入困境。rnrn2. 拿不到年终奖。 假如你是7月15日入职,那么1月15日你才转正。 公司在1月5日的时候发年终奖,而你还在试用期,就没有权利获得年终奖。rnrn住房公积金基数是多少,是否有补充住房公积金rnrn首先大家要知道。 住房公积金基数,社保基数,还有你纳税的基数。这三个基数是有可能不一样的。rnrn比如你的工资是8000,你的公积金可能按3000的基数交, 而你的社保可能按5000来交。rnrn在正规的公司,公积金基数和社保基数都是以你的工资基数来交的。rnrn住房公积金在我们买房子的时候用来贷款和还贷款的,所以对大部分人都是有用的。rnrn所以住房公积金是越高越好, 如果有补充公积金就更好了rnrn社保基数多少rnrn社保是指养老保险,医疗保险,失业保险,生育保险,工伤保险。 对于外地人来说,这些纯粹是剥削人的。你听说过有人拿过失业保险的赔偿么?交了这么多年的养老保险,以后打回原籍,一点都拿不到退休金。rnrn社保基数越低越好rnrn纳税基数是多少,是否有避税措施rnrn辛辛苦苦的赚来工资,很大一部分被别人拿走了。rnrn纳税很难避免的,还没发工资就被扣了。 不过听说过有些公司可以拿发票去顶税。rnrn入职日期rnrn入职日期最好是年后2月到4月. 好处在于rnrn1. 机会比较多,行情好rnrn2. 已经拿了去年的年终奖,rnrn3. 年过完了,年假也休得差不多了。rnrn4. 在心态上, 期望新的一年有个新的开始。rnrn5. 如果3月入职, 到了年底1月份,你共工作10个月,你能拿10/12的奖金rnrn公司加薪的制度rnrn大部分人都是靠跳槽来加薪, 如果公司的每年加薪幅度有10%以上, 就不用老跳槽了rnrn问清楚公司的加薪制度,公司每年有几次的加薪机会,平均加薪幅度有多大,在什么月份加薪.rnrn商业医疗保险rnrn如果公司给员工购买了商业医疗保险, 员工去看病,只要药品和治疗属于医保范围之类,100%报销,包括门诊和住院。 子女的医疗费用也能报销50%.。 女员工生孩子的费用也可以全报销。rnrn案例1:rnrn小王的公司给员工购买了商业医疗保险。 一天,小王感冒了,带着上海医保卡来到三甲医院看病。 医生开了400元的消炎药。 小王用医保卡付了400元。 小王把发票交给公司去报销。 最后公司将400元现金交给小王。 通过商业医疗保险,小王看病一分钱都没花,而且把医保卡中的钱,变成了手里的现金。rnrn案例2:rnrn老李的公司给员工购买了商业医疗保险。 有次小李的儿子生病住院,花了3000元。小李先用社会保险报销了1500元。 剩下的1500交给公司去商业医疗保险报销。 通过商业医疗报销。 老李儿子的医药费全都报销了,自己一分钱都不用拿出来。rnrn案例3:rnrn张小姐的公司给员工购买了商业医疗保险。 张小姐前段时间破腹产,花了8000多元。 还好有商业保险,全都报销了。 因为是独生子女, 商业医疗报销还奖励了1千元.rnrn通过这几个案例,我们可以看出商业医疗保险是个很好的福利。rnrn年假多少天rnrn按国家法律规定,满一年后有5天年假。 所以很多一般的公司都是按这个来的, 实在是年假太少了(满一年才有5天年假)。rnrn年假太少非常不爽,过年回老家都没假,平常要是有什么事。没年假了说不定还要请事假(扣工资的)rnrn有些外企,第一年10天年假, 工作满3年有15天年假。 而且是入职就有年假, 不用满一年。rnrn带薪病假多少天rnrn带薪病假就是:指跟公司请病假(不需要开病假单),不扣工资的。 这个福利很爽的哦rnrn一般外企会有这个福利。 这带薪病假跟年假差不多, 只不过带薪病假一般不能连续请几天。rnrn案例1:rnrn小志计划周三带女朋友去杭州玩,行程早就安排好了。 到了周三早上,小志给他领导打电话,说他女朋友身体不舒服,需要请一天病假。 领导说: "好的,你好好照顾你女朋友吧". 然后小志高高兴兴陪女朋友在杭州玩,不用担心扣工资。rnrn每年旅游机会rnrn小福利, 出国旅游才是较大的福利,rnrn有无出国的机会rnrn能出国是很多人考虑的因素,有海外工作经验会对自己的职业生涯有很大的帮助。rnrn稳定性rnrn现在虽不是技术牛人,就是正在成为技术牛人的人,不担心找不到工作。就算碰到裁员,拿了赔偿金后,还能迅速找到更好的工作。rnrn一般女生比较注重稳定性。rnrn过节的福利rnrn小福利,不用考虑,比如端午节发个粽子, 中秋节发个月饼票rnrn培训机会rnrn有没有英语培训,或者技术培训。rnrn健身补助,饭补,交通补助rnrn可遇不可求。rnrn企业文化和工作氛围rnrn最怕碰到那种有办公室政治的公司了,同事之间勾心斗角,拉帮结派,排挤新人,搞得乌烟瘴气。rnrn大家开开心心在一起工作多好,何必搞这么多名堂呢?rnrn喜欢领导和同事都很Nice的公司。rnrn上班的路程rnrn当然是公司离住所越近越好,谁都不想早上挤地铁挤公交。1个多小时下来,赶到公司歇口气才能缓过来rnrn定期的体育活动rnrn健康的重要性不言而喻,大部分程序员的身体都处于亚健康的姿态,坐在电脑面前一坐就是一天。除了休息和健康的饮食外,运动是我们保持健康的唯一的方法。rnrn去健身房办卡很难坚持,很多人办了卡只去过一两次,如果公司有定期的体育活动,比如篮球,羽毛球。我们就很容易坚持。rnrn最后算算到手能拿多少rnrn每个月拿到手的,才是你真正的工资。不要把税前的工资当成是你的工资。 论坛

@_@所有PHP程序员都应该知道的五个工具

06-26

所有PHP程序员都应该知道的五个工具rn在参与了几个大型PHP项目,写了很多PHP代码以后,我发现很多工具可以提高代码质量,简化发布,使得做为PHP开发人员的生涯变得轻松许多。许多这样的工具可能已经为大家所用。但是,由于一些人甚至没有注意到这些工具的存在,我会从此开始,好了,不说废话,下面是我认为所有PHP程序员应该知道的工具列表。 Phing - 一个项目构建系统Phing 是一个基于Apache ANT 的项目构建系统。它的名字是一个拗口的语句首字母缩写 - PHing Is Not GNU make 。Phing可以做传统构建系统比如 GNU make 能做的任何事情,同时没有陡峭的学习曲线。rn在phing(以及其他的构建系统)背后的思想是评估一系列相关性,然后执行一系列PHP类去正确的安装和配置一个应用系统。构建过程用一个简单的 XML配置文件控制。Out of the box, phing内置可以执行一系列替换(比如:在你的开发版本和产品版本间改变include路径)、执行SQL语句、移动和复制文件、运行外部脚本等等。通过扩展包含在发行包中的“task”类,你也可以创造自己的定制任务。rn对任何需要在超过一台服务器上部署大型PHP应用的人来世,Phing是一个无价之宝。同时我发现它对简单的PHP脚本也是很有用的。rnXdebug - 调试和分析工具Xdebug 是帮助你调试和分析脚本的一个PHP扩展。Xdebug中最有用的特性是在激活后显示的新注意信息、警告信息和错误信息。如果一个脚本不能正常运行,Xdebug将会输出关于错误信息的完整堆跟踪 ,会附带函数名称、参数值、源文件和行号。这对于厌倦了PHP默认只带的可怜的错误报告功能的程序员是一个值得欢迎的特性。rn这个扩展有很多更先进的功能,允许开发人员进行代码覆盖率分析,收集分析信息以及交互式地调试脚本。profiling functionality 功能尤其有用。分析器使用一个普通的输出文件格式,允许你使用象 KCacheGrind 这样的工具快速发现你代码中的瓶颈。对任何严肃的开发人员而言,一个好的分析器是基本工具,它使得你妥善优化你的代码,同时避免过早优化带来的危害。rnPHPUnit - 单元测试框架PHPUnit 是一个轻量级的PHP测试框架。它是在PHP5下面的 JUnit 3.8.1 完整移植,是xUnit 测试框架家族的一员(它们基于软件模式 先锋 Kent Beck 的设计)。rn单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被前面讨论的Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试。rnPropel - ORM(对象关系映射)框架Propel是一个PHP5下面的对象关系映射(ORM)框架,它起源于Apache Torque项目。它提供了一个复杂但是易用的数据库抽象层,使得你可以在PHP中象使用普通类和对象一样得使用数据库实体。Propel允许你使用一种简单的XML格式定义你的数据库,这个XML文件被用来映射数据库,生成应用中使用的静态类。rnPropel被内嵌于流行的Symfony PHP框架 (还有其他的),它使得代码更灵活、模块化以及可移植。这个项目有The project has 出色的文档,以及很棒的支持社区。rnphpMyAdmin / phpPgAdmin - 基于web的数据库管理系统历史有点长可是还是很有用,phpMyAdmin是对于任何数据库(对应PostgreSQL和SQLite是phpPgAdmin 和 phpSQLiteAdmin)最有用的管理工具之一。它有助于做每一件事情 - 从为了调试应用去创建和删除数据库到做备份。安装它通常是我在一个LAMP服务器上面安装完 Apache, PHP和MySQL后做的第一件事情。如果你使用MySQL,不知何故还没听说过它,那么现在就安装 。rn其他工具还有很多优秀的工具用以符合各种需要,帮助PHP开发者创建一个丰富的开发环境 — 我希望我可以说到所有这些工具。我发现对自己有用的工具有PHP Beautifier, Spyc, Creole和Smarty。我确信还有很多我忘记或者没听说过的有用工具。因此,如果你知道某个我遗漏的PHP开发伟大工具,请留言让我(以及所有人)知道!rnrnfrom:http://www.yeeyan.com/articles/view/2930/1946rnrn另,感觉http://www.yeeyan.com不错,里面的文章都是翻译过来的,感兴趣的去看看吧,以后顺便多转点过来 论坛

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