背景

闲鱼同城作为闲鱼本地生活的主战场,维护闲鱼基本盘闲置物品的同时,还针对闲置时间闲置空间场景进行相关的孵化。

于买家而言:淘到经济实惠的闲置物品(二手数码),打发闲置时间(兼职,服务)去挣钱。于卖家而言:闲置物品(二手数码)卖钱,闲置空间(二手房租卖)换钱。

闲置时间(兼职)和闲置空间(租房)区别于同城传统的闲置物品,闲置物品为传统的C2C的商品,也就是买卖双方均为C端的用户。但是对于兼职、租房等业务来说,需要供应商入驻提供供给。因此一旦涉及到第三方提供的供给,就不得不面临以下问题:

  • 随着业务的不断发展,必将有越来越多的供应商入驻。为了能让供应商快速接入,除了必备的接入文档之外在技术侧应该能有一套动态响应机制,防止在供应商接入的过程中被问题频繁的打断(双方数量对不齐、同步失败原因等)。

  • 每个供应商的供给质量和技术水平存在差异,如何控制好供给质量的同时保证服务的稳定性成为另一大关键因素。

技术方案

整体架构

整体架构设计会复用中台的一些基础能力,比如用户、商品、交易等。抽象出三个领域,商家域、审核域和独立业务域(每个业务可以单独划分)。安全生产层面,为了保证系统的稳定性,围绕限流(高并发下限流重试)+ 监控(对异常的状态出对应的报警)+ 数据安全(重试下情况下保证幂等性)展开。

数据对账

注:

  • 审核:复用了审核中心的能力(机审+人审)。机审:预置过滤规则,不满足过滤规则的判定为审核失败。

  • 开放接口能力:提供查询商品审核、校验操作日志。

异常回调

  1. 收到同步消息后会对数据进行校验,包括不限于数据字段合规性校验(长度、枚举值等)、夹带违禁词、状态更新异常(已经下架的宝贝执行下架动作)等。

  2. 针对上述初审通过,会进入审核中心二次审核,审核主要内容为语义违规。

两种回调场景都复用了异常流转的能力如下图:

通过catch(LocalBizException e)的方式,将e.getCode()**和e.getMessage()**封装为response进行返回,不需要对不同的异常进行单独catch让异常逻辑在业务回调侧闭环。供应商获取到错误信息后根据错误信息修改信息进行二次同步。

定时播报

采集状态变更日志表业务商品表将对应的一个小时内发生状态转化的商品数量(上架、下架、编辑、审核不通过等)最后以钉钉消息播报到钉钉群中(按照钉钉的机器人api)。兼职中主要关心的指标项为上下架成功与否、是否审核失败等指标,兼职播报架构如下图所示:

开放接口

与此同时开放的接口能力提供查询商品审核、校验操作日志。接口定义如下,提供时间范围、同步id、类型、分页参数等信息。

注:涉及图中状态日志表和商品表的插入部分参见下一章节“稳定性”。

稳定性(安全生产)

稳定性治理一直是一个系统绕不开的话题,在这个场景中涉及到第三方之间的交互,谁都无法确定对方是如何调用己方的系统。这种情况下,稳定性的重要性更加不言而喻。

流量控制

在数据同步时,将请求打入队列对于第三方的同步请求使用异步返回。打入队列的好处就是可以利用队列实现流量控制,削峰填谷。限流这部分依赖于阿里开源的Sentinel框架,网上对于Sentinel的分析很多这里不多加赘述。

数据一致性保证

由于存在重试操作,所以必然需要在重试过程中保证数据的正确性。

  • 状态变更日志表:数据库采用的是nosql的数据库,这边会根据参数生成唯一id,进行覆盖插入保证数据的唯一性。

  • 业务商品表:采用先查后插的方式,同时利用分布式锁+itemId唯一键冲突保证数据的唯一性。

拿兼职插入一致性举个栗子:ic表:底层商品表,包括一些商品的基本信息。岗位表:扩展信息的存储,工作地点、工作时间等。当一条兼职同步消息来了之后这边会涉及到两张表的维护。这里采用的方式是以下架的方式插入ic表,如果业务表成功后去更新上架ic表中状态(如下图)。

异常监控告警

攻击流量通常会伪装成正常流量进入。在这种情况下,系统会一直无法消费此异常消息,所以这边设置一个消费重试阈值,如果达到上限后对消息进行丢弃,同时进行系统告警(有的场景是需要强一致性保障,此时报警后需人工接入排查)。

兼职业务的告警场景包括:

  1. 限流触发报警(持续时间超过10分钟):限流期间被限制的消息业务会主动进行重试,控制重试n次整体持续时间不会超过10分钟,如果限流超过10分钟认定为异常情况会进行告警。(通常来说是供应商大批量上下架岗位导致,未通知前提下认定为他们系统问题)

  2. 状态更新失败(持续时间超过5分钟,每分钟数量大于n):小批量的更新失败可以理解为是垃圾数据,持续时间过于长可以理解为供应商系统异常。

总结和展望

本章节主要介绍了闲鱼同城业务在“闲置时间”和"闲置空间“场景下针对与第三方系统对接的过程中开发资源和稳定性问题展开。通过上述方案也解决了在开篇提到的2个问题:

  • 动态响应机制:商品同步时通过实时回调和异步回调的方式将商品的每个异常状态返回给供应商;提供了小时时间维度的统计播报,最后以钉钉消息通知至钉钉群中,如若发现异常也可根据开放接口去查询商品历史变更状态。这样就能很大程度上解放开发,不会因为对账的问题被频繁的打断。

  • 稳定性治理:通过接口限流保证异常流量打满线程池进而影响系统;通过接口幂等保证数据的安全唯一性;通过监控(搭配合适的报警规则)去监控异常场景,如若出现问题人为介入。

