知乎服务化的实践与思考

服务化架构思考 在软件设计领域,企业架构通常被划分为如下五种分类:如何理解架构分类依据及其彼此之间的关系?业务是企业赖以生存之本,因此业务架构是基础、是灵魂,其他一切均是对业务架构的支撑;根据业务架构形成与之相应的产品架构和数据架构;最后通过技术架构落地实施。应用架构用于对产品架构进行细分,通过应用集成形成产品。但是应用架构区别于产品架构的本质不应该只在粒度,更重要的是产品直接承接业务,按照业务问题域进行划分;而应用需要考虑通用能力沉淀和复用,为多个产品提供统一支撑。业务架构。 阅读详情

服务化是知乎几年来技术演进故事里的一个主角,公司规模从几十人到几百人,在监控、tracing、框架、容器等基础设施从无到有的同时,也扩展出多个后端技术团队。在服务化演进的过程里,我们也进行了一些新的思考。

服务化的愿景

「微服务」 是业内最近两三年业内很火的 buzzword,迁移到微服务架构,大多强调这些好处:

  • 松耦合
  • 独立发布
  • 快速迭代
  • 故障隔离
  • 增加重用

经过服务的拆分,将复杂到难以移动的单体应用,拆分为多个可以独立部署的服务,单个服务的复杂性远远小于整体,这样不同服务的开发者可以并行开发,从而提高开发效率;因为服务的细粒度,可以 assign 给一个具体的人让他负责,随着业务的增长对服务做定向扩容;同时因为服务的隔离性,可以隔离故障,提高整体的稳定性。

不过在推动服务化的过程中,也感受到一些意外的痛点。

我们首先感受到的是服务数量的不可控。新 feature 经常会以新服务的形式开始开发,而非扩展现有的服务。随着产品的需求迭代,服务越来越碎片化,扩展现有服务变得越来越困难,因为很难选择加入到哪个服务更好。而且扩展一个其他人负责的服务,沟通成本不能忽视,这时出于产品进度的压力,另起炉灶开始一个新服务实在是最快的选择。

其次,部分业务基于 RPC 做水平分拆,原则上 RPC 的演进要保持向前兼容,而项目前期需求不稳定阶段,难免引进相当多的 break change,发包、上线、联调成本居高不下,也引进了额外的发布风险:上层服务和下层服务两者务必同时发布,但不能回滚其中之一。这在重要的功能开发中,成为了我们快速迭代的一个绊脚石。

拆分为 RPC 之后,通信介质发生了不同,而访问模式的适应不一定准备好。对有缓存覆盖的数据访问对象而言,N+1 式的访问模式不算问题,但是 N+1 query 对 RPC 却不能接受。服务的调用压力经常出乎维护者的意料,RPC 放大使得下层服务的波动放大,风险增加之余也增加了对资源的需求,而资源占用更多的同时,性能仍远低于过去对缓存的访问。

基于 SSO 的分拆

RPC (远程过程调用)是服务化体系中基础的基础,但是慢慢的我们发现 RPC 并非分拆的唯一选择。基于 RPC 的水平分拆会引入中间层次,增加联调的环节,对于快速开发的新业务而言,无法忽视额外的联调成本。联调中发现问题时不得不在各个层次定位,难以自动化测试。经过今年几个快速迭代的新项目从主站的分拆,我们发现基于 SSO (单点登录)机制对 HTTP 接口做垂直拆分是一条可行的路,可灰度控制风险、对客户端透明。新项目对主站的耦合往往较低,只需要 get_member 等少量几个 RPC 接口,对外暴露的接口也非常少。新项目的迭代速度快,经过拆分,能够使服务与后端团队的完整业务相匹配,降低了主站联动的发布频率,某种程度上也减少了出于部署积压而堆积的发布风险。

