恕我直言,微服务挺好,但不适合你

今天这篇文章我们继续说架构师大刘的故事。

故事纯属虚构,别对号入座哈。

前言

购物返利 m.cpa5.cn

大刘日子最近还不错,经常午睡醒来,就继续拿着手机看小说摸鱼。大刘对当前所在的这家公司比较满意。大部分系统已经成熟稳定,用户量也中规中矩。虽然有些项目技术陈旧,但好处是没啥幺蛾子技术问题冒出来等着解决。

只是有时候大刘心里会打鼓,公司盈利在下降,巅峰不在,也不知道这家公司能撑多久。除了偶然会冒出些对工作稳定的担忧以外,大部分时候,大刘心情都是愉快的。直到他被领导叫到办公室分派新任务的那一刻……

大刘的领导 CTO 老李,这些日子心情不是很好。他在的这家公司原本是个以传统业务为主的公司。为了跟上互联网时代,大老板拍脑袋成立了个技术部门搞互联网。虽说公司已经号称触网了,但是公司盈利基本还是靠传统业务,技术部门只是打辅助的。没有业务主动权,没有盈利点,部门员工的工资却都不低,老李的地位就可见一般了,经常受些冷言冷语的夹板气。再加上,最近公司的效益也有所下降,眼见技术部门面临着裁员的危险。老李危机意识被极大的刺激到了。

老李是个技术出身,但是离开一线编码已经快十年了,每天的工作其实就是管理加玩概念。这几年微服务的概念非常火爆,老李一直想着能搞点这种热门东西,然后再拿着这些做出来的新概念技术,给那个不懂技术的大老板展示下自己的两把刷子,同时也能打响在业界的名声,对自己的职业发展也大有好处。趁着构思部门前途这时当,老李认为这也是搞微服务的好时机,同时也想到了有微服务经验的大刘。于是,大刘就被召唤进了办公室……

经过了几个小时的讨论,大刘面带无奈的接下了这个任务。这个任务是这样的:

把公司里几套运行多年的核心系统改造成微服务。

这些个老系统当初是按照几万用户量的目标去设计开发的,虽然现在跑着没问题,但是眼光要看长远,产品和技术们将搞一套更高级的东西,目标是这套系统会被几百万人使用。

OK,微服务使用的前提出现了。

大刘来这家公司之前,在某电商大厂干了多年,对微服务在电商系统中的应用这块有实践、有经验。对微服务这块,大刘是吃过猪肉、也见过猪跑,还被猪咬过……嗯,对,还被咬过不止一口两口。所以,对改造微服务这个任务,大刘是硬着头皮接下来的。

大刘虽然无奈,但是看在工资的份上活还得干。不过槽还是要吐的,于是下班后大刘用了几小时码出了下面这堆心里话。

正文开始(以下是大刘的第一人称):

0

最近,经常有同事和我聊微服务,也屡屡期望对公司已有项目进行改造,希望能把所有项目改造成微服务方式。我对此经常很无语,也屡屡对这些人进行劝阻。

我认为,劝我改造微服务的人之中,有一些人纯粹的对技术痴迷太深。更甚些,我甚至可以说这些人中的某些人就是纯粹的自私自利。搞微服务难道不是为了蹭热点,为自己的简历增色,为下一步跳槽涨薪做准备?何尝想过微服务为公司带来的各种坏处和因此而来的成本提升?另外有些人,则纯粹是被外面铺天盖地的微服务概念给打晕了头,被各种微服务成功故事洗了脑。这些人,把微服务当成了万能药,纯粹就是脑袋犯了糊涂,陷入了唯技术论。

为了说明微服务不是万能药,这里我们就先要说明下微服务的概念。同时呢,我们也需要诠释清楚微服务的优缺点,看看什么时候用微服务,什么时候不用。

什么是微服务?对于微服务的定义,网上众说纷纭,并没有一个权威的定义。但是在这些纷繁复杂,云山雾罩的各种微服务洗脑文和说明文之后,总是有一个统一的基本面在:即微服务是一种利用分治法的思想,去把一整套非常复杂的业务逻辑给切分成多个简单的业务问题,并采用模块化方法去实现组合的一种架构方法。

这么说是不是还很抽象呢?好,咱们再更深入的解释下,并顺便把微服务的优缺点也全部一并说清楚。

1

首先,微服务是采用分治法思想,需要对业务逻辑做分解。做完分解后,还需要多个对应的实现模块去实现分解后的业务问题。这些模块的开发和维护,是都需要成本的。如果我们要搞微服务,考虑过开发维护成本吗?

