
阿里妹导读:闲鱼品牌创立于14年阿里的某个茶水间,从0开始到如今千万DAU,5年时间里闲鱼见证了闲置物品从线下到线上交易的转移。而线上交易的繁荣,则须要业务架构作相应的调整、演进才能支撑业务的快速发展。本文主要经过介绍闲鱼从0发展到千万级DAU应用的不一样阶段的业务特色、核心问题以及针对性的架构演进,来阐述业务架构的演进思路与心得。
闲鱼业务背景
技术架构的演进跟业务形态都是强相关的,闲鱼的市场本质以及用户特色以下描述:前端

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

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

闲鱼与手淘在业务、团队结构的差别性致使架构上不一样的关注点,致使不一样的演进路线。后端
架构演进——试错期

架构随着业务阶段不断演进,每一个阶段都有核心的问题:服务器
- 试错期业务核心问题:业务不断探索适合的商业模式;
- 架构核心关注点:提高响应速度,快速支持业务上线;
- 架构核心原则:以质量换取速度,能够牺牲一点线上质量(业务可接受范围)来换取更快的响应速度。
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个步骤:
- 端上用Flutter实现了两端(IOS、Android)统一。无线发展了如今,跨平台的需求已经很是强烈,团队招聘须要考虑 Android,IOS配比、一个业务须要在两端都写一次, 考虑双端逻辑一致、测试要测两遍。因此跨平台的方案能很是直接有效的下降研发成本,解决资源均衡的问题。
- Flutter+dart实现了三端(IOS、Android、服务端)技术栈统一。端上统一了,再经过云端技术栈的打通来减小云端的协同。参考前端+Node.js的方案,闲鱼服务端用dart(Flutter也是dart语言)替换Java,做为服务端server的语言。
- 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福利来了!先来康康#怎么买云服务器最便宜# [并不简单]参团购买指定配置云服务器仅86元/年,开团拉新享三重礼:1111红包+瓜分百万现金+31%返现,爆款必买清单,还有iPhone 11 Pro、卫衣、T恤等你来抽,立刻来试试手气!https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110
本文做者: 扬羽
阅读原文
本文来自云栖社区合做伙伴“阿里技术”,如需转载请联系原做者。