闲鱼如何一招保证推荐流稳如泰山

简介: 风雨不动安如山

背景

近几年互联网的快速发展中,互联网业务发展越来越复杂,业务也被拆分得越来越细,阿里内部业务也发生着翻天覆地的变化,从最初的单体应用,到后面的分布式集群,再到最近几年大中台小前台的业务形态,作为后端开发,依赖的服务方越来越多,同时依赖服务方的故障因素也会越来越多的会影响到闲鱼的上层业务的稳定。例如在闲鱼主推商品流的业务场景中,商品中台数据库的抖动会造成主推商品流的卡顿或者页面显示空窗现象,个性化算法中台向量集群的扩容也会造成推荐内容延时被拖到非常长,后面还有可能依赖其他的业务中台,作为上层业务如何保证依赖的中台越来越多的情况下,还能保证服务的稳定性运行呢?

业界主流溜一遍

根据日常解决问题的经验,不能直接解决业务问题本身,可以折中解决业务问题也是一个不错的办法。上述业务问题中,当业务出现问题的时候,可以折中提前置备好所需的业务数据返回给业务,也是一个不错的办法。在闲鱼主推商品流的业务场景中,对可靠性要求非常高,因为推荐商品失败,用户看到推荐页出现空窗,业务所需的数据量大概是5页的推荐商品数据流,大概为3M左右。在实际解决问题中,笔者从业务所需的数据量级、可靠性要求级别等角度调研了业界一些通用解决办法。
image.png
为了给用户良好的业务体验,笔者主要使用服务端数据冗余、客户端数据冗余、熔断机制等方法,来确保用户对闲鱼App流畅的业务体验。笔者主要服务端数据冗余聊聊本地缓存,根据笔者在阿里断网演练的经验,断网演练时,某个区域的所有服务不可用,所以笔者在技术选型的时候没有考虑分布式缓存Redis,Memcache之类等。目前就业界本地缓存库有Guava、Caffeine、Ehcache、Cache2K、ConcurrentHashMap、Varnish、JackRabbit等,笔者选取了几个性能比较优越的缓存库比较,下面笔者从功能上、性能上、易用性、集群能力、可视化报表上等分别比较。
image.png
笔者对照目前业务需求对比了上述四个组件,在定时失效策略能力上,除了ConcurrentHashMap都是使用定时失效能力,并且三个组件时间复杂度都是O(n)。在集群能力上,Ehcache依赖自身网络协议保证集群数据一致性,不能使用现有集团内部组件保证数据一致性。在本地缓存能力上,Caffeine的写能力[1]优与Guava。在组件通用性上,Guava组件更加通用。最终笔者选用了Guava组件作为本地缓存组件,因为Guava 组件更加通用,并且很方便与阿里内部中间件集成配合使用。在集群数据同步能力,通过配置中心中间件实现数据同步,在可视化报表能力,通过定时任务打印日志,日志采集系统采集展示数据报表。接下来笔者介绍如何添加上述三种能力和优化Guava本地缓存能力。

我的集群Cache组件

Guava Caching提供了定时失效、最后访问失效、最后写入失效策略等能力,笔者主要使用了定时失效能力,在首次写入Key后,指定时间过后,该Key会失效,业务获取该Key时,会调用reload方法重新同步加载该Key。如果使用invalid方法使该Key无效,业务并发再次获取该Key,多线程加载该Key时,只有一个业务线程调用load方法加载该Key,其他线程等待该Key,加载完成后重新进入指定时间后流程。笔者在原来Guava Cache本地缓存能力上结合Spring自动注入能力,进行工程化,添加了业务所需的如下三种能力

  • 当key失效,本地缓存reload异步加载
  • 失效本地缓存key,整个集群机器上key失效能力
  • 定时上报本机Cache内各个Key在本地缓存大小

根据上述业务能力,整体流程图如下所示
image.png集群本机Cache组件的整体结构类图如下:
image.png

  • AbstractCacheLoader重写父类CacheLoader的reload方法,添加异步加载能力
  • LocalCacheManager管理所有实现AbstractCacheConfig的子类,并上报各自本地缓存大小。
  • 实现AbstractCacheConfig的业务配置子类,例如CurrentCacheConfig等,调用invalidate方法时,会通知集群本机Cache中Key消息。

业务同学在使用集群本机Cache组件时,只需要继承AbstractCacheConfig抽象类,声明为Bean,即用集群本机Cache组件,业务同学无需关心集群环境问题等。相比Guava cache组件,提供了集群本机Cache Key失效能力,以及对Key集中管理和监控,减少了单独使用Guava cache带来内存无法管理的问题。
接下来笔者介绍使用集群本机Cache组件能力的典型案例: 自动置备兜底组件。

