如何实现千万级优惠文章的优惠信息同步

如何,实现,千万级,优惠,文章,信息,同步 · 浏览次数 : 500

小编点评

**方案1:承接商品变更信息消息** * 当商品价格发生变化时,触发消息队列发送。 * 消息队列中包含商品变更信息,包括价格、库存等。 * 监听消息队列,当收到商品价格变更信息消息时,更新文章的价格、库存等信息。 **方案2:使用任务轮训文章** * 定期轮训文章,检查商品价格是否发生变化。 * 当价格发生变化时,发送任务轮训文章。 * 任务轮训文章会从商品变更信息中提取价格变化信息,并根据价格变化信息更新文章价格、库存等信息。 **方案3:可伸缩自动任务 + 首次曝光监测** **可伸缩自动任务组件** * 可以根据数据量自动分配任务数量。 * 可以利用线程池和分布式集群将任务并行执行。 * 可以监控任务执行情况,并实时更新文章价格、库存等信息。 **首次曝光监测** * 在文章首次曝光时,使用消息队列或其他方式向任务执行模块发送指示。 * 任务执行模块会从消息队列中获取任务指令,并进行相应的处理。 **方案对比** | 方案 1 | 方案 2 | 方案 3 | |---|---|---| | 实时 | 非实时 | 实时 | | 数据量大 | 数据量中等 | 数据量低 | | 可伸缩性 | 可伸缩性低 | 可伸缩性高 | | 成本 | 成本高 | 成本低 | | 复杂性 | 中等 | 低 |

正文

作者:京东科技 文涛

背景

金融社区优惠文章是基于京东商城优惠商品批量化自动生成的,每日通过不同的渠道获取到待生成的SKU列表,并根据条件生成优惠文章。

但是,生成优惠文章之后续衍生问题:

该商品无优惠了,对应文章需要做取消推荐或下架处理,怎样能更快的知道该商品无优惠了呢?

方案介绍

方案对比

方案1

承接该商品所有变更信息的消息,发生变更后二编文章。

优点:

实时,一旦变更立刻知道并更新文章。

缺点:

1 开销大,是要承接的消息多,可能100台机器也不一定能承接(亿级变更)。

2 耦合高,需要对接的业务方多,全部对接需要很长的周期及人力,同时对方发生业务变更需要通过人员同步更新逻辑。

方案2

通过任务轮训文章,调外部接口判断该商品是否有优惠,之后做相应的处理。

优点:

1 业务模型较简单,只需要判断是否有优惠或优惠变更即可。

2 优惠侧投入较小,只需要投入调度任务的机器即可。

缺点:

不实时,数据量大了,对任务的实时性是个挑战。

方案3

针对方式2的缺点,我们推出了【可伸缩自动任务】 + 【首次曝光监测】的组合模式。

即自己实现分布式调度增强,提高数据处理能力,提高调度鲁棒性、自动化等能力,同时采用首次曝光监测的方式,利用用户访问文章时判断是否有优惠,并做相应取消推荐或文章下线处理

优点:

1 较实时,第一批被推荐推到C端用户的文章有可能会看到无优惠兜底方案,其它人便不再被推送。

2 方式2的优点

缺点:

需要实现可伸缩自动任务组件

至此,如何保证千万量级的优惠文章监测优惠变更不至于周期太长成了难点。

接下来介绍可伸缩任务组件,是如何解决上述问题的:

可伸缩任务组件

关键能力

我们希望组件拥有的能力

•任务自动化,结束自动重新执行

•任务鲁棒性强,意外中断可从断点处重新唤起

•任务可分治,可利用线程池及分布式集群将整体任务拆分成多个子任务执行

•任务可扩展,具备新任务探测能力

•任务可熔断,可以监测连续异常并终止执行

实现

名词解释

任务指令:触发某个任务的一条指令信息

任务开关:控制整体任务执行情况,如:停止执行,分时段执行等

redo指令:当任务执行完成后,发出的重做指令

任务监测:负责监测任务执行情况,根据任务状态处理任务

实现思路

能否复用现有中间件?如:分布式任务,消息队列等

