QCon演讲|闲鱼从零到千万DAU的应用架构演进

导读:业务架构要随着业务发展做相应的演进,继而支撑业务的快速发展。本文主要通过介绍闲鱼从零发展到千万级DAU应用的不同阶段的业务特点、核心问题以及针对性的架构演进,来阐述业务架构的演进思路与心得。

闲鱼业务背景

技术架构的演进跟业务形态都是强相关的,闲鱼的市场本质以及用户特点如下描述:

闲鱼是一个高性价比的二手交易市场。相比新品市场,二手市场的市场空间就是"用户在付出相同成本条件下有可能获取到更高的物品价值”,典型的比如"游戏卡带,乐高"等这些功能型的产品。同时,闲置市场也有着特殊存在的成本-信任成本,信任成本主要体现在:大部分二手可能没有售后服务;每个人对二手物品残值有着自己的主观评价。 
扩大市场空间有两种方式,1.降低新人成本 2.提升匹配效率

闲鱼与手淘差异性:

  • 闲鱼与手淘的卖家差异:非专业的个人卖家,利益驱动弱。
  • 发布产品差异:为保证市场供给,只能坚持轻发布。
  • 商品差异:结构化信息少,没有历史累计行为。

闲鱼与手淘在业务、团队结构的差异性导致架构上不同的关注点,导致不同的演进路线。

架构演进-试错期


架构随着业务阶段不断演进, 每个阶段都有核心的问题

  • 试错期业务核心问题:业务不断探索适合的商业模式
  • 架构核心关注点:提升响应速度,快速支持业务上线
  • 架构核心原则:以质量换取速度,可以牺牲一点线上质量(业务可接受范围)来换取更快的响应速度

App发版速度(尤其是IOS)跟不上业务快速迭代的上线周期,动态性是端面临的主要问题,因此端上采用了Hybrid的架构:

  • URL Router:所有请求路由到一个H5的链接,通过URI Schema重定向到真正页面,如果对应的native没有开发出来,就用H5版本来实现,解决安卓与IOS不同步的问题。
  • 开关中心:通过开关控制页面路由,页面入口是否开启,分版本控制,参数变更等改动。
  • Poplayer:无需发版的情况下在已有的Native界面上弹出H5的部署容器,来满足运营随时创建活动并需要一个活动入口的需求。

架构演进-发展期


发展期业务与架构核心问题:

  • 业务核心问题:隐约看到商业模式,需要加速验证,扩大规模
  • 架构关注点:提升效率(为了有机会去做更多事情,非降低整体成本),建更多能力验证业务方向
  • 架构演进方向:前后端的协议、工具的自动化 
    服务端通过Mbaas(服务端提供基础的数据源(商品、用户、搜索、互动),让客户端/前端通过类SQL的描述一次性获取自己想要的数据,后端不需要增加接口)来实现活动、feeds投放的自动化。将更多精力投入到本地化、个性化、数据能力(与算法、推荐、搜索打通)的建设中。


客户端开发关注两个点:

  • 对外整体连接协议的梳理,在容器这端演化成Service Bus(类似服务端的ESB),对具体的实现进行封装, 以方便后续基础能力的可替换。
  • 组件库的建立,新做一个页面的时候,能通过现有的UI组件进行简单组装,不需要重0开始搭建。组件与服务端打通,组件组装逻辑与数据直接由服务端完成,客户端负责解析与渲染。 
    因此这个时期客户端更多的工作是支持交互的基础的UI组件和动态适配性。

架构演进-平台期


随着业务的发展,闲鱼基于商品体系的业务达到十几种,逐渐向平台期发展。平台期业务与架构核心问题:

  • 业务核心问题:需要让更多的二方、三方参与到共享经济平台的建设中,但是平台生态建设又超出了闲鱼自身的能力
  • 架构核心关注点:扩展性(具备接入业务的能力)、业务隔离(已接入业务平稳运行)、平台基础能力建设(业务更好的发展)
  • 架构原则:做一些更基础的规划,然后把更多的可能性、动态性留给二方或者三方完成