随着业务越来越复杂,对应的独立业务域也将会越来越多,在独立业务域上的开发精力也会越来越多。能否根据大量复杂业务场景的输入找到共同点抽象出较为理想的架构将是努力的目标。

  • 抽象出独立业务域中的共同点,推动业务完善路径:完善租房的订单和履约路径,统一抽取出订单域和履约域。

  • 针对不同业务的不同商家统一商家管理平台,现阶段每个业务都有自己的一套接入方式。

闲鱼同城第三方对接架构设计相关推荐

  1. 闲鱼异地多活架构设计与实现

    背景 首页和搜索一直以来都是闲鱼导购的主阵地,为了保证高可用业务上做了很多保护方案.但是随着原有地域的IDC日渐趋于饱和,一些更深层次的问题开始暴露出来: a)架构不具备扩展性.当服务量增大,单个ID ...

  2. 第三方支付架构设计之—帐户体系的理解

    第三方支付架构设计之-帐户体系 一,      什么是第三方支付? 什么是第三方支付?相信很多人对这个名字很熟悉,不管是从各种媒体等都经常听到,可以说是耳熟能熟.但,如果非得给这个名词总结出一个概念, ...

  3. GMTC2019|闲鱼-基于Flutter的架构演进与创新

    2012年应届毕业加入阿里巴巴,主导了闲鱼基于Flutter的新混合架构,同时推进了Flutter在闲鱼各业务线的落地.未来将持续关注终端技术的演变及趋势 Flutter的优势与挑战 Flutter是 ...

  4. 闲鱼Flutter图片框架架构演进(超详细)

    那些年 早在闲鱼使用Flutter之初,图片就是我们核心关注和重点优化的功能.图片展示体验的好坏会对闲鱼用户的使用体验产生巨大影响.你们是否也曾遇到过: 图片加载内存占用过多? 使用Flutter以后 ...

  5. 闲鱼正在悄悄放弃Flutter吗?

    本文转载自 InfoQ 闲鱼在 2017 年引入 Flutter,当时的 Flutter 还远未成熟,行业内也没有把 Flutter 放入已有工程体系进行开发的先例. 之后这支不到 15 人的闲鱼团队 ...

  6. 闲鱼|支撑千万日活的交易链路架构如何设计?

    点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 前言 双十一刚刚结束,成交额2684亿震惊全世界,每秒订单峰值达54.4W笔.在闲 ...

  7. 一个多业务、多状态、多操作的交易链路?闲鱼架构这样演进

    前言 双十一刚刚结束,成交额2684亿震惊全世界,每秒订单峰值达54.4W笔.在闲鱼2000万DAU,交易数额同样增长迅速的今天,我们如何保障交易链路的稳定与快速支撑业务?这篇文章从客户端开发的角度, ...

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

    阿里妹导读:闲鱼品牌创立于14年阿里的某个茶水间,从0开始到现在千万DAU,5年时间里闲鱼见证了闲置物品从线下到线上交易的转移.而线上交易的繁荣,则需要业务架构做相应的调整.演进才能支撑业务的快速发展 ...

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

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

最新文章

  1. 入职五年回顾(十六) 2013年11月
  2. Dart的HTTP请求和响应(1)
  3. python 查找文件名包含指定字符串
  4. linux ospf 命令,Linux运维知识之linux下使用quagga配置ospf协议
  5. CEC tile configuration of Launchpad shell is returned by http request
  6. 布袋除尘器过滤风速多少_布袋除尘器过滤风速的确定及启动与停机的讲解
  7. html5d调用百度语音,易语言调用百度语音平台实现文字转换语音功能的代码
  8. tf.get_variable与tf.variable_scope
  9. javascript数组特性
  10. ORACLE DELETE数据慢的案例
  11. 希捷移动硬盘系统提示需要格式化才能用,怎么办
  12. 2020年北京给进口摩托车(川崎)交税、验车、上牌照流程
  13. 转载《蜗居》评论 自文学城
  14. Fortran批量输出ctl文件格式
  15. R平方值python实现
  16. 竞赛党关注!2021年五大学科竞赛考试时间,附985高校竞赛要求
  17. 创客学院知识巩固-01C语言回顾
  18. 什么叫多头,什么叫空头?
  19. 基于STM32的PS2游戏手柄智能小车
  20. Windows10 专业版jdk-8u271安装详细过程

热门文章

  1. 嵌入式和机械哪个好?机械转嵌入式好转吗?
  2. php pdo 判断数据条数据,PDO一次查询一行数据
  3. 【Java】数据结构---二叉树 详解
  4. HDU2642(二维的树状数组)
  5. C语言求cidr,求诸位大师解答一个关于CIDR地址划分的问题
  6. 三维几何基础大合集(三维点积叉积、点线面、凸包)《计算几何全家桶(三)》
  7. oracle scott用户
  8. linux音频驱动dma数据,Linux音频驱动简述
  9. 下图为双总线结构机器的数据通路_图像采集卡常见的三种总线结构
  10. 19.04.27--作业 打字游戏