上面这图表明了,从项目一开始,微服务的代码开发和维护每行平均成本就不少,随着项目规模和系统复杂度的上升,代码的开发和维护平均成本才会缓慢下降并逐渐收敛到某一个值左右恒定。

而单体项目正好相反,一开始,单体项目的每行代码平均成本是比较低的,随着项目规模和系统复杂度的上升,代码开发和维护成本会慢慢上涨,后续可能复杂度和开发成本会越来越高,一直冲上天际。

这时候,就不得不迫使人们去找到一种比较合适的方法,能把开发和维护成本降低到项目团队可以承受的程度。

这就是引入微服务的意义所在。

但是,所有的项目会一直发展下去吗?所有的项目会永远运行并扩展吗?

有很多的架构师或者技术人员,在一开始做架构和系统设计的时候,不考虑实际情况,在公司给出一项很紧迫的任务之后,不去考虑实现时间和开发成本,上来就搞高大上,起手就是微服务,这现实吗?

我们这些技术人员看过许多鼓吹微服务的技术书籍,也看到过很多微服务的“成功学”,但是他们的前提是什么?他们对微服务的说法统统是建立在一个只有技术存在的完美世界里,把现实世界他们认为的一切杂音都摒除在外,这合适吗?

我们在做架构师之前,第一个考虑的应该是投入和产出。固然,我们从技术角度考虑,一定会要考虑可扩展性,可维护性之类的技术指标。但是,我们也需要根据当前项目的重要程度,盈利前景,还有可用服务器资源等,作出自己的平衡来。

2

第二,微服务的另一个优势是弹性化。什么意思呢?就是我们在业务逻辑改变时,那些对应业务逻辑改变的功能的增删改,开发和部署成本很低,可以像弹簧一样,自由的缩减和增加。

并且,微服务里最佳实践是每个分出的模块应该都有自己的数据库,和别的微服务并不共享任何数据库。所以微服务本身认为,每个微服务模块的数据库都可以不一样。

比如我们开发一个电商网站,如果搞成微服务,大概如下:

如果我们的业务逻辑做了一些调整,比如,我们想要增加一个积分功能,那么,我们只需要再增加一个叫做积分的微服务即可。

这就是微服务的便利之处。

但是,我们承认吧,并不是我们所做的每个系统都足够大,都大到需要分解成更多更小的服务。那些不是太复杂的系统,它们凭什么需要弹性化?凭什么需要切分业务,从而搞出一大堆的项目出来呢?

另外,微服务的弹性化带来的问题就是,我们需要管理因为弹性化所切分的许多小项目,需要搞出一套易用的自动化管理系统,需要把公司的底层基础设置打造好,请问,这些成本,你准备付出了吗?

在这个现实的世界里,并不是一切围绕着技术打转的。固然,技术欠债会让我们这些技术从业者感到分外的困扰和难受。可是,假如我们超前超度的使用了我们可能并不需要的超前概念和超前架构,同样会使我们感到痛苦。

如果我们控制住了自己的技术欲望,我们是不是从自身也控制了一部分技术欠债呢?这是一个架构师应该要思考的地方,也是我们不应该滥用微服务的原因之一。

3

第三,微服务起手就是分布式。分布式我承认有各种各样的优点,但是,分布式引发的各种问题和因此需要引入的各种技术解决方案本身也有自身的问题。

比如,分布式事务。在引入微服务前,我们作为架构师,一定要思考后续是不是可能出现跨服务的事务。兄弟,分布式事务大家都知道有多困难的。

按照微服务的标准,服务之间的通讯应该尽量采用简单的 RESTFUL 协议。那么,根据这种规范,如果我们采用了微服务方式架构,我们的每个项目都应该搞成 REST 服务。REST 服务本身就是无状态的,现在,如果业务里出现了严重依赖状态的跨服务事务,想想吧,你会面临什么:

分布式锁方案你是不是要考虑下?分布式互锁后,出现了死锁,你的追踪策略是什么?如果出现了竞争资源,导致服务状态不一致了,你怎么去快速恢复?数据腐蚀你有办法吗?

什么?你告诉我我说市面上有很多成熟的分布式事务解决方案?别自欺欺人了,咱们都是搞技术的,请问,你说的是两阶段提交(2PC)吗?好吧,大家都知道 2PC 那可怜兮兮的性能。

好吧,那三阶段提交(3PC)呢?它的不一致问题曾经让我们彻夜难眠。

搞 TCC 或者 SAGA 呢?对不起,因为最终一致性所添加的业务紧耦合的各种消息和通知,会直接犹如 24 小时的梦魇,可能会是压垮你的最后一根稻草。