业务隔离框架Swak


核心解决因业务发展带来的代码耦合问题,问题主要体现在整体开发、运维效率低,稳定性差。核心思路是分离系统中不可变和可变的部分;分离出”做什么”与”怎么做”、“谁去做”。 
将业务中不变的部分放入主干,定义出做什么;变化的部分以扩展点形式开放出来,让具体的业务放自己来实现,完成怎么做,谁去做。Swak的扩展点实现支持远程调用,可以让业务实现应用级别的隔离 ,相比传统的分包、分模块隔离方式更加彻底。 
当前,闲鱼商品主链路完成基于Swak的升级。下面是一个闲鱼币个性化业务的代码案例:

平台通用能力


平台必须提供一些通用能力更好的支持业务发展:

  • 实时选品投放能力--马赫:解决因闲鱼商品特性(结构化信息少,新品成交占比高)导致传统离线选品转换率差的问题。
  • 实时线上故障定位能力--神探:解决类闲鱼规模系统因依赖多、场景多,导致线上问题频发、问题定位投入成本高的问题。核心思路是对系统每一次错误的请求链路进行实时采集、分析、聚合再可视化展现,将整体故障定位过程变成自动化。

架构演进-云端一体化

云端一体化--背景


随着无线发展,移动研发逐渐向多端化发展(IOT、小程序)。传统的基于Native+Web+服务端的开发方式,逐渐出现瓶颈,我们会发现例如:

  • 端上同学离业务越来越远,服务端同学没时间做底层领域沉淀。
  • 各端研发之间存在大量的协同, 整体研发效率低下。
  • 招人也难了,需要同时招多个技术栈的同学 
    在这种背景下, 我们的关注点回到研发效率上,从整体研发架构、研发模式出发, 思考什么样的架构演进、关系重塑才能适合当前的业务形态。我们希望探索出适合“ 闲鱼这样规模的具有独立APP” 的高效研发架构, 形成云端一体化的研发能力,支持一云多端的发展

云端一体化--演进步骤


朝着云端一体化的方向,架构的升级大概分成3个步骤:

  1. 端上用Flutter实现了两端(IOS、Android)统一。无线发展了现在,跨平台的需求已经非常强烈,团队招聘需要考虑 Android,IOS配比、一个业务需要在两端都写一次, 考虑双端逻辑一致、测试要测两遍。所以跨平台的方案能非常直接有效的降低研发成本,解决资源均衡的问题。
  2. Flutter+dart实现了三端(IOS、Android、服务端)技术栈统一。端上统一了,再通过云端技术栈的打通来减少云端的协同。参考前端+Node.js的方案 ,闲鱼服务端用dart(Flutter也是dart语言)替换Java,作为服务端server的语言。
  3. Flutter+ Faas(dart runtime)+Nexus。技术栈统一了,人员还不能互补, 最新闲鱼将Dart容器嵌入到Faas容器中,配合跨云端的一体化业务研发框架Nexus,进行了一体化的研发模式的探索,使得一个研发人员能从端到服务端完成整个业务的闭环。

云端一体化--跨端方案选择


架构方案的选择,可能造成巨大并且长远的影响。在架构的演进中, 我们要善于定义问题,然后通过不断迭代来解决问题,最后才能形成适合自己业务特性的架构。 
闲鱼也是一样,所谓没有银弹的解决方案,在跨平台方案的选型中, 充分对比了Flutter与RN的差异性,优缺点。
闲鱼认为"跨平台与高性能是我们当前的核心诉求”, 再结合团队内native技术栈的同学较多这个因素,我们最终选择了Flutter作为跨端解决方案。

云端一体化--云端协同


Flutter两端统一后,会发现客户端与服务端虽然都在做同一个业务,不仅技术栈没有统一,而且存在着大量协同的工作,同时端、云的同学仍然无法真正互补和一体化打通。 
因此,我们开始思考是否能有一体的架构 ,能让一个同学可以Cover一个云到端的完整业务,形成业务闭环。 
这不仅仅是效率的提升,更能为业务开发同学带来更大的成长空间,可以完整的和专注的思考业务。