答案是可以,并且个人觉得最好是优先利用中间件能力,并将中间件的能力定义成组件的可扩展能力,方便中间件替换,提高组件的通用性

如果使用现有中间件实现该如何实现?

传统思路:

分布式任务负责查询全量文章,将查询结果发送MQ,消费者消费单条消息,并进行业务处理

那么问题来了,

1 查询一轮任务需要多长时间呢?随着文章量的增加,调度周期设置多少合适呢?

2 MQ的消息将海量

显然这种方式不太适合数据量大的情况

那么我们的思路是:

1 将分布式调度抽象成一个心跳监测模块,用于监测任务状态,以及探测新任务,这样任务执行周期固定10min即可,任务执行时间也不会太长(实际执行时间200ms左右)

2 将MQ抽象成任务指令的载体,用于发送指令,接收指令,利用分布式的能力处理任务

3 将千万级的一次查询,拆分成多个查询,缩小单次指令执行的周期,将千万级文章信息同步至ES,使用ES的滚动查询能力,在执行单次任务时,可滚动查询10-20万的文章

4 将分布式共识组件用作开关能力,用于控制组件执行,在大促或下游压力过高时动态控制任务执行

5 将Redis用于任务信息存储和分布式指令防重

至此,我们使用到了分布式调度、消息队列、Redis、分布式共识、ES等中间件能力。

实现方案

1 指令的定义:

属性 说明
breakPoint 断点标识
rangeBegin 边界起
rangeEnd 边界终
startTime 开始执行时间
endTime 结束时间
lastExeTime 最后一次执行时间
exceptionTimes 发生错误次数
threadKey 分布式任务线程标识

2 工作流程图:

工作流程说明:

1 任务监测模块负责周期性的监测现有任务执行情况及是否有新任务加入到任务列表中。

首先当拿到某个任务时,检验该任务最近活跃时间是否超出10分钟(可配置),如果超出则认为当前任务因某种原因已经终止执行了,此时发送唤起任务执行的指令。

接着执行新任务监测,如果有新任务加入,则将该任务加入到任务列表中。此时不需要发出任务唤起指令,下次任务监测则会根据上述逻辑发出唤起指令

2 任务执行模块收到指令后首先会校验当前任务的合法性,然后再执行任务

合法性校验点包括:

1)任务控制能力监测即相关开关监测

  1. 任务熔断能力监测,异常信息是否超出阈值,如果超出终止执行

  2. 任务防重监测,任务当前指令是否有其它线程在同时执行,如果有终止执行

执行的过程为:

1)任务采用异步线程池模式,收到执行指令(MQ)后立即开启异步线程执行,防止单条指令执行时间太长

2)执行接口调用方法,分批滚动查询待执行列表

3)循环待执行列表,执行相应业务逻辑

4)列表中每执行完一条数据,就会记录一下任务执行情况,用于作于异常中断后(机器重启),从断点处继续执行

5)任务发生异常记录异常信息

6)监测到任务真正执行完成,后发起redo指令,用于唤起下周期任务执行

目前效果

机器使用情况:微服务2台

任务拆分情况:目前任务被拆分成了30个子任务,平均每个扫描30万文章

实时性:1千万文章发生一次监测耗时4小时,下游接口TPS700左右

安全性:大促或下游压力大,可随时停止或分时段执行

鲁棒性:在微服务上线时,或接口调用异常时,任务产生中断,但过10分钟后,又会被从断点处重新唤起,不需要人工干预

中间件压力:复用调度和MQ等中间件但不拖累中间件,每天产生300条左右MQ消息,每条消息消费耗时10ms以内,每次心跳监测模块(分布式任务执行)耗时200ms左右

扩展

该组件,可根据业务逻辑做任何相关业务处理,如监测到已下架或取消推荐的文章,判断优惠存在时,依然可以做重新上架处理,不过此能力依赖业务系统配合

该组件目前缺少两个能力

1 任务出错后,可将错误信息发送告警,可通过接入监控系统实现,提高组件的告警能力

2 如何动态控制任务拆分逻辑,比如觉得4小时监测不够实时或太频繁时,想动态调整任务分治的粒度目前未实现

与如何实现千万级优惠文章的优惠信息同步相似的内容:

