从0到千万DAU,这5年闲鱼架构如何演进?

阿里妹导读:闲鱼品牌创立于14年阿里的某个茶水间,从0开始到现在千万DAU,5年时间里闲鱼见证了闲置物品从线下到线上交易的转移。而线上交易的繁荣,则需要业务架构做相应的调整、演进才能支撑业务的快速发展。本文主要通过介绍闲鱼从0发展到千万级DAU应用的不同阶段的业务特点、核心问题以及针对性的架构演进,来阐述业务架构的演进思路与心得。

闲鱼业务背景

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

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

扩大市场空间有两种方式:

  • 降低新人成本
  • 提升匹配效率

闲鱼与手淘差异性:

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

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

架构演进——试错期

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

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

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福利来了!先来康康#怎么买云服务器最便宜# [并不简单]参团购买指定配置云服务器仅86元/年,开团拉新享三重礼:1111红包+瓜分百万现金+31%返现,爆款必买清单,还有iPhone 11 Pro、卫衣、T恤等你来抽,马上来试试手气👉  https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110

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

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

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

相关文章

初创公司5大Java服务困局,阿里工程师如何打破?

阿里妹导读&#xff1a;初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。阿里巴巴地图技术专家常意在技术圈摸爬滚打数年&#xff0c;接触了各式各样的Java服务端架构。服务端问题见得多了&#xff0c;也就更能分辨…

Navicat for MySQL连接MySQL数据库时各种错误解决

一 、2058错误 通过命令行进入MySQL&#xff0c;执行如下命令&#xff1a; ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY root截图&#xff1a; 二、1251错误 通过命令行进入MySQL&#xff0c;执行如下命令&#xff1a; ALTER USER rootlocalhost I…

构建灵活工作方式 戴尔最智能商用客户端产品线全面上市

戴尔Latitude、Precision和OptiPlex产品组合再次全面升级&#xff0c;带来更高水平生产力 2020年6月12日&#xff0c;随着“新基建”首次被写入《政府工作报告》&#xff0c;数字经济将成为释放经济新动能的最重要途径。在企业加速数字化转型的过程中&#xff0c;生产力转型是…

秒杀场景_解决秒杀超卖问题_04

文章目录一、商品微服务改造二、秒杀微服务改造2.1. SkillGoodService 改造2.2. MutilThreadOrder 改造一、商品微服务改造 SkillGoodService改造 package com.gblfy.service;import com.gblfy.dao.SkillGoodRepository; import com.gblfy.entity.SkillGood; import lombok.R…

初识 Knative: 跨平台的 Serverless 编排框架

Knative 是什么 Knative 是 Google 在 2018 的 Google Cloud Next 大会上发布的一款基于 Kubernetes 的 Serverless 框架。Knative 一个很重要的目标就是制定云原生、跨平台的 Serverless 编排标准。Knative 是通过整合容器构建(或者函数)、工作负载管理(和动态扩缩)以及事件模…

python使用PyMysql连接MySQL实现增删改查

文章目录一、安装PyMysql&#xff1a;1.方式一&#xff1a;使用命令行2.方式二&#xff1a;通过PyCharm编译器二、操作MySQL数据库步骤1. 使用import导入相应的类2.获得数据库的连接3.创建游标对象4.执行SQL语句5.关闭数据库连接三、案例1. 查询单条数据2. 查询多条数据3.创建数…

一分钟解决 Github 访问慢

文章目录1. 获取域名对应的ip2. 复制ip3. 配置hostsgithub.com对应的ip有多个选一个响应快的即可&#xff0c;但是一直在变&#xff0c;用的时候&#xff0c;设置一次即可 1. 获取域名对应的ip https://tool.chinaz.com/dns/?type1&hostgithub.com&ip 2. 复制ip 3. …

做一个高一致性、高性能的Flutter动态渲染,真的很难么?

Flutter动态模板渲染架构升级 ​ 最近小组在尝试使用集团DinamicX的DSL&#xff0c;通过下发DSL模板&#xff0c;实现Flutter端的动态化模板渲染。我们解决了性能方面的问题后&#xff0c;又面临了一个新的挑战——渲染一致性。我们该如何在不降低渲染性能的前提下&#xff0c…

数据科学产业中哪些架构最热门?本文为你盘点了 5 款!

作者 | Sai Krishna译者 | 火火酱&#xff0c;责编 | Carol封图 | CSDN 付费下载自视觉中国地球上的数据量每分每秒都在增加&#xff0c;海量的数据源源不断地从四面八方涌入各种机构组织&#xff0c;而这些数据最终或许会成为能够指引我们做出战略决策的宝贵财富。这就是数据科…

