写点什么

闲鱼同城第三方对接架构设计

  • 2021-07-26
  • 本文字数:2312 字

    阅读完需:约 8 分钟

闲鱼同城第三方对接架构设计

背景

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


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


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


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

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

技术方案

整体架构

null

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

数据对账

null

注:

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

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

异常回调

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

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


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


null


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

定时播报

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


null

开放接口

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


null


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

稳定性(安全生产)


null


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

流量控制

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


null

数据一致性保证

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

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

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


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


null

异常监控告警

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


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

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

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

总结和展望

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

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

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

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

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

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


本文转载自:闲鱼技术(ID:XYtech_Alibaba)

原文链接:闲鱼同城第三方对接架构设计

2021-07-26 08:002078

评论

发布
暂无评论
发现更多内容

使用 Python 分析 Google Calender 日程

Roc

Python 总结 日历

2020全球首创币期权DAPP智能合约强势来袭,闪耀数字经济

极客编

数据与广告系列三:合约广告与与衍生的第三方广告数据监控

黄崇远@数据虫巢

数据挖掘 互联网 广告 移动互联网

Windows10 如何正确修改本地用户的名称及目录

Geek_3gb7ez

windows Windows 10 电脑故障 Windows技巧

写给产品经理的信(4):你一定要做产品经理么?

punkboy

生涯规划 产品 程序人生 产品经理 职业规划

redis数据结构介绍五-第五部分 对象

Nick

redis 源码 数据结构 源码分析 算法

RocketMQ - 如何实现顺序消息

Java收录阁

RocketMQ

微信推文无缝滚动是这样炼成的

Geek_3gb7ez

微信 大前端 微信公众号 微信推文 图文混排

[JVM] String#intern 面试必会

猴哥一一 cium

Java JVM string pool string Java 25 周年

JUC整理笔记三之测试工具jcstress

JFound

Java

平台化服务的基石:用户认证模型设计

孤岛旭日

企业架构 模型 用户权限

Git数据传输模型及常用命令整理

王坤祥

git git flow

在 Go 中使用并发编程 - 第二部分

TuringTuring

并发编程 协程 线程模型 Go 语言

财富的大门给我开了一条缝

YoungZY

读书笔记 读书

ansible-playbook中when结合tags使用,实现变量控制执行

唯爱

使用 Python 和 SudachiPy 进行日语分词

Roc

Python 日语 分词

一个前端的 Windows10 开发环境

Gadzan

大前端 windows Windows Terminal 环境安装 开发工具

Java 异步编程:从 Future 到 Loom

理帆

Java 并发编程 kotlin Netty

企业也有中年危机?探讨数字化与永续经营

FinClip

数字化转型 小程序生态

KubeFATE 部署多集群联邦学习平台 FATE

亨利笔记

学习 Kubernetes FATE KUBEFATE

redis数据结构介绍四-第四部分 压缩表

Nick

redis 源码 数据结构 源码分析 算法

ARTS-weekly-31

落英坠露

ARTS 打卡计划

教师节H5案例制作思路分享

Geek_3gb7ez

大前端 H5游戏

OBS推流学习笔记

IT蜗壳-Tango

直播 OBS 推流 B站直播

【译】并不存在的普通用户(面向极端用户的设计)

Yukun

设计思维 可用性

阅读对写作的好处

董一凡

写作

Kubernetes in action 笔记

FeiLong

Kubernetes 容器

ARTS week 1

时之虫

ARTS 打卡计划

redis数据结构介绍六 快表

Nick

redis 源码 数据结构 源码分析 算法

学慢点儿,想深点儿

熊斌

学习

使用 Markdown 制作五线谱

Roc

GitHub markdown 五线谱

闲鱼同城第三方对接架构设计_架构_闲鱼技术_InfoQ精选文章