微服务的提倡者老马丁自己也说,微服务引入了最终一致性问题。

对于原来单体项目很简单的事务问题,在微服务中,是一个令人皱眉的困难问题。所有微服务的开发者,在开发微服务代码之前,都需要考虑怎么能探测到数据不一致的问题。否则,一定会万分后悔。

那么,分布式事务会不会一定会出现在微服务中呢?从目前来看,几乎无法避免。为了搞定这些问题,微服务实现往往还需要伴随着实现一整套构建在无状态服务之上的调用链。

对于这些额外的开发成本,我们有必要吗?是所有项目都需要的吗?不是吧。这就是我们架构师需要考虑的问题,也是我们需要谨慎和妥协的地方。

4

第四,微服务互相之间是通过网络通信配合起来来对外提供服务的。这就会带来一个依赖性问题,即微服务非常依赖底层网络的健康。

如果网络通信之间出了问题,整体对外的服务质量就会降低到极其让人难以接受的程度。

并且,网络通信天然就一定会带来延迟。本来单体项目我们好好的,大家都是在内部互相通信,延迟基本可以忽略不计。

现在,大家分开了,互相得远距离打招呼,延迟动不动就来个几十毫秒几百毫秒延迟。这些延迟,我们也需要考虑在内,必须经过严格的测试才可以。

另外,网络通信出现问题后的各种容错方案,也必须考虑完善。以上说的这些,也都是一个合格的架构师必须在微服务引入之前,所要进行的综合的考量。

5

其他:微服务的引入还有各种各样的问题,包括:

  1. 额外引入的复杂性
    微服务在上面我也说过了,会带来各种各样的成本的提升,也会引入各种各样的技术问题。这些最终就会导致整体系统复杂性进一步的提高。当复杂性提高的时候,为了保证系统的稳定,就需要整体技术团队的靠谱,就需要技术人员的靠谱,就需要整体技术设施搭建的靠谱。在引入微服务之前,各位兄台麻烦扪心自问下,这些贵公司有吗?有这些团队、这些设施、这些资源吗?

  2. 分布式本身带来的成本
    分布式本身就需要一整套完整的技术体系和设施去支撑整体分布式的建设。比如,以前单体项目只需要一个项目,直接人工上线就好了。现在呢,可能会出现几十个上百个项目,这些项目如果全靠人工去做,会彻底让团队人员疯掉。所以,就需要把整体发布,部署自动化起来。这里还仅仅是发布部署所需要的,还没有谈维护问题,用《征服》刘华强里的一句话说:”你有这个实力吗?”

  3. 维护和监控微服务所需要的 DevOps 团队
    微服务本身需要维护和监控,以确保运行的稳定和可靠。在微服务的最佳实践里,是非常推荐搞 DevOps 的。我暂且不说 DevOps 需要的对人员水平的高要求,我就说 DevOps 本身所需要的工作态度和责任心问题,自己家的运维团队搭建是个什么鸟样子,运维成天忙死了再干嘛,谁还不清楚吗?整体运维的平均水准加上开发水平的要求,这个团队搭建下来要花多少钱?公司舍得这些投入吗?

  4. 微服务本身所需要的经验
    微服务本身是很复杂的,从设计划分模块开始,就需要架构师必须对架构设计和微服务本身对应的 DDD 领域驱动设计非常有经验,能够恰到好处的划分出对应的模块。否则,一旦设计完毕,不巧把一些紧耦合的服务给硬是解耦成了不同的服务,那么,这个后果对整个技术团队甚至对整个项目团队都是灾难性的。同时,对于微服务的开发、维护、运行、保障以及运维,都需要技术团队成员要有很丰富的从业经验能迅速发现,定位,解决可能随时出现的问题才可以。如果技术问题不能及时解决,那整体系统的体验就可想而知了。但是,现在的经济环境,现在的公司技术人员构成,确定能有这些很丰富经验的人员来搞微服务吗?

  5. 链路测试的方法
    我们上面提到过,为了快速追踪定位死锁或者共享资源的问题,微服务需要靠谱的调用链实现。那么,这就引出的新的问题:我们如何搞全链路测试?我们是不是还得搞一套合适的全链路测试工具才可以?这全链路测试工具开发又需要花多长时间,需要投入多少人力?测试人员的水平是不是也需要得到一定的保证?

  6. 微服务日志的爆炸
    微服务本身有多个节点,这些节点为了自己的安全运行和维护,需要很多自己独有的日志。这些日志随着微服务的增多,也越来越多,你如何存?如何查?如何删?这些是不是都要考虑在内?

以上说的这些问题并不是否认微服务。

