Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >程序世界里的不信任原则

程序世界里的不信任原则

原创
作者头像
林喜东
修改于 2017-09-18 06:55:22
修改于 2017-09-18 06:55:22
5.2K0
举报
文章被收录于专栏:林喜东的专栏林喜东的专栏

导语

人与人之间最重要的是信任,但程序的世界里,可能信任越少越好;我越发觉得越是高性能高可用的系统里,不信任原则会体现得更加淋漓尽致。 为了少走弯路,写下这篇文章留给自己参考,其中一些是自己踩过的一些坑;一些是接手他人系统时触过的雷;还有一些是从别人分享的经验学习得来;能力有限,先记下自己的一些体会,错误的地方再慢慢改正。

一、编程的世界里十面埋伏

编程,是一件容易的事,也是一件不容易的事。说它容易,是因为掌握一些基本的数据类型和条件语句,就可以实现复杂的逻辑;说它不容易,是因为高性能高可用的代码,需要了解的知识有很多很多;编程的世界,也跟扫雷游戏的世界一样,充满雷区,十面埋伏,一不小心,随时都可能踩雷,随时都可能Game Over。

而玩过扫雷的人都知道,避免踩雷的最好方法,就是提前识别雷区并做标记(设防)避免踩踏。

鉴于此,编程的世界里,从输入到输出同样需要处处设防,步步为营。

1、对输入的不信任

(1)对空指针的检查

不只是输入,只有是使用到指针的地方,都应该先判断指针是否为NULL,而内存释放后,应当将指针设置为NULL。

【真实案例】:注册系统某段逻辑,正常使用情况下,都有对指针做检查,在某个错误分支,打印日志时,没检查就使用了该字符串;结果可正常运行,但当访问某个依赖模块超时走到改分支,触发bug,导致coredump。

(2)对数据长度的检查

使用字符串或某段buf,特别是memcpy/strcpy时,需要尽量对数据长度做下检查和截断。

【真实案例】:接手oauth系统后运行数月表现良好,突然有一天,发生了coredump,经查,是某个业务不按规定请求包中填写了超长长度,导致memcpy时发生段错误,根本原因,还是没有做好长度检查。

(3)对数据内容的检查

某些场景下,没有对数据内容做检查就直接使用,可能导致意想不到的结果。

【案例】:sql注入和xss攻击都是利用了服务端没有对数据内容做检查的漏洞。

2、对输出(变更)的不信任

变更的影响一般体现在输出,有时候输出的结果并不能简单的判断是否正常,如输出是加密信息,或者输出的内容过于复杂。

所以,对于每次变更

(1)修改代码时,采用不信任编码,正确的不一定是“对”的,再小的修改也应确认其对后续逻辑的影响,有些修正可能改变原来错误时的输出,而输出的改变,就会影响到依赖该改变字段的业务。

(2)发布前,应该对涉及到的场景进行测试和验证,测试可以有效的发现潜在的问题,这是众所周知的。

(3)发布过程,应该采用灰度发布策略,因为测试并非总是能发现问题,灰度发布,可以减少事故影响的范围。常见灰度发布的策略有机器灰度、IP灰度、用户灰度、按比例灰度等,各有优缺点,需要根据具体场景选择,甚至可以同时采用多种的组合。

(4)发布后,全面监控是有效发现问题的一种方法。因为测试环境和正式环境可能存在不一致的地方,也可能测试不够完整,导致上线后有问题,所以需采取措施补救

A:如使用Monitor监控请求量、成功量、失败量、关键节点等 B:使用DLP告警监控成功率 C:发布完,在正式环境测试一遍

【案例】oauth系统某次修改后编译时,发现有个修改不相关的局部变量未初始化的告警,出于习惯对变量进行了初始化(初始化值和编译器默认赋值不一样),而包头某个字段采用了该未初始化的变量,但在测试用例中未能体现,监控也没细化到每个字段的值,导致测试正常,监控正常;但前端业务齐齐互动使用了该包头字段,导致发布后影响该业务。

二、服务程序的世界里防不胜防