典型栗子

自动置备兜底组件

兜底是在服务遇到外部依赖异常(超时、不可用、数据异常等),可能导致服务无可以返回的正常数据时,服务通过使用兜底数据提供服务的一种降级行为。自动置备兜底组件使用集群本机cache的本机缓存能力和集群失效能力,很方便完成兜底数据置备。在闲鱼的业务场景中使用兜底置备组件的场景非常多,例如闲鱼主推商品流等。
兜底自动置备组件原理如下:
image.png

  • 使用定时任务scheduleX2定时触发服务集群中的一台服务器,执行兜底置备,更新tair缓存内容,失效本地缓存,即失效集群server的本地缓存。
  • 当业务请求获取key时,会获取tair中最新内容,并缓存到本地,再次请求,直接本地获取。

详细业务请求流程图如下所示
image.png自动兜底组件已经在闲鱼的多个业务场景得到使用,在断网演练情况下,服务端RT延时和成功率有了明显的提升,闲鱼主要业务场景的提升效果如下:
image.png

展望

在集群本机cache组件使用过程中也发现一些问题,例如有时候集群本机cache缓存错误的配置,需要重启集群或者等待key失效,所以需要集群本机cache组件web管理功能。在集群本机cache组件推广中,发现有些业务场景的缓存key对应的缓存对象比较大,或者缓存key的数量比较多,后期按照key使用频率等级,考虑对于长期不使用的key存储到本机磁盘上,让业务方不关心缓存Key过大可能造成的问题。

作者:闲鱼技术——习武

原文链接

本文为阿里云原创内容,未经允许不得转载

 

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

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

相关文章

电商直播平台如何借助容器与中间件实现研发效率提升100%?

简介: 经过实际场景验证及用户的综合评估,电商直播平台借助全面的云原生容器化能力和中间件产品能力,大幅提升开发部署运维效率达50%~100%,极大地提升了用户体验,为业务持续发展打下了坚实的基础。 前言 直播带货是近…

在游戏运营行业,Serverless 如何解决数据采集分析痛点?

简介: 众所周知,游戏行业在当今的互联网行业中算是一棵常青树。在疫情之前的 2019 年,中国游戏市场营收规模约 2884.8 亿元,同比增长 17.1%。2020 年因为疫情,游戏行业更是突飞猛进。玩游戏本就是中国网民最普遍的娱乐…

字节大战腾讯元宇宙;Docker 自己定制镜像;VMware 云桌面助力秦皇岛市第一医院;微软开源 Cloud Katana;...

NEWS本周新闻回顾字节大战腾讯元宇宙:布局社交产品Pixsoul,上线游戏“重启世界”字节投资的代码乾坤,已于近日正式上线了元宇宙游戏《重启世界》。就在两个月前,被称为“元宇宙第一股”的Roblox登陆国内,由腾讯改名为《…

从 RxJS 到 Flink:如何处理数据流?

简介: 前端开发的本质是什么?响应式编程相对于 MVVM 或者 Redux 有什么优点?响应式编程的思想是否可以应用到后端开发中?本文以一个新闻网站为例,阐述在前端开发中如何使用响应式编程思想;再以计算电商平台…

Spring RSocket:基于服务注册发现的 RSocket 负载均衡

简介: RSocket 作为通讯协议的后起之秀,核心是二进制异步化消息通讯,是否也能和 Spring Cloud 技术栈结合,实现服务注册发现、客户端负载均衡,从而更高效地实现面向服务的架构?这篇文章我们就讨论一下 Spri…

双非院校计算机系毕业的学生能进大厂吗?

谈到大厂,我们常常会主动匹配与之对应的高学历。其实不论是大厂还是小公司,都是会筛简历的,这个毋庸置疑。从大厂招聘的结果上看,高学历人才的数量占据大头,而那些成功进入BAT、网易等大厂的专科生、二本三本学生&…

Python - 深夜数据结构与算法之 Heap Binary Heap

目录 一.引言 二.堆与二叉堆介绍 1.Heap 堆 2.Binary Heap 二叉堆 3.HeapifyUp 添加节点 4.HeapifyDown 删除节点 5.Heap 时间复杂度 6.Insert & Delete 代码实现 三.经典算法实战 1.Smallest-K [M14] 2.Sliding-Window-Max [239] 3.Ugly-Number [264] 4.Top-…