我只是砸给那些劝我没事儿就搞微服务的人。对于这些什么都不考虑,上来就说微服务的人,我认为都是非蠢既坏。

不管不顾现状,没事儿把微服务挂嘴边动辄怎么怎么样的人,我劝你悠着点。

最后

写完之后,大刘感觉长出了一口胸中的闷气,过完嘴瘾,心里也痛快了。现在大刘最担心的是,这些文字千万别被领导看到……

最最后

大刘的故事讲完了,我再啰嗦一下。微服务肯定是先进的,但是都已经 2021 年了,不用我再和大家介绍微服务的优点了,那也太俗了。

希望大家看完能明白,并不是什么新科技,热概念都适合自己的团队、自己的项目的。做一个合格的架构师、技术负责人,首先应该遵循的是 KISS 和 YAGNI 原则。

请各位技术人员永远保持理智,我们要做的是选择正确适用的技术而不是选择自己最喜爱的技术。请不要做那种把简单的事情往复杂里做的技术疯子。


你好,我是四猿外。

一家上市公司的技术总监,管理的技术团队一百余人。

我从一名非计算机专业的毕业生,转行到程序员,一路打拼,一路成长。

我会把自己的成长故事写成文章,把枯燥的技术文章写成故事。

欢迎关注我的公众号,关注之后还可以获取算法、高并发等干货学习资料。

我建了一个读者交流群,里面大部分是程序员,一起聊技术、工作、八卦。欢迎加我微信,拉你入群。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: I'm sorry to hear that the customer is upset. Can you please provide more information about the issue so I can try to assist them? If they are requesting to speak with my supervisor, I would be happy to connect them with the appropriate person. However, if they are unwilling to share any information with me, it may be difficult for me to assist them effectively. ### 回答2: 当客户来投诉时,我会首先向其表示歉意,表明我很重视他们的意见和感受。然后,我会耐心地听取客户的投诉内容,并在听取客户的叙述时保持冷静和专注。我会用礼貌的语言和态度与客户沟通,同时展示出对问题的重视和解决的决心。 当客户直言要求我的领导来处理时,我会向客户解释我作为该业务单位的代表责任和权限范围,提供我可以主动解决问题的服务和解决方案,并说明上级领导可能需要更多时间来解决问题。 然后,我会主动询问客户是否还有其他问题需要解决,并表示我愿意帮助他们寻找解决方案。如果客户仍然坚持要求我的领导来,我会尽量理解和尊重客户的要求,并告知客户我会尽快联系我的上级,并尽力将问题转达给他们。 在此之后,我会尽快与我的上级进行沟通,将客户的投诉原因、细节和要求详细记录下来,并向上级报告客户的情况和要求。我会请求上级给予合适的指导和解决方案,以满足客户的要求。 最后,我会向客户诚挚地表示感谢,以及在得知上级的回复后,及时与客户沟通,并向客户传递上级的处理意见。若客户还有其他问题或疑虑,我会耐心解答,并尽力恢复客户对我们的信任与满意度。无论最终结果如何,我会保持专业和礼貌的态度来处理客户投诉,以确保客户感到被尊重和满意。 ### 回答3: 当一位生气的客户来投诉并要求见我的领导时,我会做出以下的处理方式: 1. 耐心倾听:首先,我会保持冷静和专注,认真倾听客户的投诉,并通过询问和回答问题来更好地理解他们的不满和需求。 2. 了解原因:我会就客户投诉的具体原因进行详细了解,确保我完全理解他们的意见和问题。我会主动提供一些可行的解决方案,并与客户共同探讨可能的解决途径。 3. 解释权责:我会向客户解释我作为客户服务代表的职责和权限,将告知客户我所能为他们提供的帮助和解决问题的能力。同时,我会保证他们的问题将得到妥善的处理和回应。 4. 寻求帮助:如果客户坚持要求与我的领导接触,我会尊重客户的决定,并迅速联系我的领导,向他们简要介绍投诉情况,并要求他们提供支持和指导。 5. 快速响应:我会尽快安排与我的领导和客户之间的会面或电话交谈,以确保客户的问题能及时得到答复和解决。在此过程中,我会紧密协调并持续跟进以确保客户的满意。 6. 反馈处理结果:一旦问题得到解决,我会及时向客户反馈处理的结果,并诚挚地道歉,表达公司的关切和愿意改进的态度,同时邀请客户将对我们的服务进行评价,以期再次赢得他们的信任和满意。 总之,面对一位生气的客户投诉并要求见我的领导时,我会以耐心、细心和解决问题的态度去处理,同时尽最大努力确保客户的满意。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值