一般的系统,都会有上下游的存在,正如下图所示

而上下游的整个链路中,每个点都是不能保证绝对可靠的,任何一个点都可能随时发生故障,让你措手不及。

因此,不能信任整个链路中的任何一个点,需进行设防。

1、对服务本身的不信任

主要措施如下:

(1)服务监控

前面所述的请求量、成功量、失败量、关键节点、成功率的监控,都是对服务环节的单点监控。

在此基础上,可以加上自动化测试,自动化测试可以模拟应用场景,实现对于流程的监控。

(2)进程秒起

人可能在程序世界里是不可靠的因素(大牛除外),前面的措施,多是依赖人来保证的;所以,coredump还是有可能发生的,这时,进程秒起的实现,就可以有效减少coredump的影响,继续对外提供服务。

2、对依赖系统的不信任

可采用柔性可用策略,对于根据模块的不可或缺性,区分关键路径和非关键路径,并采取不同的策略

(1)对于非关键路径,采用柔性放过策略

当访问非关键路径超时时,简单的可采取有限制(一定数量、一定比重)的重试,结果超时则跳过该逻辑,进行下一步;复杂一点的统计一下超时的比例,当比例过高时,则跳过该逻辑,进行下一步

(2)对于关键路径,提供弱化服务的柔性策略

关键路径是不可或缺的服务,不能跳过;某些场景,可以根据目的,在关键路径严重不可用时,提供弱化版的服务。举例如派票系统访问票据存储信息严重不可用时,可提供不依赖于存储的纯算法票据,为弥补安全性的确实,可采取缩短票据有效期等措施。

3、对请求的不信任

(1)对请求来源的不信任

有利可图的地方,就会有黑产时刻盯着,伪造各种请求,对此,可采取如下措施

A:权限控制 如ip鉴权、模块鉴权、白名单、用户登录态校验等 B:安全审计

权限控制仅能打击一下非正常流程的请求,但坏人经常能够成功模拟用户正常使用的场景;所以,对于一些重要场景,需要加入安全策略,打击如IP、号码等信息聚集,频率过快等机器行为,请求重放、劫持等请求)

(2)对请求量的不信任

前端的请求,不总是平稳的;有活动时,会暴涨;前端业务故障恢复后,也可能暴涨;前端遭到恶意攻击时,也可能暴涨;一旦请求量超过系统负载,将会发生雪崩,最终导致整个服务不可用,对此种种突发情况,后端服务需要有应对措施

A:频率限制,控制各个业务的最大请求量(业务根据正常请求峰值的2-3倍申请,该值可修改),避免因一个业务暴涨影响所有业务的情况发生。

B:过载保护,虽然有频率限制,但业务过多时,依然有可能某个时间点,所有的请求超过了系统负载,或者到某个IDC,某台机器的请求超过负载,为避免这种情况下发生雪崩,将超过一定时间的请求丢弃,仅处理部分有效的请求,使得系统对外表现为部分可用,而非完全不可用。

三、运营的世界里不可预测

1、对机器的不信任

机器故障时有发生,如果服务存在单点问题,故障时,则服务将完全不可用,而依赖人工的恢复是不可预期的,对此,可通过以下措施解决

(1)容灾部署

即至少有两台以上的机器可以随时对外提供服务。

(2)心跳探测

用于监控机器是否可用,当机器不可用时,若涉及到主备机器的,应做好主备机器的自动切换;若不涉及到主备的,禁用故障机器对外提供服务即可。

2、对机房的不信任

现实生活中,整个机房不可用也是有发生过的,如2015年的天津滨海新区爆炸事故,导致腾讯在天津的多个机房不能对外提供正常服务,对此采取的措施有:

(1)异地部署

不同IDC、不同城市、不同国家等部署,可用避免整个机房不可用时,有其他机房的机器可以对外提供服务

(2)容量冗余

对于类似QQ登陆这种入口型的系统,必须保持两倍以上的冗余;如此,可以保证当有一个机房故障时,所有请求迁移到其他机房不会引发系统过载。

3、对电力的不信任