这里我们得到的启发是,服务的分拆并非 RPC 不可。相反,我们希望看到更少的 RPC,更多的内聚。更少的 RPC 接口意味着更小的服务边界,更稳定的接口,更少的 break change。内聚意味着允许功能需求的独立演进,对其他业务的影响降到最低,也意味着内聚的业务模块内部,可以充分利用缓存来优化性能。

桌面端怎么拆?

新项目之所以拆分顺利,也得益于它们当前只面向客户端,HTTP API 的拆分仍较为简单。然而桌面端的情形有所不同,一个页面往往不能单纯对应到一个服务上,比如问答页,除了问答服务,还需要评论、收藏、内容推荐等信息需要展现,这些页面组件背后的服务会趋于不同的工程师或团队维护。

这里可以注意到一件有意思的事情,在后端社区 buzzword 「服务化」 的同时,前端社区更加如火如荼地 buzzword 着 「前后端分离」 和 「组件化」。出于内容展现的复杂性,页面并不能成为分拆的好单位,但页面内的组件无疑更容易与后端的功能模块相匹配。「服务化」 和 「组件化」 是一对孪生子,分别允许后端团队和前端团队去隔离业务模块、独立演进。

知乎也正在进行着桌面端的前后端分离改造。随后桌面端不再特殊,允许后端面向 iOS / Android / Web 三端按同一套接口进行对接,也就可以像移动端 API 同样的方式,基于单点登录进行拆分了。

垂直拆分的风险

当前感受到垂直拆分的主要风险在于保证不同垂直业务对同类型实体展现逻辑的一致性。其中 feed 对这点要求最高,因为它对所有实体类型都有引用。为此在拆分 feed 流之前,先行补充了所有实体的 swagger 文档,通过中心的 swagger 文档约束住同一实体在不同服务中的字段展现。

如何划分服务边界

理想的世界里,服务边界恰好匹配于业务边界。然而工程师首先要承担业务需求的压力,只能抽时间重构拆分,业务边界也并不总是如新项目那样明晰。

这意味着要考虑优先级,也需要在拆分之前认真地思考业务的边界。排定优先级,考量拆分的收益与风险即可。划分业务的边界,则需要更多的思考拆分后的未来将如何沟通协作,然后再考虑技术因素。目前我们主要有这几个考量:

“

是否拥有独立团队来维护,或者是否拥有发展为一项独立业务的潜力;围绕领域而非 feature,有明确的维护团队,避免过于细粒度;拆分之后,能否改善现有的合作流程;能否帮助区分核心、非核心业务,改善稳定性;

”

以 feed 为例,它首先拥有独立团队维护,通过拆分,技术层面上允许 feed 团队重构掉下层服务与上层展现之间的冗余 RPC 调用,且调用模式较 uniform,在产品层面接受数据最终一致性的前提下可以通过 TTL 缓存提升性能,乃至按自己的业务场景做更细致的优化(优化结束后我们的某些接口 P95 性能加快了一倍);更重要的是对协作方式的影响,未来专栏、问答等生产信息的垂直业务,只提供一个 RPC 接口对接 feed 流即可,而不必集成到主站,这一来 「接入 feed」 流程的参与者,从 feed 组、垂直业务、主站三方,简化为 feed 组和垂直业务双方;此外 feed 通过 TTL 缓存,实质上冗余了一份垂直业务的数据,配合断路器的使用,依赖的垂直业务的抖动甚至崩溃在 feed 这边都可以优雅降级且保持正常展现了。将 feed 与主站的变更相隔离,也有助于改进作为一项核心业务的 feed 的稳定性。

服务分层:业务服务和公共服务

在垂直业务之外,也存在多数业务都会重用的公共服务,如用户、话题、网页抓取、多媒体、推送等。业务服务和公共服务在关注点上有所不同:

我们希望业务服务快速迭代,更快、更好地响应多变的业务需求,更多地面向前端工程师;

我们希望公共服务稳定可靠,较少发生改动,但 SLA 要好,更多地为业务重用;

这里会形成一个自然的分层:上层业务求快、下层公共服务求稳。