云端一体化--关键问题以及解法


我们梳理了需要解决的关键问题:

  • 如何消除云端技术壁垒?首先要统一技术栈,其次端同学对云的思维模式、知识储备上的差异,需要有办法消除。
  • 如何使工作总量减少 ( 1+1<2 )?一体化下需要使总工作量降低,不是简单的进行工作量转移。
  • 如何促进生产关系重塑?生产力发生变化,需要建立新的生产关系。

面向这些问题,闲鱼的解法思路:

  • 统一技术栈: Dart具备服务端语言特点,强类型,支持异步与并发,甚至更快的启动速度,因此作为服务端的server完全没有问题。Dart落地过程中更多的解决的是生态的问题(阿里的大部分生态都是基于java来建设的,例如中间件、消息、远程调用)。我们主要通过通过C++扩展、SideCar方式做桥接,Service Mesh来解决。
  • 云端差异抹平: 通过Faas , Baas等无服务器能力的建设, 抹平除写代码外的其他差异性(运维、故障定位等),使得客户端同学能写服务端;通过UI2Code(根据图片生成UI代码),页面代码模板化(页面容器,数据管理)使得服务端写客户端
  • 一体化总体效率提升:以往的架构是云、端分开架构的,一体化后下沉跨云端的研发框架Nexus,通过框架、工程体系的支持, 消除协议层, 重新定义UI与逻辑分层, 带来了总工作量1+1<2
  • 关系重塑:领域下沉能让原来服务端同学更加专注领域建设, 使领域层更加稳定, 让业务层与领域层的变化比例,从当前的2:1,提高到5:1 甚至更高。让大家的关注点都集中在自己的范围内。

云端一体化--业务落地


目前一体化的研发模式已经在闲鱼多个场景落地,我们以下单页的改造举例: 
改造前:下单页有着复杂的 渲染 交互逻辑,之前大部分逻辑都是在端上。需要两个客户端+一个服务端的同学来维护。 
改造后:

  • 将客户端界面从 IOS、Android两端统一成了Flutter, 后续只需要一个同学维护即可,也不会出现逻辑不一致的情况。
  • 原来云端分离的业务逻辑全部下沉到了Faas(Dart),将原来分散在端与服务端的逻辑进行归一,有机会做更多的规划建设,同时也是端的同一个同学来维护。
  • Faas层调用底层领域服务来完成自己的业务,原来服务端的同学更多投入到交易能力的建设上。

框架下沉: 
跨云端业务研发框架Nexus:寓意着能将客户端与服务端连接在一起。 
核心思想:将UI与逻辑分离,框架限定了端上只负责UI与状态的存储, 所有的逻辑都在Faas中完成。 
非常适合类似下单页的领域稳定的的场景。

云端一体化--收益


云端一体化能在多个方面给我们带来收益, 包括团队人员资源的均衡、协同效率的提升、业务的一致性以及人员的新的成长空间。 
特别适合类似闲鱼规模的具有独立app的研发团队

小结


本文分别介绍了闲鱼从快速试错期、发展期、平台期、云端一体化的整体架构演进以及过程中的思考。对核心问题的定义,以及做的具体演进。

我们会发现,架构的演化总是优于一步到位,没有一个大而全或者特效的方法可以一直提升系统效率。软件工程是一个超级复杂的系统,尤其是业务架构,需要随着业务随时变化。明确当前业务特点和核心问题才是设计的根本,不符合业务的架构再领先也没用。相信所有架构师都有这样的体会。 
希望通过以上的分享对大家有所启发!


阿里云双11亿元补贴提前领,进入抽取iPhone 11 Pro:https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员必修课:为什么非要用Python做数据分析?Excel不好吗?

日本最大的证券公司之一野村证券首席数字官马修汉普森&#xff0c;在Quant Conference上发表讲话&#xff1a;“用Excel的人越来越少&#xff0c;大家都在码Python代码。”甚至直接说&#xff1a;“Python已经取代了Excel。”实际上&#xff0c;Python的应用领域极为广泛&#…