虽然我们越来越离不开电力,但电力却不能保证一直在为我们提供服务。断电时,其影响和机器故障、机房故障类似,机器会关机,数据会丢失,所以,需要对数据进行备份。

(1)磁盘备份

来电后,机器重启,可以从磁盘中恢复数据,但可能会有部分数据丢失

(2)远程备份

机器磁盘坏了,磁盘的数据会丢失,使用对于重要系统,相关数据应当考虑采用远程备份。

4、对网络的不信任

(1)不同地方,网络时延不一样

一般来说,本地就近的机器,时延要好于异地的机器, 所以,比较简单的做法就是近寻址,如CMLB。

也有部分情况,是异地服务的时延要好于本地服务的时延,所以,如果要做到较好的最优路径寻址,就需要先做网络探测,如Q调

(2)常有网络有波动或不可用情况

和机器故障一样处理,应当做到自动禁用;但网络故障和机器故障又不一样,经常存在某台机器不可用,但别的机器可以访问的情况,这时就不能在服务端禁用机器了,而应当采用本地回包统计策略,自动禁用服务差机器;同时需配合定时探测禁用机器策略,自动恢复可正常提供服务机器。

5、对人的不信任

人的因素在运营的世界里其实是不稳定的因素(大牛除外),所以,不能对人的操作有过多的信任。

(1)操作备份

每一步操作都有记录,便于发生问题时的回溯,重要的操作需要review,避免个人考虑不周导致事故。

(2)效果确认

实际环境往往和测试环境是存在一些差异,所有在正式环境做变更后,应通过视图review和验证来确认是否符合预期。

(3)变更可回滚

操作前需对旧程序、旧配置等做好备份,以便发生故障时,及时恢复服务。

(4)自动化部署

机器的部署,可能有一堆复杂的流程,如各种权限申请,各种客户端安装等,仅靠文档流程操作加上测试验证时不够的,可能某次部署漏了某个步骤而测试又没测到,上线后就可能发生事故若能所有流程实现自动化,则可有效避免这类问题。

(5)一致性检查

现网的发布可能因某个节点没同步导致漏发,也就是不同的机器服务不一样;对此,有版本号的,可通过版本号监控发现;没版本号的,则需借助进程、配置等的一致性检查来发现问题。

备注:以上提到的不信任策略,有的不能简单的单条使用,需要结合其他的措施一起使用的。

四、小结