经验与教训

按领域思考合作的方式,而非技术角色分工: 首先思考团队的合作方式,面向领域去划分工作,减少跨服务的沟通环节,减少联调环节;

有目标地、适度地服务化: 服务化有成本和风险,在执行大规模的技术改进期间,要目标导向,小成本达成目标为上,不必一条路线走到底;

面向未来

回到文章开头提到的这几点特质:松耦合、独立发布、快速迭代、故障隔离、增加重用,为了这些目标,我们还有很多工作要继续。没有完美的架构,真实世界也充满 trade off,但是围绕我们期望的目标,能一点点做工程改进,收集反馈不停地修正工作方法。这是一段漫漫长路,途中请切记最初的目标!

DB-GPT:生产级大模型部署的思考与实践 随着自然语言处理技术的快速发展,大模型如GPT系列在各个领域都取得了显著成效。本文将探讨如何在生产环境中高效部署DB-GPT这类大模型,结合实际应用场景提供可行的解决方案,并分享实践经验。 阅读详情

相关推荐

03-测试服务化的思考

1. 引言 最近工作中听说了”测试服务化“这个名词,觉得好奇,去搜索了一些相关的解释,大致如下: ”测试服务化不但可以让测试自身使用比较便捷同时也可以让开发同学使用,乃至可以推广到更多的群体,运用范围广最后可以成为重要的基础的设施服务“ ”于是大型的公司就开始开发针对自己业务的测试工具,测试平台,同时将自己特定的测试功能代码服务化,以方便公司其他测试同事的使用“ 总结就是说,将测试脚本转换为服务化的测试工具,更容易推广给更多的人使用,更灵活。 2. 思考 回想了一下,自己在工作中所做的回归测

进阶的小猫的博客 921

Java9模块间的服务化详解

Jdk9模块化实战入门 本章我们来到了Jdk9新增的最重要的一块内容——模块化。有过编程经验的人都不应该对模块化陌生, 无论是项目代码的组织、还是应用的拆分、架构的设计都渗透着模块化的思想,如今jdk9 不但本身已经模块化,且对我们创建模块化的应用程序提供了“本地原生”支持。模块化的程序提供了更高级的封装性与服务化特性。本章我们将学习:什么是模块化 jdk9 的模块化特性 如何构建模块化程序 面

舒哥的blog 3228

SAP批量程序(一)-静态批量EX,FX和期间批量MB,WB和TB

SAP批量程序(一)-静态批量和区间批量

weixin_38974136的博客 5483

【优秀博文】知乎服务化的实践与思考

作者:fleuria链接:https://zhuanlan.zhihu.com/p/24044342来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 服务化是知乎几年来技术演进故事里的一个主角,公司规模从几十人到几百人,在监控、tracing、框架、容器等基础设施从无到有的同时,也扩展出多个后端技术团队。在服务化演进的过程里,我们也进行了一些新的思考。 服务化...

weixin_33857679的博客 135

matlab特征提取和分类_SAST Weekly|MATLAB机器学习初探——做个心音分类器

SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!本期的SAST weekly,想跟大家分享一下如何用MATLAB进行初步的机器学习,构建一个正常/...

weixin_36453829的博客 5582

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9213

服务化的实践与思考

服务化是知乎几年来技术演进故事里的一个主角,公司规模从几十人到几百人,在监控、tracing、框架、容器等基础设施从无到有的同时,也扩展出多个后端技术团队。在服务化演进的过程里,我们也进行了一些新的思考。 服务化的愿景 「微服务」 是业内最近两三年业内很火的 buzzword,迁移到微服务架构,大多强调这些好处: 松耦合 独立发布 快速迭代 故障隔离 增加重用 经过服务的拆...

weixin_30929011的博客 116

基于ThingsBoard+ESP8266的MQTT远程控制实战:从设备接入到仪表盘交互