面向云原生的混沌工程工具-ChaosBlade

作者 | 肖长军&#xff08;穹谷&#xff09;阿里云智能事业群技术专家 导读&#xff1a;随着云原生系统的演进&#xff0c;如何保障系统的稳定性受到很大的挑战&#xff0c;混沌工程通过反脆弱思想&#xff0c;对系统注入故障&#xff0c;提前发现系统问题&#xff0c;提升系…

centOS docker容器的安装

文章目录一、docker安装步骤1.卸载旧版本2.安装依赖3.添加镜像源4.查看仓库中的所有docker版本5.安装docker6.启动docker7.设置开机自启动docker8.查看docker是否安装成功9.卸载docker一、docker安装步骤 提示&#xff1a;安装之前可以使用命令&#xff1a;yum check-update检查…

泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?

大多数互联网的从业者都有一个梦想&#xff1a;进大厂。因为不仅可以享受较好的福利待遇&#xff0c;也能与更优秀的人一起共事&#xff0c;获得更专业、更快速的成长。最近经常有朋友提及想要入门编程学习&#xff0c;该如何学习&#xff1f;关于编程学习&#xff0c;各种语言…

哪种人是软件设计中的稀缺型人才?

阿里妹导读&#xff1a;好的系统架构离不开好的接口设计&#xff0c;因此&#xff0c;真正懂接口设计的人往往是软件设计队伍中的稀缺型人才。 为什么在接口制定标准中说&#xff1a;一流的企业做标准&#xff0c;二流的企业做品牌&#xff0c;三流的企业做产品&#xff1f;依赖…

快速Ubuntu的配置(以ubuntu 20.04桌面版为例)

文章目录一、&#x1f496;更换镜像源二、&#x1f496;安装VMware Tools工具三、&#x1f496;安装Google浏览器四、&#x1f496;安装搜狗输入法五、&#x1f496;安装C/C开发工具Clion&#x1f340;1.安装编译环境&#x1f340;2.安装开发环境一、&#x1f496;更换镜像源 …

阿里工程师太凶残了,竟把服务器泡在“水里”!

万众瞩目的第11个双11要来了&#xff01;这次天猫说要帮大家省500亿&#xff0c;身边加购物车、组队盖楼的同学数不胜数&#xff0c;热闹非凡。 但在阿里&#xff0c;有一位低调的“高冷男”&#xff0c;丝毫不为红红火火的双11所动&#xff0c;依然稳如磐石、淡定自若。 他的…

“我今年 31 岁,工作 7 年,明年退休...”

凌晨 1:30 的北京&#xff0c;商务楼静静地伫立着&#xff0c;街道上的车水马龙&#xff0c;慢慢地停歇了&#xff0c;只有他的工作台灯还没有休息&#xff0c;台灯忽明忽暗地坚持着。凌晨 2:00 的闹钟忍不住提醒他&#xff0c;电脑也偷偷跳出窗口&#xff1a;“主人&#xff0…

据说这是双11前互联网人的一天~

双11前&#xff0c;据说互联网人的一天是这样度过.... 6段故事&#xff0c;6个黑话关键词&#xff0c;生动刻画了双11前互联网人的一天&#xff01; 上午9点&#xff0c;运营找老板汇报双11方案。 运营说&#xff1a;老板&#xff0c;本次营销方案你看需要一些预算资源支持&a…

快速入门docker容器

文章目录&#x1f332;1.拉取一个镜像&#x1f332;2. 在docker里启动一个镜像&#x1f332;3.查看所有的镜像列表&#x1f332;4.删除镜像&#x1f332;5.删除全部image镜像&#x1f332;6.运行tomcat&#x1f332;7.删除所有未运行的容器&#x1f332;8.以守护态运行容器&…

不会玩游戏的程序员不是好作家,《深入理解Java虚拟机》周志明来了!

嘉宾&#xff1a;周志明、杨福川采访、撰文&#xff1a;Satoh_AI这次采访起源来自于我和豆瓣的一位读者有同样的好奇心&#xff0c;为什么网上搜不到周志明老师的更多信息&#xff1f;为什么“80后玩家”可以把本本书都维持在9.0分左右&#xff1f;他的“社恐”到底有多严重?所…

当手机淘宝遇见折叠屏,让购物更随心

华为 5G 新品发布会上&#xff0c;Mate X 正式亮相&#xff0c;淘宝也作为重点展示应用出现在发布会的 PPT 上&#xff0c;同时也成为折叠屏生态联盟应用矩阵的第一位。 现场华为折叠屏上的淘宝多任务演示 伴随手淘技术团队对华为折叠屏适配工作的展开。半年前还只是概念方案的…