好了,先写这么多。最重要的还是那句话,程序的世界里,应该坚持不信任原则,处处设防。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【月球殖民靠AI】神经网络发现7000个新陨石坑,人类2030年或找到月球定居点
【新智元导读】最近,美国和加拿大的研究人员用人工智能发现了月球上近7000个此前未被发现的陨石坑,仅用时几个小时。未来,人类将有可能在这些陨石坑巨大的阴影下建立月球基地。 人类离开地球后的第一个家园可能很快就会被找到。 最近,美国宾夕法尼亚州立大学的Ari Silburt和加拿大多伦多大学的Mohamad Ali-Dib领导的研究小组,利用人工智能发现了月球上近7000个此前未被发现的陨石坑,仅用时几个小时。 专家说,未来,人类可以在陨石坑巨大的阴影下建立月球基地,这样可以保护殖民者免受太阳辐射的危险
新智元
2018/03/22
7140
【月球殖民靠AI】神经网络发现7000个新陨石坑,人类2030年或找到月球定居点
基于传统方法的单目深度估计
单目深度估计一直以来都是计算机视觉领域中的一项非常具有挑战的难题。随着计算机技术、数字图像处理算法和深度学习等技术的发展,常用的单目深度估计算法大概可以分为以下几类:基于线索的和机器学习的传统方法、基于有监督的深度学习方法和基于无监督的深度学习方法。
计算机视觉
2021/12/27
1.9K0
基于传统方法的单目深度估计
为什么 AI 工程师,更有机会成为下一个超级英雄?
在漫威世界里,数十个超级英雄擅长着不同的技能,有装备无敌的钢铁侠,有格斗超强的黑寡妇,还有灵活自如的蜘蛛侠,他们在一起保护着地球免遭一次次天降厄运。
HyperAI超神经
2019/12/01
4330
为什么 AI 工程师,更有机会成为下一个超级英雄?
Honeybee机器人与NASA的不期而遇怎样改变世界?
曾经有许多个夜晚,Honeybee机器人的联合创始人兼主席Stephen Gorevan在自己纽约的家中的熬夜计划NASA正在探索火星的两个漫游车下一天的活动。这个工作非常紧张,不容许发生任何的错误,并且需要在很短的时间内完成。但是当他有时间回顾时,Gorevan才意识到他所做的事情是多么的有意思。 Honeybee为NASA完成了超过90个项目,包括其第一个进入太空的产品,岩石磨损工具(RAT),这是第一台获取火星内部岩石的机器。它们被安装在了火星漫游车“勇气号”和“机遇号”的机械臂上。这对漫游车在火星上
机器人网
2018/04/12
5390
摘下月亮送给爱人?AstroReality用AR技术帮你实现
不能去外太空摘月亮,但我们还有AR。 现在,情歌里写的“摘下星星送给你”、“月亮代表我的心”等诺言AstroReality公司可以帮你实现了。该公司推出一种全新的增强现实体验,可以让“月球”成为你们的私密空间。 月亮远在天边,这家初创公司是如何打造月球的呢?AstroReality想了一个妙招,首先使用3D打印技术建立起一个大约一磅重的球体,再通过详细的NASA月球轨道数据,让月球表面在一磅重的球体上重现。 据AstroReality的详细介绍,该球体采用市场上最准确的3D打印技术来制造,这意味着它是用月球
镁客网
2018/05/29
6070
特斯拉、微软、谷歌、Meta等大厂传裁员;AMD与英特尔CPU被曝恐存在内核内存漏洞,缓解措施将增加12%-28%的计算成本
AMD与英特尔被爆CPU恐存在内核内存漏洞,缓解措施将增加12%-28%的计算成本 近日,苏黎世联邦理工学院研究人员发现,英特尔和AMD 的部分微处理器易受新发现的推测性执行攻击,从而泄露密码数据和其他敏感材料。该攻击被命名为Retbleed,源于2018年推出的一个减轻推测性执行攻击的retpoline 软件防御机制。 Retbleed 的原理在于,使用基本上毒化 CPU 赖以进行猜测的分支预测单元代码。当 CPU 遇到直接或间接指令分支时,推测性执行攻击会预测其将收到的下一条指令地址,并在预测被确认之前
AI科技评论
2022/07/19
5900
特斯拉、微软、谷歌、Meta等大厂传裁员;AMD与英特尔CPU被曝恐存在内核内存漏洞,缓解措施将增加12%-28%的计算成本
悬赏17万:美国“知乎”的沙雕问题,需要AI来识别
比赛内容之一,就是让AI识别出建立在虚假前提上的问题,简称虚假问题 (Insincere Questions) 。
量子位
2018/12/13
4730
悬赏17万:美国“知乎”的沙雕问题,需要AI来识别
最近做的流水账 | 闲聊扯淡
最近做的东西吧都比较琐碎,很难整理成一个固定的体系给大家分享,所以就有了今天这篇文章。
逮虾户
2022/03/06
2930
小哥凭“量子速读”绝技吸粉59万:看街景图0.1秒,“啪的一下”在世界地图精准找到!
明敏 金磊 发自 凹非寺 量子位 | 公众号 QbitAI 一张图在你眼前闪过0.1秒,是什么感觉? “我看到过它???” 但有人,只看了一张街景0.1秒,就能在世界地图上快速锁定它的位置! 只见图片一闪而过,我还没反应过来发生了啥。 结果小哥直接把地图拉开,行云流水一通操作,找到了它就在斯里兰卡! 再慢放看看,这上面不就是几棵树和一条土路吗?? 还有这种看上去极为普通的马路,貌似出现在哪个大洲都很有可能。 但这位小哥立马能判断出它在澳大利亚北部。 这效果,怎么有股量子速读那味儿了? 而凭借着这
量子位
2022/06/27
5940
小哥凭“量子速读”绝技吸粉59万:看街景图0.1秒,“啪的一下”在世界地图精准找到!
嫦娥四号传回“旅行照”,全球首张照片值得一声“哇”!
其实,在传回照片的前一天,玉兔二号还调皮的发了一条朋友圈,称“今天,我有点想家。”,随后,便向“家里”发送了一张“旅行照”。
镁客网
2019/01/24
3930
嫦娥四号传回“旅行照”,全球首张照片值得一声“哇”!
1%大气密度也能飞?NASA把无人机送上火星,最具野心探测计划启动
7 月 30 日,在美国宇航局 NASA 成功发射的 MARS 2020 任务中,「宇宙神 5」型运载火箭将最新一代火星探测器毅力号 (Perseverance)送上轨道。
机器之心
2020/08/04
4140
每周分享第 31 期
欢迎投稿,请前往 GitHub 的 ruanyf/weekly 提交 issue。
ruanyf
2018/12/13
6020
每周分享第 31 期
《AI赋能星际探索:机器人如何开启宇宙新征程!》
在人类对宇宙无尽的探索中,空间探索任务始终充满挑战。从遥远星球的探测,到空间站的维护,每一项任务都需要高精度、高可靠性的操作。人工智能(AI)的迅猛发展,为空间探索机器人带来了革命性的变革,使其能够在复杂的宇宙环境中更高效、精准地完成任务。
程序员阿伟
2025/02/24
1840
下次登月,让机器猩猩上 !
有没有可能下一次月球任务就是让一只机器猩猩登月,这是它的一小步,却是所有机器人的一大步? 科学家们又一次对探月来了兴趣,尤其是对上面的氦-3同位素感兴趣,人们认为月球上的这个元素储量很大,可能有一天
机器人网
2018/04/19
8380
下次登月,让机器猩猩上 !
下一次火星任务,中国要放飞自己的无人机
来源:机器之心  本文约2000字,建议阅读5分钟 无人机将成为火星车的「导游」。 火星只有地球 1% 的大气密度,但以后火星车要是不带个无人机可能就显得不够先进了。 提到火星无人机,你可能会想起搭乘「毅力号」前往火星的「机智号」无人机。今年四月,在世人瞩目下,机智号完成了持续约 40 秒的火星首飞,在垂直上升 3 米后,执行了悬停、下降和着陆等所有设定动作。机智号创造了人类在火星上的「莱特兄弟时刻」。 在地球以外的行星放飞无人机除了工程技术方面的意义,还会对探索带来很大帮助,实际上国内关于火星无人机的研
数据派THU
2023/03/29
2520
下一次火星任务,中国要放飞自己的无人机
马太效应和幂律分布是怎么回事?终于有人讲明白了
导读:描述“富者愈富,穷者愈穷”的马太效应,以及经济学中的帕累托法则,其背后的数学模型是什么?在统计学中,它们可以被抽象成幂律分布。
IT阅读排行榜
2020/08/07
1.6K0
马太效应和幂律分布是怎么回事?终于有人讲明白了
人类首次行星防御实验成功:NASA这一撞,改变了一颗星球的轨道
机器之心报道 编辑:泽南、小舟 这一集我在《独行月球》里看过。 北京时间今天早晨 7 点 14 分,人类主动用飞行器改变了一颗小行星卫星的轨道。 根据陨石撞击说,大约 6500 万年前,一颗直径 10 公里,体积相当于一座中等城市大小的小行星从天而降。它在地球上撞出一个巨大的深坑,导致山洪爆发、气温骤降,地球因被灰尘笼罩而终年不见阳光。当时的「地球霸主」恐龙无法适应这强烈的环境变化,最终灭绝。 这是一个被人广为知晓的猜想,实际上撞地球的天体并不是几千万年才有一次:每年都有大量小行星撞向地球,绝大部分都在地
机器之心
2022/09/27
4680
人类首次行星防御实验成功:NASA这一撞,改变了一颗星球的轨道
波士顿机器狗将比马斯克先登上火星?「恢复算法」加持,跌倒了还能爬起来!
---- 新智元报道   来源:NASA 编辑:小匀 【新智元导读】在登陆火星这件事上,人类可能要落后「狗狗」了?近日,NASA和加州理工学院的研究人员展示了「火星犬」,这只机器狗由波士顿动力的Spot改进而来,并一系列配备了AI和传感设备,比起好奇号、毅力号等火星探测器,这只「火星犬」不仅体型小、速度快,还更利于探测火星的险恶地形和地下洞穴。 估计就连天天做火星梦的马斯克都想不到,「狗」可能会比人更快一步,登陆火星。 在12月14日在线举行的美国地球物理联盟(AGU)年会上,NASA和加州理工学院
新智元
2023/05/22
3820
波士顿机器狗将比马斯克先登上火星?「恢复算法」加持,跌倒了还能爬起来!
嫦娥一号的月球照片是真的吗?
很快就有网友质疑,这张照片可能是假的,因为它同Google Moon上的照片简直是一模一样。但是,一位加拿大华侨发现,两者有一个地方是不一样的,就是上图中黄色箭头所指向的那个陨石坑,美国的照片上是没有这个坑的。
ruanyf
2018/09/21
1.5K0
美国登月技术退步了?50年前就能载人着陆,怎么现在只能带着史努比绕一圈
杨净 明敏 发自 凹非寺 量子位 | 公众号 QbitAI 明明半个世纪前人类就已经登月了… 为什么NASA打着“重返月球”的旗号折腾了这么老长时间,最新进展还只是带着假人绕月飞行? 北京时间今晚8点,承载着阿耳忒弥斯计划的SLS火箭,将在肯尼迪航天中心发射升空,整个飞行旅程为期42天。 一旦发射成功,就意味着阿波罗时代之后,NASA再度重启登月计划,预计在2025年完成登月。 当然,前提是在理想的情况下。 毕竟在此之前,光是SLS就推迟了至少16次。 据NASA前副局长透露,即使屡次延期且追加预算,也未
量子位
2022/08/31
3560
美国登月技术退步了?50年前就能载人着陆,怎么现在只能带着史努比绕一圈
推荐阅读
【月球殖民靠AI】神经网络发现7000个新陨石坑,人类2030年或找到月球定居点
7140
基于传统方法的单目深度估计
1.9K0
为什么 AI 工程师,更有机会成为下一个超级英雄?
4330
Honeybee机器人与NASA的不期而遇怎样改变世界?
5390
摘下月亮送给爱人?AstroReality用AR技术帮你实现
6070
特斯拉、微软、谷歌、Meta等大厂传裁员;AMD与英特尔CPU被曝恐存在内核内存漏洞,缓解措施将增加12%-28%的计算成本
5900
悬赏17万:美国“知乎”的沙雕问题,需要AI来识别
4730
最近做的流水账 | 闲聊扯淡
2930
小哥凭“量子速读”绝技吸粉59万:看街景图0.1秒,“啪的一下”在世界地图精准找到!
5940
嫦娥四号传回“旅行照”,全球首张照片值得一声“哇”!
3930
1%大气密度也能飞?NASA把无人机送上火星,最具野心探测计划启动
4140
每周分享第 31 期
6020
《AI赋能星际探索:机器人如何开启宇宙新征程!》
1840
下次登月,让机器猩猩上 !
8380
下一次火星任务,中国要放飞自己的无人机
2520
马太效应和幂律分布是怎么回事?终于有人讲明白了
1.6K0
人类首次行星防御实验成功:NASA这一撞,改变了一颗星球的轨道
4680
波士顿机器狗将比马斯克先登上火星?「恢复算法」加持,跌倒了还能爬起来!
3820
嫦娥一号的月球照片是真的吗?
1.5K0
美国登月技术退步了?50年前就能载人着陆,怎么现在只能带着史努比绕一圈
3560
相关推荐
【月球殖民靠AI】神经网络发现7000个新陨石坑,人类2030年或找到月球定居点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档