首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >程序世界里的不信任原则

程序世界里的不信任原则

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

导语

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

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

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

评论
登录后参与评论
5 条评论
热度
最新
666
666
回复回复点赞举报
黑暗森林理论
黑暗森林理论
回复回复点赞举报
谢谢分享
谢谢分享
回复回复点赞举报
很棒的不信任原则,对我编程很有启发,感谢!
很棒的不信任原则,对我编程很有启发,感谢!
回复回复点赞举报
沙发沙发,多谢分享
沙发沙发,多谢分享
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
史上最全的后端技术大全,你都了解哪些技术呢?
| 导语 工欲善其事,必先利其器;士欲宣其义,必先读其书。后台开发作为互联网技术领域的掌上明珠,一直都是开发者们的追逐的高峰。本文将从后台开发所涉及到的技术术语出发,基于系统开发、架构设计、网络通信等几个方面让大家对后台开发有一个清晰的了解,讲解全面易懂。
iMike
2019/09/03
1.6K0
后台开发术语大全
高内聚指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。模块的内聚反映模块内部联系的紧密程度。 模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息。一个完整的系统,模块与模块之间,尽可能的使其独立存在。 通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。
luckpunk
2025/01/18
1590
后台开发术语大全
后端开发术语大全
高内聚指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。模块的内聚反映模块内部联系的紧密程度。
luckpunk
2019/07/31
2.9K0
海量服务实践:手 Q 游戏春节红包项目设计与总结(下篇)
接上篇《海量服务实践:手 Q 游戏春节红包项目设计与总结(上篇)》 5.系统保障 第四部分讲述了业务需求的开发,但是否功能开发完成后我们就这样就可放到线上安心睡大觉了呢? 如果出现一部分
吴逸翔
2017/02/09
1.8K0
海量服务实践:手 Q 游戏春节红包项目设计与总结(下篇)
企鹅电竞登录鉴权系统架构与核心数据热备容灾方案
企鹅电竞登录鉴权系统是企鹅电竞电竞所有写请求的前置关键路径,需要具备高可靠性。其核心存储依靠 CMEM,为保证服务的稳定运行,搭建一套同构 CMEM 存储,热备 Login 数据,在 CMEM 发生存储或网络故障时保证登录鉴权服务正常运行。
恋喵大鲤鱼
2022/09/20
5340
企鹅电竞登录鉴权系统架构与核心数据热备容灾方案
海量服务实践──手Q游戏春节红包项目设计与总结
1. 需求背景 1.1.红包类别 2017年的手Q春节游戏红包共有刷一刷/AR地图/扫福三种,如下图所示: 1.2.体验流程 虽然红包分三种,但在游戏业务侧这边的体验都是一样:用户得到一个红包卡券,打开后展示一个(刷一刷红包)或者多个(AR地图红包)游戏的礼包列表,用户选择一个礼包后弹出区服组件,用户确认对应的区服角色信息后会礼包会在48个小时内发放到账。体验如下: 1.3.后台需求 游戏红包的设计容量为入口卡券页流量80k/s,以上体验流程一共涉及三个后台接口: 礼包列表:用户界面的礼包内容需
小时光
2018/01/29
1.5K0
海量服务实践──手Q游戏春节红包项目设计与总结
揭秘软件开发中的达摩克利斯之剑
记得我在学校的时候,做的那些项目,不是为了应付课程作业,就是为了参加比赛时展示用,因此对项目的质量要求非常低。
程序员鱼皮
2020/12/24
6690
系统安全和系统保护设计
要保证数据安全和系统稳定可用,我们应当全方位地对系统进行保护,这里主要分为两个层面。
Austin
2019/08/23
7.2K0
解密腾讯海量服务之道
一直对腾讯做产品的能力比较敬佩的,我们组做消息推送系统,而腾讯的信鸽就是我们学习的榜样。京东很多做产品的思想是跟腾讯学的,而京东很多同事也从腾讯过来的(京东合并了腾讯电商),耳濡目染学到很多东西。 前几天前腾讯的同事给我们分享了《解密腾讯海量服务之道》,讲了几个腾讯开发产品的经验原则,比较受益,遂总结下。 2个价值技术观, 7个技术手段, 4个意识 腾讯的海量服务之道是由2个价值技术观和7个技术手段,4个意识组成。技术价值观是总体思想,意识是我们的态度,技术手段是实现技术价值观的手段或者方法。 海量服务的技
用户1263954
2018/01/30
4.4K1
解密腾讯海量服务之道
高可用架构和系统设计经验
可用性是一个可以量化的指标,计算的公式在维基百科中是这样描述的:根据系统损害、无法使用的时间,以及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较。行业内一般用几个9表示可用性指标,对应用的可用性程度一般衡量标准有三个9到五个9;一般我们的系统至少要到 4 个 9(99.99%)的可用性才能谈得上高可用。
Allen.Wu
2022/12/19
1.6K0
工作十年,在腾讯沉淀的高可用系统架构设计经验
👉腾小云导读 在系统的开发过程中,很多开发者都为了实现系统的高可用性而发愁。本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用系统的架构设计需要有哪些关键的设计和考虑。希望腾讯的经验方法,能够给广大开发者提供参考。内容较长,您可以收藏后持续阅读。 👉看目录点收藏,随时涨技术 1 高可用系统的架构设计思想     1.1 可用性和高可用概念     1.2 高可用系统设计思想 2 研发规范层面     2.1 方案设计和编码规范     2.2 容量规划
腾讯云开发者
2023/03/14
5.6K0
工作十年,在腾讯沉淀的高可用系统架构设计经验
从技术角度谈一谈,我参与设计开发的手Q春节红包项目
今年春节期间,QQ以AR技术为支撑、娱乐体验为导向在春节期间推出系列红包并成功刷屏,系列红包包括三大玩法+年初一彩蛋,分别是“LBS+AR天降红包”、刷一刷红包和“面对面”红包,加上“娱乐红包”(明星刷脸红包),共计在春节期间派发了2.5亿现金红包和价值30亿的卡券礼包。根据企鹅智酷提供的数据,手机QQ的用户渗透率在全平台排名第二,为52.9%(第一是微信)。本文将会详细介绍手Q春节红包项目的设计、容灾、运维、架构以及总结。
Java高级架构
2018/08/16
1.1K0
从技术角度谈一谈,我参与设计开发的手Q春节红包项目
高可用架构:如何做到应用升级无感知
十几年前,我参加阿里巴巴面试的时候,觉得阿里巴巴这样的网站Web应用开发简直小菜,因为我之前是做类似Tomcat这样的Web容器开发的,所以面试的时候信心满满。
wayn
2024/03/11
4380
高可用架构:如何做到应用升级无感知
区块链世界里不能信什么?
区块链节点和其他节点会建立P2P通信,共同组成网络,传递区块、交易、共识信令等各种信息。其他节点可能是由不同的机构、不同的人持有,持有节点的人可能是善意,也可能是恶意。
区块链大本营
2019/11/27
7670
故障测试用例设计思路
在现代分布式系统和云计算环境中,系统的稳定性和可用性堪称“生命线”。但凡事难有万全之策,故障总是难以避免,关键在于如何在故障发生时依然保持系统可用,并且迅速恢复,做到“兵来将挡,水来土掩”。因此,故障测试(Fault Testing)成为保障系统可靠性的重要一环,是衡量系统韧性的一把标尺。
FunTester
2025/04/13
1770
故障测试用例设计思路
万字详解高可用架构设计
系统高可用是一个宏大的命题,从设计思想、架构原则到工程能力、服务管理等等方方面面,每个视角单拆出来都不是一篇文章可以解决的。本文将从大局上全面系统地梳理高可用系统架构,起到一个提纲挈领的作用。
腾讯云开发者
2025/01/07
4.6K1
万字详解高可用架构设计
亿级流量网站架构核心技术【笔记】(一)
3.在有限资源的情况下,一定是先解决当下最核心的问题,预测并发现未来可能出现的问题,一步步解决最痛点的问题,即满足需求的系统是不断迭代优化出来的 A.高并发原则 1.无状态:比较容易进行水平扩展,应用无状态,配置文件有状态 2.拆分:在系统设计初期,是做一个大而全的系统还是按功能模块拆分系统,这个需要根据环境进行权衡
硬核项目经理
2019/08/06
2.1K0
亿级流量网站架构核心技术【笔记】(一)
面向业务的高可用架构设计
· 再好的技术、再完美的规章 , 在实际操作层面也无法取代人自身的素质和责任心 。
架构精进之路
2021/03/15
8580
稳定性治理二,稳定性分析
支付宝2015年发生了大规模的宕机事件,原因是杭州市萧山区某地光纤被挖断导致,为确保异地容灾、多活,后面专门进行了全链路单元化改造,整个交易链路都进行了单元化改造,并且经常在大促前夕进行单机房演练;
阿甘的码路
2023/08/17
6370
稳定性治理二,稳定性分析
全面!一文理解微服务高可用的常用手段
在定义什么是高可用,可以先定义下什么是不可用,一个网站的内容最终呈现在用户面前需要经过若干个环节,而其中只要任何一个环节出现了故障,都可能导致网站页面不可访问,这个也就是网站不可用的情况。
DevOps时代
2019/08/12
4.5K0
全面!一文理解微服务高可用的常用手段
推荐阅读
相关推荐
史上最全的后端技术大全,你都了解哪些技术呢?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档