谈谈我们如何进行技术保障
方案设计层面
业务逻辑正常是最基础的要求。
接口安全、数据安全(数据泄漏、数据遍历、越权访问)。
服务扩展性(服务是否可平滑扩容,能扩的最大范围是多少个节点)、是否存在单点。
数据库表结构设计、索引设计。
缓存更新机制、过期机制、是否存在单点热Key
消息系统设计、流转过程;投递速率、消费速率
定时任务运行方式、执行记录、失败处理、是否可以恢复
仅仅考虑前面的场景可能还是不够,所以继续进行系统稳定性的思考。
系统稳定性
流量控制
一般情况下越靠近下层资源的吞吐能力越弱,数据库吞吐能力有限,要尽量将流量拦截到上层尽快返回响应,让越下层的资源做正确和重要的事情,达到压榨系统的目的,所以上面看到的WAF拦截;限流基本都是放在网关或者离用户更近的一层。
数据冗余
系统中最重要的是数据,保证数据不丢失至关重要,数据冗余是防止丢失最简单的方式。数据冗余备份方式很多种,从物理到逻辑的角度,备份可以分为以下几类:
物理冗余
只对数据库操作系统的物理文件(如数据文件、日志文件等)的备份
物理备份又可以分为冷备(在关闭数据库时进行的备份操作,能够较好地保证数据库的完整性)和热备(在数据库运行状态中进行操作,这种备份方法依赖于数据库的日志文件)
逻辑备份
从数据库的备份策略角度来看,备份又可分为全量备份、增量和冗余备份
全量备份
每次对数据进行完整的备份
可以备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数
据库对象
但它需要花费更多的时间和空间,所以,做一次完全备份的周期要长些
增量冗余
只有那些在上次完全备份或者增量备份后被修改的文件才会被备份
**
差异冗余**
备份那些自从上次完全备份之后被修改过的文件,即只备份数据库部分的内容
它比最初的完全备份小,因为只包含自上次完全备份以来所改变的数据库
它的优点是存储和恢复速度快
高可用
为了保证系统的高可用,在框架、基础建设层面需要做很多建设。
超时、重试、幂等
超时控制,可以让服务之间调用快速抛错。
如果单个请求耗时长会影响服务的性能。比如API接口设置2s超时API调用a服务用了1s,服务a调用服务b用了1s,那么现在已经超时了,如果还需要调用服务c,这个时候整体接口已经超时就不需要继续调用c服务,浪费时间和资源。
重试是保证一些服务可能偶尔服务抖动失效情况下,再重新发起一次,保证当前请求的准确性,重试需要有限制,不能无限循环,再则操作是否可以重试,是有支持幂等。
**
扩容**
扩容策略可以分为两种,一种是对单机整体扩容,也就是机器内部包含CPU、内存、存储设备等;另一种增加机器,对于服务的扩容一定要慎重,需要考虑到扩容之后下游的资源是否能够支撑。
比如mysql服务器链接只有2000个,当前集群已经使用的差不多了,服务数量增加之后会导致链接不够用;业务更容易出问题。微服务k8s容器化之后,我们自研的发布系统上可以进行轻松的扩容。
**
限流、熔断、降级**
举个业务降级的例子,定时送道具打积分榜单,榜单计算支持的QPS可能是1w,道具分多种档次,其中有一种薅羊毛的道具1积分,花钱的几十到几万积分不等,可能有刷子囤积了几亿的羊毛道具等待打榜时候使用程序投递影响活动的体验;
如果有大量羊毛道具并且超过榜单计算的QPS,此时就降级把羊毛道具剔除掉,只算花钱的,毕竟1积分对榜单影响小(业务定夺)。
隔离
顾名思义,按照一定的原则进行划分,进行单独维护。
服务隔离:将系统按照业务特性分成不同的服务模块,各个模块之间相对独立,无强依赖,某些模块出现故障不至于全部不可用。
动态接口和静态接口隔离,比如:一个接口里面有用户自己特定的一些数据,也包含了所有用户看到都是一样的数据,那么就可以把这部分拆分成两个接口;大家看到统一数据的接口可以加统一缓存或者上CDN;不拆分是无法上CDN的;
数据库分库分表等;隔离之后尽量保证不可越界、不可共享防止隔离失效。
业务保障的基础(监控&告警)
怎样衡量业务系统是否表现正常?是应用在线上跑着进程还在没有宕机,这可能是一个先决条件,有的程序虽然还在跑着,但是已经不能提供服务了,能体现服务的正常需要看流量,流量是看不见的,只有通过日志监控体现。
监控需要监控哪些呢,基础资源监控-基础的资源是否出现问题了?
单服务监控-某个服务是不是指标是否出现异常了?
QPS(GRPC、http)、耗时、接口错误码、错误率监控、上下游依赖监控(DB、缓存、上游依赖服务、下游支持服务)
微服务调用链路监控-调用链路到某个服务是否异常了?
用户端监控-用户体验端是否出现异常了?
上线规范-预演
预演是非常重要的环节,很多bug都可以在预演环节被干掉,这里不是因为测试同学不努力,不能把那些BUG过掉,是因为:
预演环境有真实的庞大数据
预演环境的能还原真实的QPS,会覆盖掉很多边界场景
有些测试必须在生产环境进行
预演需要做方案,不能引起线上脏数据
有了这些东西就可以进行预演了,然后这里有一个最大原则:预演请务必尽可能还原真实场景,包括时间点的设置!
那些之前重点关注的问题,很多重要的事情需要扣细节,扣的越多思考越细能考虑到整个事情的所拥有的发展方向,提前堵上错误的路径。
广播到端上刷接口
之前工作中遇到一个广播的场景,是服务端会推送给web端一个命令消息,web收到消息之后需要向服务端发起一个http请求获取数据,由于命令推送是同一个,根据不同的用户获取的http响应不一样,并且http接口数量也比较大,前期用户不多的情况下http接口的QPS比较低还能接收,逐渐业务增长后,http接口内部实现使用缓存能优化。
当服务端已经无法优化之后,简单粗暴的,进行推送之后,web收到命令消息之后,0-5分钟内打散请求服务端也能抗一段时间,量持续增长,到0-5分钟即使打散量还是很大,给对应的http接口限流,用户会反馈为什么我没收到消息。
这种逻辑面对大量用户在线确实比较难搞,后面将接口返回的数据进行拆分(动态和静态)静态数据加CDN并在界面上提前下发,动态数据压缩走广播,去掉广播刷接口的逻辑。
无用请求抢占带宽
带宽也是资源,之前遇到过一个事故,前端获取一个接口数据如果没有获取成功,则会再进行api请求拉取一次,没有做重试退出操作,导致这个接口的流量很大基本上打满了某个服务的所有资源,进而急剧恶化其他请求都无法请求到后端服务。
之前处理的方式是在网关层面限制改接口的流量,部分正常的业务可以打到服务节点上,但是网关层量还是一直升高,最后将改接口直接挂到CDN上,不让回源到服务,但当时CDN缓存的是404响应,事后想想直接把响应结果缓存到CDN,不是所有客户端都正常了。
日志打印不规范
无法及时发现线上问题,请不要乱打日志,可能这个行为是给别人埋坑,info日志能看出业务在正常运行,error日志能看出系统哪些业务出错了。
紧急故障处理
经验沉淀
复盘本质就做两件事情① 评价结果 ② 总结过程经验教训。具体来说:
复盘要紧密围绕事情结果来讨论。
事情结果的好坏,取决于是否达成预定目标。
因此,任何事在启动前必须有明确可衡量的目标。
对于目标实现有贡献的,称之为经验;对于目标实现有阻碍影响的,称之为教训。
经验、教训要能传承并指导后续的行动。
上一篇: 保证数据一致性的微服务模式
下一篇: 服务保证组件 Rhino 简介
推荐阅读
-
IDC与蚂蚁金服集团联合发布《风控技术十大趋势白皮书》--这是风控行业技术创新的风向标,也意味着在与黑灰产品的交锋中,技术升级迫在眉睫。 今天的商业模式不同于以往,随着数字化进程的进一步加快,金融机构必须时刻准备应对可能出现的经营风险。面对无边界、强对抗的新型重大风险,金融机构如何与之博弈,并始终领先一步?这正是《IDC 风险控制技术十大趋势指南》将深入探讨的话题。我们摘录了白皮书的部分内容与您分享。要获取全文,请在后台回复 "风险控制趋势"。 1 数字支付激增
-
谈谈如何在电子版中的多个窗口之间进行通信。
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
微信 "扫一扫 "物联网,全面揭秘 "扫一扫 "背后的扫盲技术!-1.1 扫一扫感知物体是做什么的? 1.1 微信扫一扫是做什么的? 扫一扫识物是指以图片或视频(商品图片:鞋/包/美妆/服饰/家电/玩具/图书/食品/珠宝/家具/其他商品)为输入媒介,挖掘微信内容生态中的有价值信息(电商+百科+资讯,如图1所示),并展示给用户。这里的电商基本涵盖了微信小程序覆盖上亿SKU的全量优质电商,可以支持用户货比N家并直接下单购买,百科和资讯则聚合了微信内的头部自媒体如搜狗、搜搜、百度等,向用户展示和分享拍摄商品相关的内容资讯。 图 1 扫一扫识别功能示意图 欢迎大家更新iOS新版微信→扫一扫→识货,亲自体验,也欢迎大家通过识货界面的反馈按钮向我们提交反馈意见。 扫一扫识物实景图展示 1.2 扫一扫识物有哪些使用场景? 扫一扫识物的目的是为用户访问微信内部生态内容开辟一个新窗口,以用户扫图片为输入形式,为用户提供微信生态内容中的百科、资讯、电商等作为展示页面。除了用户熟悉的扫一扫操作外,我们还将进一步拓展长按操作,让用户更方便地进行扫一扫操作。"扫一扫知事 "的落地场景主要涵盖三大部分: a. 科普知识: a.科普知识。用户通过扫一扫,可以在微信生态圈中获取该对象的百科、资讯等常识或趣闻,帮助用户更好地了解该对象; b.购物场景。同样的搜索功能支持用户看到喜欢的商品立即检索到微信小程序电商中的同款商品,支持用户即扫即购; c.广告场景。扫一扫识别物体可以辅助公众号文章、视频更好地理解其中蕴含的图片信息,从而更好地投放匹配广告,提高点击率。 1.3 Sweep Sense 为 Sweep 家族带来了哪些新技术? 对于扫一扫来说,大家耳熟能详的应该就是扫一扫二维码、扫一扫小程序码、扫一扫条形码、扫一扫翻译了。无论是各种形式的编码还是文字字符,都可以看作是图片的一种特定编码形式,而物的识别则是对自然场景图片的识别,这对于扫一扫家族来说是一个质的飞跃,我们希望从物的识别入手,进一步拓展扫一扫对自然场景图片的理解能力,比如扫酒、扫车、扫植物、扫人脸等服务,如下图3所示。 图 3 Sweep 家族
-
在从事技术管理工作六年多之后,让我们来谈谈一些经验教训
-
谈谈首席技术官如何做好技术管理?
-
技术管理 - 如何进行技术规划?
-
如何进行技术管理?管理者应具备哪些能力?
-
如何进行技术管理?
-
像首席技术官一样思考:如何高效管理 30 人的研发团队?-管理越多越轻松。好的研发团队,应该是上拨下用,即下级对上级的向上管理;而不是反过来,总是向下管理,甚至是 CTO 做经理的事,经理做工程师的事,工程师最终会被当成实习生。如果是这样,就会越管越累,不仅团队无法成长,而且团队整天很忙还效率低下,问题一大堆。 有这样一个小故事:一位高级经理下班后帮忙倒垃圾,结果被老板训斥了一顿。这就好比首席技术官做了实习生自己该做的事。事情本身没有对错之分,只是从不同的角度有不同的理解。 古人云:"用人不疑,疑人不用"。在面对自己的研发团队时,应该相信他们能做好,授权一线开发人员充分发挥专业特长,不要限制他们的工作。但在相信他们的同时,也要进行二次确认,始终秉持 "我相信,但我要确认 "的原则和严谨的精神。因为每个人都会犯错和疏忽,通过发挥团队的智慧,团队犯错的机会就会大大减少。比如回归测试、代码审查、开发演示、变更审批等等。 如前所述,每个人都难免会犯错。但作为管理者,你所设计和商定的流程不能出错。管理者的每一个决定和沟通都应该经过深思熟虑。就像红绿灯的交通设计,某辆车不小心闯红灯可能会扣分,但红绿灯的设计一定要正确、人性化、统一。再比如,开发人员可能会因为疏忽大意写出 bug,但研发流程的设计和上线流程的发布不能有任何差错。因此,流程体系的设计,一方面要结合当前团队规模、业务特点和需要重点解决的问题来设计,另一方面也要在人员防错、效率提升、发挥团队集体智慧等维度进行综合考量。应该站在更高更抽象的角度去思考,不断思考一个倍受欢迎的园区应该如何设计,思考一个灵动、经典、永恒的建筑应该遵循怎样的模式,思考一个成功、优秀、卓越的研发团队应该需要怎样的流程和制度。 最后,反馈很重要。向上汇报很重要,向下反馈也很重要。能够保持顺畅的双向反馈和闭环管理,对研发团队的协作和沟通有着非常明显的积极作用。在向上汇报方面,要培养团队在正式汇报、会议汇报、私下沟通、书面总结、非正式场合等方面的沟通能力,提醒下属报喜也要报忧。凡事先记录,再跟进,最后反馈。反馈很重要,主动汇报更难得。 另一方面,同时也不要忽视向下反馈。好的爱,是双向的。团队也是如此,没有严格的上下级之分,只是分工和角色不同而已。作为管理者,不必总保持一种 "神秘感",让人 "捉摸不透 "才是牛。当团队做得好或有人做得好时,要记得在公开或私下场合给予肯定和赞许。业务有增长、业绩有提升时,别忘了给团队一些鼓励,或者安排一次下午茶或聚餐。在例会或正式会议上,也可以同步向大家传达一些重要信息和高层指示。"欲速则不达,欲远则同行"。 当向上汇报、向下反馈的沟通闭环形成后,同时结合前面研发过程的管理闭环,双管齐下,就能形成良性循环。如此反复,持之以恒,优秀卓越的研发团队,必将呈现。 能力、产出和效率 接下来,继续重复关于能力、产出和效率的话题。 站在不同的角色,以及一个企业经营、生存和发展所需要的基础上,我把研发生产力分为三个层次,分别是:一线员工关心的研发能力、管理层关心的软件产出和操作人员关心的企业生产效率。简单概括就是:既要把工作做好,又要能出成果,还要能帮企业赚钱。