如何 0 改造,让单体/微服务应用成为 Serverless Application

简介: 随着 2013 年以 Docker 为代表的容器技术、CNCF 基金会以及 K8s 的发展等,云原生开始被广大开发者所熟知。云原生时代之前还有两个阶段:一是自建 IDC 机房,二是简单地把原有的应用搬迁到云上。自建 IDC 机房很难获得高可用、…

一文了解阿里一站式图计算平台GraphScope

简介: 随着大数据的爆发,图数据的应用规模不断增长,现有的图计算系统仍然存在一定的局限。阿里巴巴拥有全球最大的商品知识图谱,在丰富的图场景和真实应用的驱动下,阿里巴巴达摩院智能计算实验室研发并开源了全球首个一…

c++如何禁用指定的键盘布局_Karabiner Elements for Mac 键盘键位自定义改键工具

文章来源于:风云社区Karabiner Elements for Mac 12.5Karabiner Elements(早期是Karabiner,更早是KeyRemap4MacBook)是功能强大且稳定的macOS键盘定制器。上【风云社区】,搜索软件名字,即可查看下载特征&am…

Docker Desktop 向大公司宣告收费,网友大呼:是时候弃用了!

作者 | 苏宓 出品 | CSDN(ID:CSDNnews) 在容器引擎 Docker 诞生的 8 年间,其与开源的容器编排 Kubernetes 共同推动容器技术在云计算领域的应用,也让自身在全球范围内受到了广泛的关注。可以说,做过云计算开…

如何接地气地接入微前端?

简介: 微前端带来明显好处的同时,也面临着痛点。对于已有站点,如何在老的技术栈基础上接入一个微前端?需要哪些通 一 、前言 微前端,这个概念已经在国内不止一次的登上各大热门话题,它所解决的问题也很明显…

东南亚再造天猫 Lazada品牌商城LazMall举办第二届品牌未来论坛

9月1日,东南亚领先的旗舰电商平台Lazada在新加坡滨海湾金沙会展中心举办了2021 LazMall Brands Future Forum年度品牌未来论坛(以下简称“BFF”)。该论坛以“奔向未来:东南亚的数字商务时代”为主题,在庆祝Lazada品牌商…

高可用的本质

简介: 无论是一个域,一个BG,还是一个站点,虽然范围有大有小,对象有所不同,但其高可用的理念都是相通的,今天将自己对高可用的一点点思考以及总结的【nPRT公式】分享给大家。 我是乐羊&#xff0…

技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch

简介: 关于 Android 热修复方案——DexPatch 的介绍与使用说明 方案介绍 为了解决 Native 模块上线后的问题,mPaaS 提供了热修复功能,实现不发布客户端 apk 场景下的热修复。目前 Android 端热修复主要包括 andfix 和 dexpatch,考…

李飞飞:阿里云数据库已做好全面服务政企市场的准备

“政企市场是检验云数据库产品竞争力的黄金标准。”9月3日,阿里云智能数据库事业部总负责人李飞飞在北京举办的媒体沟通会上表示,阿里云已经做好全面服务政企数据库市场的准备,并已成功助力多家大型组织实现核心系统对传统商业数据库的替换。…

技术改变生活 浅谈阿里云混合云的探索与实践

简介: 也许你并不了解“阿里云混合云”,甚至没有听说过“混合云”,然而它却在幕后“默默”改变着人们的生活。 也许你并不了解“阿里云混合云”,甚至没有听说过“混合云”,然而它却在幕后“默默”改变着人们的生活。大…

公网访问_一文读懂阿里云访问公网的实现方式

NAT网关与EIP作为公有云服务商,提供互联网的访问和接入是必备的条件,阿里云也不例外。和AWS类似,阿里云访问公网的组件为NAT网关和弹性IP,对于刚刚接触云的童鞋,今天这篇文章带你彻底了解这两个组件的使用场景。弹性IP…

阿里巴巴云原生应用安全防护实践与 OpenKruise 的新领域

简介: 得益于 Kubernetes 面向终态的理念,云原生架构天然具备高度自动化的能力。然而,面向终态的自动化是一把“双刃剑”,它既为应用带来了声明式的部署能力,同时也潜在地会将一些误操作行为被终态化放大。 因此&#…

什么是微内核架构设计?

简介: 作为一名Java程序员,相信同学们都听说过微内核架构设计,也有自己的理解。那么微内核是如何被提出来的?微内核在操作系统内核的设计中又有什么作用?本文从插件化(Plug-in)架构的角度来诠释微内核架构设计&#xf…