本文详细介绍了基于开源物联网平台ThingsBoard与ESP8266开发板,通过MQTT协议实现远程控制的完整实战流程。从环境搭建、设备创建、仪表盘设计到核心代码编写与联调,手把手指导完成从云端到硬端的物联网闭环,为智能家居与物联网原型开发提供低成本、高效率的解决方案。

weixin_29192365的博客 333

对服务化的一些疑问和思考

服务化是今年的重点,在听了其它部门的服务化进程汇报后心中疑问丛生,正好有机会找前辈友群聊了下服务化相关的问题,随手记录于此。 前言:首先应该掌握服务化的思想,大多数人一听到服务化马上开始考虑代码层面要做怎样的改动,一头钻进了具体的实现中。类似于,即使使用了java这样OOP的语言,仍可能会写出面向过程风格的代码,从而无法体现OOP的优势。 1、对服务化的理解 1.1 发生发展的背景及定义

信言的笔记 1024

Keil 5安装教程(C51与MDK共存)

目录前言MDK的安装C51的安装安装完成后的验证新建C51工程添加C51程序文件编译测试总结 前言 本篇文章将介绍嵌入式开发工具Keil 5的安装方法,并使MDK(Microcontroller Development Kit,开发stm32时会用到)和C51(51单片机C语言软件开发系统)共存。今后使用Keil 5可同时开发51单片机程序和ARM单片机程序,便于学习与从51到32的过渡。 注: 为防止商业纠纷,本篇文章不涉及文中软件的注册破解,请支持正版。 同时为了便于今后更深入的学习,本文不会介绍软件的

xushu_me的博客 6万+

STM32 AFIO时钟开启时机与复用功能解析

在嵌入式系统开发中,GPIO复用是微控制器外设配置的核心技术之一。通过复用功能,单个物理引脚可以动态切换不同功能模式,如USART通信或普通IO。其实现原理依赖于芯片内部的时钟树架构和寄存器配置机制。AFIO(Alternate Function I/O)模块作为STM32的特色设计,专门处理引脚重映射、外部中断配置等高级功能。正确理解复用功能与AFIO时钟的关系,能显著提升嵌入式开发效率,避免资源浪费。本文以STM32为例,结合引脚重映射和USART配置等典型场景,详解AFIO时钟的实际应用规范与优化实践

weixin_42389113的博客 579

为什么服务化思维值得推崇?从产品到服务的转型思考

从产品到服务的转型,背后是对市场需求的不断回应与适应。服务化思维要求我们不再只是满足于“做出一个好产品”,而是始终关注客户的需求和市场的变化,不断优化和提升服务。这种思维方式不仅仅适用于团队或公司,也同样适用于每一个个人。在变化无常的现代社会,只有不断适应变化,提供真实的价值,才能在竞争中脱颖而出。“服务化思维不是简单的‘做事’,而是‘做对事’的智慧。

朱雀随云记的博客 970

《Unity DOTS之ECS从入门到不香》(1)基本概念

文章目录一、什么是DOTS?二、什么是ECS?三、Hello World 一、什么是DOTS? Data Oriented Tech Stack(DOTS)是unity推出的多线程面向数据的技术堆栈 。它是一套高性能解决方案,包含三个部分: 1.ECS:ECS是一种有别于面向对象的编程模式,是面向CPU Cache友好的编程模式。要求代码都要按照 实体+组件+系统 的框架构建。官方链接 2.JobSystem:JobSystem是unity推出的一套先进的多线程任务管理系统,结合ECS可以获得最佳性能。当然

Cxihu田树东的游戏开发博客 2732

我所理解的服务化

点击上方“Java之间”,选择“置顶或者星标”你关注的就是我关心的!作者:D咄咄来源:https://segmentfault.com/a/119000001076745...

Java之间 956

第4章-07-将WebDriver获取的Cookie传递给Requests

在使用Selenium WebDriver获取了浏览器的Cookies之后,你可以将这些Cookies传递给requests库,以便在后续的HTTP请求中使用这些Cookies。这样做可以让你模拟浏览器会话,使得请求看起来像是从之前使用Selenium WebDriver控制的浏览器发出的。