SpringCloudGateway实现金丝雀发布_05

接上一篇&#xff1a;SpringCloudGateway 集成 nacos 整合实现动态路由 文章目录一、启动服务1. 启动Gateway-Serv模块服务2. 启动auth-serv认证授权服务3. 启动product-serv服务4. 启动product-serv服务2二、修改nacos配置2.1. 配置改造2.2. 配置发布三、测试验证3.1. 访问产品…

Dubbo 在 K8s 下的思考

序言 Dubbo在2011开源之后&#xff0c;一直是国内最受欢迎的RPC框架&#xff0c;之后spring boot和Spring Cloud的面世&#xff0c;助推了微服务的火热程度。计算机的世界变化很快&#xff0c;自从容器和K8s登上舞台之后&#xff0c;给原有的RPC领域带来了很大的挑战。这个文章…

containerd与安全沙箱的Kubernetes初体验

containerd是一个开源的行业标准容器运行时&#xff0c;关注于简单、稳定和可移植&#xff0c;同时支持Linux和Windows。2016年12月14日&#xff0c;Docker公司宣布将Docker Engine的核心组件 containerd 捐赠到一个新的开源社区独立发展和运营。阿里云&#xff0c;AWS&#xf…

Seata 单机环境搭建_01

文章目录一、整合版本说明1. 毕业版本依赖关系(推荐使用)2. 组件版本关系3. 演示版本二、部署单机 TC Server2.1. 下载Seata2.2. 解压缩2.3. 启动2.4. 监听日志2.5. 启动命令讲解一、整合版本说明 1. 毕业版本依赖关系(推荐使用) Spring Cloud VersionSpring Cloud Alibaba V…

学生成绩管理系统java+mysql+swing入门级项目开发

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 代码已移至Gitee &#xff1a; https://gitee.com/BreezAm/edu-student 文章目录简要&#xff1a;登陆运行效果主界面运行效果图界面设置运行效果图网络配置界面运行效果图菜单栏运行效果图登陆窗体实现窗体界面设置功…

干货 | 大白话彻底搞懂 HBase RowKey 详细设计

作者 | 且听风吟责编 | Carol封图 | CSDN 付费下载于视觉中国前言RowKey作为HBase的核心知识点&#xff0c;RowKey设计会影响到数据在HBase中的分布&#xff0c;还会影响我们查询效率&#xff0c;所以RowKey的设计质量决定了HBase的质量。是咱们大数据从业者必知必会的&#xf…

Knative 实战:如何在 Knative 中配置自定义域名及路由规则

目前 Knative 中默认支持是基于域名的转发&#xff0c;但域名默认格式是&#xff1a;"{{.Name}}.{{.Namespace}}.{{.Domain}}"&#xff08;这个可以在 config-network 配置&#xff09;。但对于用户来说并不能指定全域名。 另外一个问题就是基于Path 转发的能力&…

混合云模式下 MaxCompute + Hadoop 混搭大数据架构实践

摘要&#xff1a;2019杭州云栖大会大数据企业级服务专场&#xff0c;由斗鱼大数据高级专家张龙带来以 “混合云模式下 MaxComputeHadoop 混搭大数据架构实践” 为题的演讲。本文讲述了从 Apache Hadoop 阶段到 Cloudera CDH 阶段斗鱼大数据架构的发展历程。提出了上云过程中斗鱼…

mybatisplus 一次性执行多条SQL语句

文章目录一、Mysql数据库1. Url2. xml映射文件二、Oracle数据库2.1. 关键点2.2. xml映射文件一、Mysql数据库 关键点&#xff1a;在url后面添加&allowMultiQueriestrue&#xff0c;sql后面添加分号; 1. Url 案例&#xff1a; url: jdbc:mysql://localhost:3306/afsdb?…

没错!Python程序员正在消失,HR:你才知道?