如何实现千万级优惠文章的优惠信息同步

金融社区优惠文章是基于京东商城优惠商品批量化自动生成的,每日通过不同的渠道获取到待生成的SKU列表,并根据条件生成优惠文章。 但是,生成优惠文章之后续衍生问题:该商品无优惠了,对应文章需要做取消推荐或下架处理,怎样能更快的知道该商品无优惠了呢?

2.简单的搭建后端,一步一步从基础开始(2023-9-20优化更新第一次)

上传Git的忽略文件下载 千万不能忘记配置忽略文件,不然可能会搞得你一个项目10多个G,很烦人 先梳理下我们需要新建的项目如下。接口层一般I(i)开头,实现层不需要。后面还会增加扩展类或者其他的。 API程序层:FastEasyAPI 服务接口层:FastEasy.IService 服务实现层:Fa

稳定支撑千万级月活,华为日历背后的英雄

摘要:华为日历月活高达数千万,这使其对支撑业务的数据库提出了巨大挑战:高并发场景下,数据库如何实现快速扩容?海量数据运行,如何确保业务稳定性? 本文分享自华为云社区《稳定支撑千万级月活,华为日历背后的英雄》,作者: GaussDB 数据库。 随着科技进步,手机日历早已融入我们的生活,不仅可以记录时间

Vue源码学习(一):数据劫持(对象类型)

好家伙,了解一下Vue如何实现数据劫持 1.Vue中data的使用 首先,我得搞清楚这玩意的概念,我们先从vue的使用开始吧 想想看,我们平时是如何使用vue的data部分的? 无非是这两种情况 (你可千万不要带着惊讶的表情说"啊!原来有两种写法的吗") //函数写法 data() { return

面试官:你讲下如何设计支持千万级别的短链?

前言 前几天面试遇到的,感觉比较有趣。第一次面试遇到考架构设计相关的题目,挺新奇的,开始向国外大厂靠拢了,比天天问八股文好太多了,工作5年左右的,问八股文,纯纯的不负责任偷懒行为。 感觉此问题比较有趣,这几天简单的实现了一版本,和大家分享一下具体的细节,也欢迎大家交流讨论, 代码github链接 s

[Unity] 实现AssetBundle资源加载管理器

实现Unity AssetBundle资源加载管理器 AssetBundle是实现资源热更新的重要功能,但Unity为其提供的API却十分基(jian)础(lou)。像是自动加载依赖包、重复加载缓存、解决同步/异步加载冲突,等基础功能都必须由使用者自行实现。 因此,本篇博客将会介绍如何实现一个Ass

基于ReAct机制的AI Agent

当前,在各个大厂纷纷卷LLM的情况下,各自都借助自己的LLM推出了自己的AI Agent,比如字节的Coze,百度的千帆等,还有开源的Dify。你是否想知道其中的原理?是否想过自己如何实现一套AI Agent?当然,借助LangChain就可以。

DashVector x 通义千问大模型:打造基于专属知识的问答服务

本教程演示如何使用向量检索服务(DashVector),结合LLM大模型等能力,来打造基于垂直领域专属知识等问答服务。其中LLM大模型能力,以及文本向量生成等能力,这里基于灵积模型服务上的通义千问 API以及Embedding API来接入。 背景及实现思路 大语言模型(LLM)作为自然语言处理领域

万物皆可集成系列:低代码对接阿里物流API实现快递跟踪

随着各大电商网购平台的发展,快递业已形成一个规模庞大的产业,据统计,全球快递企业已超过千家,而快递查询对于电商平台而言是最基础的功能之一,通过输入快递单号,不用区分具体是哪家快递公司,即可查询到快递的实时状态。目前的主流方法都是调用第三方快递查询接口,下面就介绍一下在活字格中如何调用API接口来进行

vivo 低代码平台【后羿】的探索与实践

本文主要从前后端分离的低代码方案、自研高性能渲染引擎、高效的可视化配置方案、千亿级内容投放、低代码如何与传统开发共存等五个维度vivo在低代码平台方面的实践经验,其中也会涉及到动态交互如何运用低代码来编排和我们在提高配置效率方面的全面探索。