黑夜开发者的博客 692

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最佳实践 -- Dubbo 服务化进程的一点思考

最近主要负责公司的 dubbo 服务改造。在改造过程中,涉及到很多核心系统的编码。改造的系统涉及到核心系统,并且改造的系统一多,难免会产生一点胡思乱想。下面我就分享一下我在项目改造过程中的一点胡乱的想法。需要对大家有帮助: 1、统一的打包方式 对于之前项目中使用 restful 进行交互,项目的发布就没有版本这个概念。但在使用 dubbo 服务化就依赖版本这个概念。在项目中我们打包的方式和项目的版...

carl.zhao的专栏 1026

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Qwen3-0.6B-FP8 API服务化实践:FastAPI封装+OpenAI兼容接口实测

本文介绍了如何在星图GPU平台上自动化部署Qwen3-0.6B-FP8(内置模型版)v1.0镜像,快速搭建一个具备OpenAI兼容接口的AI服务。该镜像封装了轻量级大模型,通过FastAPI提供API服务,可便捷地应用于构建轻量级客服机器人、教学演示工具等场景,实现本地化AI对话与内容生成。

weixin_42418754的博客 1043

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

AI应用Token计量与配额管理:从原理到TokScale服务化实践

在构建基于大语言模型(LLM)的AI应用时,**Token计量**是成本控制与资源管理的核心基础。Token作为LLM世界的通用“计价单位”,其消耗量直接关联着API调用成本。从技术原理上看,精确的Token统计需要解决全局状态一致性、高并发实时上报与多维聚合查询等分布式系统挑战。其技术价值在于,将复杂的计费策略与核心业务逻辑解耦,实现精细化的成本核算与资源配额控制,这对于SaaS化、多租户的AI产品至关重要。典型的应用场景包括:为不同用户(如免费用户、企业客户)设置差异化的用量套餐,对输入/输出Token

weixin_33713707的博客 695

dubbo调用service后返回对象null_最佳实践 -- Dubbo 服务化进程的一点思考

最近主要负责公司的 dubbo 服务改造。在改造过程中,涉及到很多核心系统的编码。改造的系统涉及到核心系统,并且改造的系统一多,难免会产生一点胡思乱想。下面我就分享一下我在项目改造过程中的一点胡乱的想法。需要对大家有帮助:1、统一的打包方式对于之前项目中使用 restful 进行交互,项目的发布就没有版本这个概念。但在使用 dubbo 服务化就依赖版本这个概念。在项目中我们打包的方式和项目的版本的...

weixin_34237941的博客 517

微服务架构的演进与实践思考

微服务架构的演进是一个不断探索和实践的过程,它不是银弹,也不是适用于所有场景的解决方案。在采用微服务架构之前,我们应该充分评估自己的业务需求、团队规模和技术能力,选择适合自己的架构模式。记住,架构是为业务服务的,而不是反过来。最重要的是,保持架构的简洁和可维护性,这其实可以更优雅一点。如果有任何问题或建议,欢迎在评论区留言,我会认真回复每一条评论。

alex_goden的博客 1928

服务化与组件化

当项目越来越大,开发人员的数量变得越来越多,业务改动变得越来越频繁,最终项目就会逐渐变成一坨。我尝试过很多办法,也使用过各种框架,但都只是在写代码的时候很爽而已。只有对整个系统服务化,并针对一些可通用但不可服务的东西组件化才可以解决变成一坨的问题。 服务化   所谓服务,就是可以单独运行,并且对外提供功能的一种形式。将一个复杂的项目分解成多个服务之间的依赖。当某一个服务挂掉时不会拖垮整个系

yaofengyaofeng的专栏 5188
上一篇: 全面解读Spring Boot 最流行的 16 条实践
下一篇: 微博高并发场景下的分布式缓存架构
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值