Python为什么这么火&#xff1f;学了Python能干什么&#xff1f;Python程序员有前途吗&#xff1f;几乎所有人脑子里都有这个疑问&#xff0c;感觉现在铺天盖地都是Python的消息&#xff0c;就连刷抖音都能刷到Python&#xff0c;Python已经火出圈了&#xff01;Python为什么这…

swing中模态对话框(setModal(true))和显示对话框(setVisible(true))的编写顺序

今天给大家分享一个鄙人在编程中总结出的一个易错点和最容易让人感到困惑的一个知识点&#xff1a; 当你要从一个窗体跳转到另一个窗体&#xff0c;你把跳转目标的窗体设成模态对话框&#xff0c;设计成模态对话框就是禁止父窗体与子窗体之间操作&#xff0c;简单说就是当调用子…

Service Mesh 初体验

前言 计算机软件技术发展到现在&#xff0c;软件架构的演进无不朝着让开发者能够更加轻松快捷地构建大型复杂应用的方向发展。容器技术最初是为了解决运行环境的不一致问题而产生的&#xff0c;随着不断地发展&#xff0c;围绕容器技术衍生出来越来越多的新方向。 最近几年&a…

mybatisplus 一次性执行多条SQL语句插入(Mysql篇)

文章目录一、数据库部分1. 创建数据库2. 初始化表结构二、代码部分2.1. controller2.2. mapper接口2.3. 映射文件2.4. 参数封装三、测试验证3.1. 发起请求3.2. 查看数据库3.3. 配置文件部分一、数据库部分 1. 创建数据库 创建more-insert 2. 初始化表结构 -- 一次性插入多张…

带领国产数据库走向世界,POLARDB底层逻辑是什么?

POLARDB 是阿里云自主研发的下一代云原生分布式数据库&#xff0c;100%兼容MySQL、PostgreSQL等开源数据库&#xff0c;高度兼容Oracle语法&#xff0c;使用RDS服务的客户不需要修改应用代码&#xff0c;可以一键迁移到POLARDB&#xff0c;体验更大的容量&#xff0c;更高的性能…

基于java+swing+mysql+JFeeChart的企业人力资源管理系统(1)

文章目录一&#xff0c;前言二&#xff0c;项目运行图&#xff08;1&#xff09;主界面&#xff08;管理员界面&#xff09;&#xff08;2&#xff09;员工资料运行图&#xff08;3&#xff09;全部员工查看运行图&#xff08;4&#xff09;部门管理运行图&#xff08;5&#x…

十年架构师:我是这样手写Spring的,用300行代码体现优雅之道

起源Spring作为一个开源框架&#xff0c;于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是…

深度 | 打败围棋冠军后,机器智能下一步能战胜黑客吗?

阿里妹导读&#xff1a;从深蓝战胜象棋冠军到AlphaGo战胜围棋冠军&#xff0c;每一次机器智能在特定领域战胜人类&#xff0c;都会引发整个社会的广泛关注。洞察了棋类博弈真相的机器智能&#xff0c;接下来能洞察网络安全的真相并且在黑客博弈中战胜人类吗&#xff1f;在机器智…

mybatisplus 一次性执行多条SQL语句插入(Oracle篇)

文章目录一、数据库部分1. 创建数据库2. 初始化表结构二、代码部分2.1. controller2.2. mapper接口2.3. 映射文件2.4. 参数封装三、测试验证3.1. 发起请求3.2. 查看数据库3.3. 配置文件部分一、数据库部分 1. 创建数据库 创建more-insert 2. 初始化表结构 -- 一次性插入多张…

从310到蚂蚁森林,蚂蚁金服在线图计算的创新与实践

蚂蚁金服过去十五年&#xff0c;重塑支付改变生活&#xff0c;为全球超过十二亿人提供服务&#xff0c;这些背后离不开技术的支撑。在 2019 杭州云栖大会上&#xff0c;蚂蚁金服将十五年来的技术沉淀&#xff0c;以及面向未来的金融技术创新和参会者分享。我们将其中的优秀演讲…