要控制问题域
其实互联网服务做久了,线上问题处理早已变成了家常便饭。因为用户不能忍受宕机,所以你有问题查起来基本是不眠不休。个中滋味,只能自己慢慢体味。
这问题有时候是新问题,你刚改的代码有个bug,有时候是老问题,但是是暴露了老代码里的bug。多数情况下,都可以通过回滚代码来解决。个别情况下,你需要增加一个fix版本重新上线。这些都简单,难的地方在于定位问题。
定位问题最怕问题域太大。因为你得一步步分析,将可能发生问题的范围缩小。从现象出发分析,从改动入手检查算是一个捷径。如果改动太大,无疑会增加思考的成本和定位的难度。
而紧跟着的问题就是,如果作为一个fix版本上线,是否可以带入其他改动。我的回答是不行,因为也有太多次的失败来源于这个hotfix。如果再次出了问题,你需要首先判断是不是老问题没被解决还是引入了的新问题,这又涉及到整个请求处理链的重头分析。
我们不怕优化失败,但是怕优化出来的失败。优化失败最多还是老样子,但优化出的失败很可能是一次雪崩。
有些优化不要做
回到最开始的那个例子,他的问题表现出来是盲目引入新库,做法与我们常规的处理方式相背。根源则在于对问题的分析不足,不清楚问题的原因,当然可怕的地方在于(也是不可避免的),还使用了试试看的方式来修复问题。
应该做哪些优化呢,简单来说就一句话,做该做的优化。谈这个问题很多人都有经验,就算刚才说的“试试看”,在某种程度上也算。不过我今天想说的是不应该做的,一些经常被忽视的事情。
-
不要用不需要用的东西
第一个事是不要用不该用的东西。一般来讲,互联网服务的峰值会很明显,峰值压力会是平时的十倍甚至百倍。应对请求洪峰,简单的方法就是用队列削峰。但是很多人用惯了队列后,只要设计服务,都会使用队列分离。但队列一旦进来,不仅会增加服务的复杂度,而且割裂了前后端之间的联系。
由于已经跟前端解耦,很多时候在处理请求的时候,前端已经返回了。这时候发生错误的话,已经没办法通知用户,导致服务只能偷偷失败。这是很容易气坏用户的处理方式。
-
可以失败不要犹豫
另一个事是可以失败不要犹豫。很多时候服务都是分层的,外层服务访问内层服务,需要应对各种失败,有环境问题像网络闪断机器故障等,有服务内部故障像空指针虚拟机崩溃等。那么问题来了,内层服务失败了怎么办?举例来说,如果用户注册时数据库出现问题,该返回错误还是重试?如果重试次数设多少?如果是超时怎么办?超时要设多久?
除去数据问题,这里面经常被人忽视的却是性能问题。假设正常情况下10ms返回的请求,超时是1s,那么遇到超时的时候,请求处理速度其实下降了100倍,而如果还有重试,那就会继续降低。性能下降的直接结果是导致后续请求要么堆积要么丢弃。堆积会占内存,很多情况下会引发服务本身OOM退出,让服务质量雪上加霜。
其实开始的时候直接失败,也就没有后续这么多的失败了。或者超时短一些,性能也不至于下降太多。看起来设计很完善的错误处理策略,很可能不过是往背篓里加了无用的石头而已。
-
不要修不该修的东西
还有个事就是不要修不该修的东西。Wikipedia里一直有句提醒,“If it ain’t broke, don’t fix it”,但是没说原因。这里说两个例子。
一个是虚拟机调优,不管是Java还是Erlang都会涉及。Java里多的是GC参数,Erlang里一般都搞调度器,情况差不多。如果哪一天你翻看参数说明,发现某个GC算法看起来更好或者新生代比例好像不太合适,或者发现CPU利用率一直不高而调度器线程池貌似可以调大,千万不要手一抖改了线上服务。因为线上服务实际运行情况复杂,很可能因为你的调整效果反而下降。GC调完引来了虚拟机OOM,调度器调完了请求超时不断。
另一个是数据一致性问题。举一个最近的例子。Mnesia是Erlang自带的数据库,速度非常快,跟OTP集成度高,但它在事务处理的时候会出现死等情况。由于两个节点通讯是请求应答模式,请求节点在发出请求后等待,等待的过程会定时检查对端节点的存活情况。问题出在这个定时检查上,它假定对端只要在线就肯定会回应。但如果对端节点在这个检查中间死而复活,那么它即使在检查的时候活着,也不会再回应了,请求节点就因此一直等下去。同时由于所有的消息都是在一个事务管理进城内,后续的所有请求都无法处理了。要不了多久,这个节点就会因此挂掉。
解决这个死等问题,一个想当然的方案是增加节点启停时间记录,检查的时候多检查一些东西。这也是我们开始时候想的方案。但是然后呢,这个请求该怎么处理?想想刚才讲的失败策略,该丢还是该继续呢?如果丢了,数据一致性怎么保证?如果你的场景像我们一样不希望丢,那么你很可能把原来已经可以常规处理的问题,变成了一个新问题。我们暂时是没有处理这个问题,还因为暂时还没想好要维护一份自己的Mnesia代码。
这三件事只是典型情况,还有很多情况,需要在做之前全面思考。毕竟成果是以产出来衡量,而不是付出,要看你解决了多少问题,而不是做了多少事情。
很多时候,做得少就是做得多。
给小团队的特别建议
小团队的普遍现象在于人力紧张,不管是在创业公司还是在大公司内。对于不写代码就手痒的技术人员,如果再在技术上有点儿完美主义情节,那真是可以为代码鞠躬尽瘁的。稍微一整理,事情恨不得已经排到一年后。但是大公司有绩效压力,小公司有生存压力,怎么办?这个事儿就是优先级处理,处理不好,就会变成目标管理,然后慢慢你就跟真的工地搬砖无二,天天还得受工头的鞭子。
如果你像我一样喜欢轻松的自组织团队,喜欢以一当十的挑战,那你更需要注意这点。如果你只是埋头做一件事,很可能错过了系统改进的时间窗口,等系统压力上来或者问题到来的时候措手不及。你只能过四处救火火不断,缝缝补补又一年的生活。而所有的补丁,最后又变成了你彻底修复时要处理的历史包袱。
你最需要的可能是坐下来,想想该做什么,想想先做什么,把有限的精力用在最值得用的地方。
有些时候,做得对才可能做得少。
出自:
http://ericliang.info
相关推荐
这个名为"20210128-2020后疫情时代多渠道商业营销‘线上转型 化危为’机‘策划方案.pdf"的文档,由jiaoyang制作,其主要内容涵盖了战略思考、项目目的、项目内容以及难点与机会等多个方面。 首先,战略思考是整个...
- 深入挖掘个人故事,包括过往的成功与失败。 - 分析这些故事背后所体现的天赋、差异化特质和兴趣爱好。 - 将这些元素整合进个人品牌建设中,形成独特卖点。 #### 三、借鉴同行的经验 - **核心概念**:通过学习...
- 反馈与改进:鼓励学生接受批评,从失败中学习,持续优化项目。 这个两周实践课程将通过理论教学、案例分析、小组讨论和实践活动等方式,全方位提升学生的创新创业能力,为他们未来的创业之路打下坚实基础。
【互联网+】概念的提出,标志着信息技术与传统行业的深度融合已成为时代潮流。自第一次工业革命以来,科技进步一直在推动社会变革,从蒸汽机到电力,再到电子计算机和信息技术,每一次革新都带来了生产关系的调整和...
- **提问式思考**:采用提问式思考方式,不断审视和优化品牌各个方面的表现,确保品牌始终处于最佳状态。 #### 五、案例分析 - **成功案例**:分析成功品牌的成长历程,学习它们的成功经验。 - **失败案例**:研究...
在这个过程中,我熟悉了电子商务流程的各个环节,了解到线上交易的实际操作与理论知识的差距。同时,我也参与了网站的优化和推广工作,学习了SEO搜索引擎优化策略和社交媒体营销技巧,这些实战经验让我对电子商务有...
这体现了运营专员需具备的市场洞察能力和解决问题的能力,能够站在用户角度思考,优化产品体验。 3. 题目三要求应聘者选择电视娱乐节目与电商平台的合作,考验的是跨领域整合资源的能力。如果选择微信或淘宝进行...
4. **思考与展望** - 随着大数据平台自治能力的深入发展,未来可能涉及更多自动化和智能化的运维功能,如预测性维护、自我优化和故障自愈等。这将推动大数据平台从被动响应向主动预防转变,进一步提升大数据系统的...
1. **查阅相关文献**:这是研究的第一步,旨在获取对电子商务领域的广泛理解,特别是关于古典乐器培训机构线上网络营销的主题。通过阅读学术期刊、会议论文、书籍和在线资源,学生可以了解当前的研究趋势、挑战和...
布洛芬行业(2021-2026)的企业市场突围战略分析与建议主要集中在以下几个关键领域:战略理念的树立、市场定位、产品创新、品牌建设、宣传策略以及市场竞争策略。 首先,企业在布洛芬行业中应树立“战略突破”的理念...
- **简历迭代与优化**:根据求职岗位的不同,不断调整简历的内容,使其更加贴近招聘需求。这种方法被称为“迭代简历”,其核心在于提高简历与职位之间的匹配度。 - **心态调整**:保持积极乐观的态度,合理评估...
《环境与学习》这篇阅读材料主要探讨了教育环境中对学习过程的影响,以及如何优化环境以促进有效学习。教育,作为社会发展和个人成长的关键因素,其重要性不言而喻。环境在学习过程中扮演着至关重要的角色,它不仅仅...
企业在面对日益激烈的市场竞争时,必须具备战略性的思考和行动,以确保自身的竞争优势。 **第二章 企业市场突围战略分析** 2.1 树立“战略突破”理念 企业首先需要明确的是,要在二位二通电磁阀行业中取得突破,...
对于这样的源代码,我们可以从中学习到个人开发者在面对实际问题时的解决方案,以及他们在项目管理、代码结构、功能实现等方面的思考和实践。 关于【标签】"航班",我们可以推测这个系统可能涉及到以下关键知识点:...
从策略制定到执行落地,再到效果评估与优化,每一个环节都需要精准到位。董少灵可能会结合自身的实战经验,为读者提供一系列易于操作、效果显著的在线营销方案,帮助读者将理论知识转化为实际成效。 综上所述,兔展...
并充分利用网络营销工具,如社交媒体、搜索引擎优化等,扩大线上触达范围。 具体策略方面,企业需要密切关注竞争对手,学习其成功经验并避免其失败教训,以此提升自身产品的竞争力。市场渗透策略是指通过价格优惠、...
无论是线上还是线下,都应该积极寻求与同行交流的机会。 #### 七、良好的编程技能 随着技术的发展,计算机已成为数学建模不可或缺的工具。掌握高质量的编程技巧对于数学建模尤为重要。这不仅涉及到编写代码的能力...
在IT学习中,无论是线上课程还是线下讲座,专心听讲并积极参与讨论能更好地理解和掌握知识。 3. **自我管理和自律**:遵守纪律,按时完成作业,这些都是IT学习中必备的素质。编程项目通常有严格的时间线,良好的...
这意味着企业不仅需要关注当前的业务运营,还需要有前瞻性的思考,对市场趋势、消费者需求和技术进步保持敏锐的洞察力。这种理念的树立是企业制定有效战略的基础。 其次,明确市场定位、产品定位和品牌定位至关重要...