说在上面
在尼恩的兼顾(50+)读者社群中,经常碰到一个 非常、可扩非常高频的展高致性友谊卡优质课一个面试题,但是数据设计实践很不好回答,类似如下:
最近,咸鱼系统这段时间,优惠好几个小伙伴都和尼恩来反馈:在笔试过程中,兼顾遇到了这样的可扩真题。
其实,展高致性答案不是数据设计实践一成不变的。
高并发、咸鱼系统高性能、优惠高扩充的兼顾案例,千千万万,可扩尼恩仍然结合行业案例,展高致性梳理一个最为全面、最为系统化的答案,
这里有一个新的行业案例《兼顾可扩充、高并发与数据一致性:闲鱼鱼优惠系统设计实践》,尼恩从 面试维度,对这个方案,进行二次构建和梳理,现在把其做为参考答案,收入俺们的《》 V67版本
供旁边的小伙伴参考,大家一定好好瞧瞧这个生产级别的答案。
注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请关注本公众号 【技术自由圈】获取,暗号:领电子书。
本文原文:《兼顾可扩充、高并发与数据一致性:咸鱼让利系统设计实践》 原始方案的作者是淘宝的资深开发工程师泊垚 ,原文来自于 公众号,闲鱼技术(ID:XYtech_Alibaba)。
下面的友谊卡优质课内容,是尼恩是结合自己的3立交构笔记,以及尼恩的3立交构知识体系(3立交构宇宙),在原文的基础上,做的二次构架剖析和创作。
本文目录
- 说在上面
- 优惠券业务的场景剖析
- 优惠券业务主要使用场景剖析
- 优惠券场景的业务迭代
- 优惠券的迭代剖析:
- 闲鱼的个性化让利场景
- 海量用户场景问题与挑战
- 闲鱼的个性化让利中台的技术变迁
- 阶段1:分解让利的基本要素,实现让利的基本抒发和估算
- 分解让利的基本要素
- 实现让利的基本抒发和估算的三个步骤
- 闲鱼的让利中台的构架1.0版本
- 阶段2:对让利对象的判断过程进行具象和加速
- 闲鱼的让利中台的构架1.0版本存在两个问题:
- 对让利对象的估算进行抽取和前馈
- 闲鱼的让利中台的构架2.0版本
- 阶段3:在让利对象制备的过程中,通过离线+实时的形式同步数据,保障数据一致性
- 闲鱼的让利中台的构架2.0版本的问题
- 闲鱼的让利中台的构架3.0版本
- 闲鱼数据一致性方案的普适性
- 闲鱼团队结语
- 结合 闲鱼的方案,回顾后面的面试题:
- 技术自由实现路径
- 免费发放11个技术新约 PDF
优惠券业务的场景剖析
优惠券业务,在大量的场景中,会有使用。
在我们日常生活中,常常会碰到下边这样的场景:优惠券业务是一种促销形式,通常由店家向消费者提供的折扣或则特惠让利,在推广和销售产品时具有重要的作用。
优惠券业务主要使用场景剖析
场景1:电商平台
在电商平台上,商家可以通过发布优惠券来吸引更多用户选购商品,从而提升销售额。比如,在双十二或则618等大促销活动中,商家会发布各类优惠券,包括满减券、折扣券、免邮券等等,以达到促销的目的。
场景2:实体店面
实体店面也可以通过领取优惠券来吸引更多客户到店消费。
比如,在商场或则饭店中,可以提供满减券、折扣券、赠品券等等,让消费者享受到更多的便宜,从而降低消费频次和消费金额。
场景3:O2O平台
在O2O平台中,商家可以通过领取优惠券来吸引用户使用其服务。
比如,在订餐平台上,商家可以发布满减券、新用户专属券等等,以吸引更多的用户尝试其服务;在打车平台上,也可以发布优惠券来吸引用户使用其服务。
场景4:品牌推广
品牌推广也是优惠券业务的一个重要场景。
比如,在新款上市或则品牌促销活动中,可以通过领取折扣券或则礼品券等等,来吸引更多用户尝试品牌产品或则服务,提高品牌知名度和美誉度。
总之,优惠券业务在各个行业中都有广泛的应用,可以帮助店家提升销售额、增加用户黏性和忠诚度,同时也能为消费者提供更多的便宜和福利。
优惠券场景的业务迭代
如何提高优惠券的引流能力。答案是:设计一个个性化的优惠券系统,为不同的粉丝群体,设置不同的优惠券价钱。
为了设计一个个性化的优惠券系统,闲鱼团队须要考虑以下几个方面:
粉丝群体分类
首先,需要将粉丝群体进行分类,比如根据岁数、性别、地域、消费习惯等等进行分类。这样可以更好地理解不同群体的需求和行为特点,有针对性地推出不同的优惠券。
优惠券类型
其次,需要确定不同的优惠券类型,比如满减券、折扣券、免单券等等。根据不同的群体需求,设置不同的让利力度和使用条件,例如对于高消费群体,可以设置更高额度的满减券或则更高折扣力度的折扣券。
优惠券价钱
最后,需要考虑不同粉丝群体的经济实力和消费能力,合理设置优惠券价钱。
例如,对于大学生群体,可以设置较低的价钱,以吸引她们尝试新产品或服务;而对于高收入群体,则可以设置更高的价钱,以提高产品或服务的价值感。
优惠券的迭代剖析:
除此之外,可以通过数据剖析的方法,不断优化和调整优惠券系统,以达到更好的促销疗效和用户满意度。
同时,还须要注意保障优惠券系统的安全性和有效性,例如设置使用年限、使用限制等举措闲鱼如何增加粉丝量,避免滥用和恶意操作。
闲鱼的个性化让利场景
闲鱼是一款二手交易平台APP,主要面向年青用户群体。以下是淘宝APP的用户剖析:
年龄分布
闲鱼APP的主要用户群体年纪在18-35岁之间,其中以25-30岁的用户占比最高。这个年龄段的用户更重视物品的性价比和实用性,同时也更擅于使用互联网和联通设备进行购物。
性别分布
相比于其他二手交易平台APP,闲鱼APP的用户男女比列较为接近,女性用户占比略高。这也反映出淘宝APP对男性用户的吸引力较大,可能与其简单易用、社区气氛浓郁等特征有关。
地域分布
闲鱼APP的用户主要集中在一二线城市,尤以广州、上海、北京等城市为主。这些城市的用户更重视生活品质和消费体验,对于二手商品的需求也更为广泛和多元化。
用户行为特点
闲鱼APP的用户一般具有以下几个行为特点:爱好交友、追求个性化、注重环保节能等等。他们除了使用淘宝APP进行二手交易,还会通过淘宝社区分享生活经验、交流兴趣爱好等,形成了一种类似于社交媒体的共享气氛。
用户需求和偏好
闲鱼APP的用户需求和偏好主要集中在以下几个方面:时尚时尚、个性化订制、品质保障等。他们一般会在淘宝APP上找寻一些奇特而实用的物品,包括衣服、配饰、家居用具等等,同时也关注买家的信誉度和商品质量。
总淘宝APP的用户具有年青、多样化、社交化等特性,商家可以按照这种特性进行针对性的营销策略和产品服务优化,提高用户满意度和购买转化率。
在淘宝上,针对淘宝交易中的 粉丝群体,提供了 专门的 优 策略,针对 粉丝订购和粉丝回购的优惠促销场景,提供了一种定向的/个性化的优惠价:
虽然淘宝没有使用优惠券的概念,使用的让利价位。但是和 个性化的优惠券,本质是一样的。
所以,闲鱼的让利中台的构架,对你们做 个性化的优惠券中台的构架,具有巨大的借鉴的构架。
尼恩提示:技术自由圈3高社群的宗旨:聚焦研究 3高架构,研究成熟案例,研究生产案例, 为你们做构架提供方案支撑。
海量用户场景问题与挑战
闲鱼APP的DAU,注册用户数2.5个亿,日活跃用户数(DAU)为2900万左右。
按照尼恩的3高架构理论,吞吐量峰值起码在30Wqps+。
这么大的 海量用户场景, 在 优惠券估算、优惠券展示的过程中,存在巨大的技术困局:
闲鱼的个性化让利中台的技术变迁
闲鱼的个性化优中台的技术变迁, 分为三个阶段来实现:
阶段1:分解让利的基本要素,实现让利的基本抒发和估算分解让利的基本要素
一个让利主要描述了“谁对那个商品享受哪些让利”,拆解为三个要素就是:
【优惠对象】+【优惠商品】+【优惠价钱】。
在粉丝让利的场景下,优惠对象是指买家的粉丝、卖家的已购粉丝等,
优惠对象 如何储存呢?
一个买家的粉丝,可以被描述为“卖家ID_all_fans”的符号
一个买家的已购用户,可以被描述为“卖家ID_buy_fans” 的符号 。
这样淘宝团队可以得到一个让利规则的描述大致如下:
【卖家A_all_fans】+【商品1234】+【18.88元】,
对应的业务语义是:
卖家A的所有粉丝,对于(卖家A的)商品1234,可以以18.88元的让利价钱。
实现让利的基本抒发和估算的三个步骤
以这条让利为例,当卖家B访问商品1234时,闲鱼团队会执行这样的一个过程:
第一步:根据商品,查询让利规则
查询商品1234上的让利规则,发现一条【卖家A_all_fans】+【商品1234】+【18.88元】的规则;
第二步:分析 优惠对象的语义
分析【卖家A_all_fans】表达的含意,表示的是店家A的全部粉丝可以享受让利;
第三步:根据规则的语义,计算当前用户的让利价钱
确定卖家B是否是店家A的粉丝,如果是,则以18.88元的价钱展示让利或则成交。
闲鱼的让利中台的构架1.0版本
为了实现了让利设置和估算的能力,闲鱼的让利中台的构架1.0版本,大致如下:
阶段2:对让利对象的判断过程进行具象和加速淘宝的让利中台的构架1.0版本存在两个问题:
优惠估算过程须要解析【优惠对象】这个符号背后所包含的业务语义,再由系统进行判别卖家是否符合条件,随着业务规则的升级,系统的会变的十分复杂,可扩展性差。
每一次让利查询,都须要访问用户的关注关系、购买关系,这整个查询过程十分长,性能低下,当面对大流量时,系统会深陷截瘫。
对让利对象的估算进行抽取和前馈
为了解决这两个问题,闲鱼希望让利估算过程不再须要理解【优惠对象】的语义,判定过程中也不要再去查询各个业务系统。
闲鱼团队发觉,优惠对象的判断过程都是在回答“用户是否属于某个群体”,于是,可以将这个关系进行具象,提前制备并储存上去。
常见的技术手段中,表达一个用户是否属于某个群体有两种实现:
一般情况下,第一种形式使用于群体较少可枚举的情况,第二种方案适用于群体较多的情况。在淘宝的实现中,使用了第二种方案。
具体的举措是, 抽取出一个新的 实体:人群 ,并且提早进行 异步估算。
闲鱼将用于描述让利对象的符号(例如“卖家A_all_fans”)作为人群的名称去定义一个人群。按照这个规则,平台为每位买家的不同分组各定义这样一个人群。
闲鱼定义了人群的概念,并提供了一种实现人群的技术方案,这个构架中,人群在同时充当了“协议”和“缓存”的作用。
人群和用户的关系,如何储存呢?
方案一:可以通过redis string 实现,设计一个类似:${ user_A} ${ crowd_B} 的key写入redis。
在查询时,查询 ${ user_A} ${ crowd_B} 这个key是否存在,就可以判断user_A是否属于crowd_B。
方案二:可以通过redis set 实现,设计一个类似 ${ crowd_B} 的key写入redis, 然后把 ${ user_A} 的用户加入到set 。
在查询时,查询 ${ crowd_B},是否在 ${ user_A} 的集合中,就可以判断user_A是否属于crowd_B。
当然,上面仅仅是参考的案例,闲鱼设计中须要依照数据特点进行优化。
如果读者有更好的方案,也可以来高并发社群,技术自由圈(原疯狂创客圈) 中交流。
闲鱼的让利中台的构架2.0版本
这时淘宝的得到的整体构架是这样的:
在里面的构架中,顺带缓存了一下让利数据
事实上,在淘宝基于中台的解决方案中,从一开始面临的就是这样的构架(实际中台的构架比这个会更复杂一些)。
如果尝试从头演化了这个系统,也得到这样的一个方案。
从一定程度来说,这也是构架的必然性.
具体来说,当我们从业务的可扩展性、系统的性能角度从头进行推演的时侯,我们发觉最终会回到类似的构架上来。
可以说,在特定的业务规模下,架构的演化有它历史的必然性。
阶段3:在让利对象制备的过程中,通过离线+实时的形式同步数据,保障数据一致性淘宝的让利中台的构架2.0版本的问题
在实际落地的过程中,如何将业务系统中的关注和订购关系同步到人群中,并保证数据的一致性。
人群的同步整体上分为两个主要部份:
这种结合的形式具有以下优点:
但上述的两个过程中,会出现两类问题:
闲鱼的让利中台的构架3.0版本
针对上述的两个问题,分别给出了以下两个解决方案:
通过上述两个解决方案,闲鱼实现了人群同步的最终一致性,最终实现的方法如图:
闲鱼数据一致性方案的普适性
这样的同步方案,对于搜索、推荐等大流量的导购场景,提供了充分的数据一致性保障。
绝大多数情况下,数据实时一致,对于小机率出现数据实时同步不一致,通过全量同步保障数据最终一致,满足导购场景的一致性要求。
此外,针对交易这样的要求强一致性但访问规模较小的场景,闲鱼团队通过下单前对人群同步的数据进行核实,保障数据的实时完全一致。
闲鱼团队结语
本文从三个部份介绍了让利的实现:
在让利的实现过程中,直接面临了一个迭代了多年的让利中台闲鱼如何增加粉丝量,需要淘宝团队通过同步人群数据的方法进行接入。可能一开始会困惑为何须要执行一个复杂、高成本且会引入数据一致性风险的同步过程。
但当淘宝团队从业务的可扩展性、系统的性能角度从头进行推演的时侯,闲鱼团队发觉最终会回到类似的构架上来。
可以说,在特定的业务规模下,架构的演化有它历史的必然性。
当然,也不是说这样的构架是适用于所有情况的,架构选型还是须要结合实际情况出发量身订制。
结合 闲鱼的方案,回顾后面的面试题:
以上的方案,可以作为你们的一个参考答案。后续尼恩会给你们结合行业案例,分析出更多,更加劲爆的答案。
当然,如果你们遇见这类高并发的笔试困局,可以找来尼恩的 社群交流。
技术自由实现路径
尼恩N篇硬核构架 文章 ,帮你实现 架构自由:
《》
《》
《》
《》
《》
《》
....... 更多构架文章,正在添加中
实现你的 响应式 自由:
《》
这是老版本 《Flux、Mono、Reactor 实战(史上最全)》
实现你的 spring cloud 自由:
《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》
实现你的 linux 自由:
《》
实现你的 网络 自由:
《TCP协议解读 (史上最全)》
《》
实现你的 分布式锁 自由:
《Redis分布式锁(图解 - 秒懂 - 史上最全)》
《Zookeeper 分布式锁 - 图解 - 秒懂》
实现你的 王者组件 自由:
《》
《》
《缓存之王:Caffeine 的使用(史上最全)》
《Java Agent 探针、字节码提高 ByteBuddy(史上最全)》
实现你的 面试题 自由:
免费发放11个技术新约 PDF