Blink 有何特别之处?菜鸟供应链场景最佳实践

【无线传感网】Blink组件的学习_blink_protocol 你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**[外链图片转存中…(img-ckrAheZ0-1712335207271)][外链图片转存中…(img-YsZHaM0F-1712335207272)]由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新。 阅读详情

作者:晨笙、缘桥
菜鸟供应链业务链路长、节点多、实体多,使得技术团队在建设供应链实时数仓的过程中,面临着诸多挑战,如:如何实现实时变Key统计?如何实现实时超时统计?如何进行有效地资源优化?如何提升多实时流关联效率?如何提升实时作业的开发效率? 而 Blink 能否解决这些问题?下面一起来深入了解。

背景

菜鸟从2017年4月开始探索 Blink(即 Apache Flink 的阿里内部版本),2017年7月开始在线上环境使用 Blink,作为我们的主流实时计算引擎。

为什么短短几个月的探索之后,我们就选择Blink作为我们主要的实时计算引擎呢?

在效率上,Blink 提供 DataStream、TableAPI、SQL 三种开发模式,强大的 SQL 模式已经满足大部分业务场景,配合半智能资源优化、智能倾斜优化、智能作业压测等功能,可以极大地提升实时作业的开发效率;在性能上,诸如MiniBatch&MicroBatch、维表 Async&Cache、利用 Niagara 进行本地状态管理等内部优化方案,可以极大地提升实时作业的性能;在保障上,Blink 自带的 Failover 恢复机制,能够实现线程级的恢复,可以做到分钟级恢复,配合 Kmonitor 监控平台、烽火台预警平台,可以有效地实现实时作业的数据保障。

接下来,我将结合供应链业务的一些业务场景,简要说明,Blink 如何解决我们遇到的一些实际问题。

回撤机制

订单履行是供应链业务中最常见的物流场景。什么是订单履行呢?当商家 ERP 推单给菜鸟之后,菜鸟履行系统会实时计算出每笔订单的出库、揽收、签收等节点的预计时间,配送公司需要按照各节点的预计时间进行订单的配送。为了保证订单的准点履约,我们经常需要统计每家配送公司每天各个节点的预计单量,便于配送公司提前准备产能。

看似很简单的实时统计加工,我们在开发过程中遇到了什么问题呢?履行重算!当物流订单的上游某个节点延迟时,履行系统会自动重算该笔订单下游所有节点的预计时间。比如某个物流订单出库晚点后,其后的预计揽收时间、预计签收时间都会重算。而对于大部分的实时计算引擎来说,并不能很友好的支持这种变 Key 统计的问题。以前,数据量没那么大的时候,还可以通过 OLAP 数据库来解决这类场景,当量上来后, OLAP 方案的成本、性能都是很大的问题。

除了 OLAP 方案,我们提倡采用 Blink 已经内置的 Retraction 机制,来解决这类变 Key 统计的问题,这也是我们在2017年初就开始尝试 Blink 的重要原因。Blink 的Retraction 机制,使用 State 在内存或者外部存储设备中对数据进行统计处理,当上游数据源对某些汇总 Key 的数据做更新时,Blink 会主动给下游下发一个删除消息从而“撤回”之前的那条消息,并用最新下发的消息对表做更新操作。Retraction的实现细节,可以参见:Retraction for Flink Streaming。

下面是一个简化后的案例,供了解Blink Retraction的内部计算过程:

2509688-05332105059d7216.png

对于上述案例,可以通过 Blink 提供的强大的、灵活的、简易的 SQL 开发模式来实现,只需要几行 SQL 即可完成。

select   plan_tms_sign_time
       ,sum(1) as plan_tms_sign_lgtord_cnt
from
       (select   lg_order_code
                ,last_value(plan_tms_sign_time) as plan_tms_sign_time
        from     dwd_csn_whc_lgt_fl_ord_ri
        group by lg_order_code
        ) ss
group by plan_tms_sign_time
;

维表关联

供应链业务的实体角色非常多(仓、配、分拨、站点、小件员、货主、行业、地区等),实体繁多,这意味着我们在建设实时明细中间层的时候,会使用大量的维表关联,这对 Blink 在维表关联的性能上提出了更高的要求——如何提升大量的大小维表的关联性能?Blink 从来没让用户失望,Blink SQL 模式在维表关联的性能上,也做了大量的优化:

优化1:Async IO,有一些实时计算引擎,维表关联是采用同步访问的方式,即来一条数据,去数据库查询一次,等待返回后输出关联结果。这种方式,可以发现网络等待时间极大地阻碍了吞吐和延迟。而 Blink 采用了异步访问的模式,可以并发地处理多个请求和回复,从而连续地请求之间不需要阻塞等待,吞吐量大大提升。

优化2:缓存,维表关联涉及到大量的维表查询请求,其中可能存在大量相同 Key 的重复请求。Blink SQL 模式提供了缓存的机制,并提供 LRU 和 ALLCache 两种缓存方案。

用户可以通过配置 Cache='LRU' 参数,开启 LRU 缓存优化。开启后,Blink 会为每个 JoinTable 节点创建一个 LRU 本地缓存。当每个查询进来的时候,先去缓存中查询,如果存在则直接关联输出,减少了一次 IO 请求。如果不存在,再发起数据库查询请求,请求返回的结果会先存入缓存中以备下次查询。

如果维表数据不大,用户可以通过配置 Cache='ALL' 参数,对维表进行全量缓存。这样,所有对该维表的查询操作,都会直接走本地缓存模式,几乎没有 IO,关联的性能非常好。

优化3:缓存无效 Key,如果维表很大,无法采用 ALLCache 的方案,而在使用 LRU 缓存时,会存在不少维表中不存在的 Key 。由于命中不了缓存,导致缓存的收益较低,仍然会有大量请求发送到数据库,并且LRU模式下缓存里的key不会永久保留,可以通过调整参数,设置保留时间。

优化4:Distribute By 提高缓存命中率,默认情况下,维表关联的节点与上游节点之间是 Chain 在一起,不经过网络。这在缓存大小有限、Key 总量大、热点不明显的情况下, 缓存的收益可能较低。这种情况下可以将上游节点与维表关联节点的数据传输改成按 Key 分区。这样通常可以缩小单个节点的 Key 个数,提高缓存的命中率。

除了上述几点优化,Blink SQL 模式还在尝试引入 SideInput、Partitioned ALL Cache 等优化方案,相信在随后开源的 Blink 版本中,维表关联的性能会越来越好。

下面是一张来自 Flink Committer 云邪 异步查询的流程图,供理解与同步请求的差异。

2509688-b1dbf79778bc130f.png

数据倾斜

无数据不倾斜,我们在实时数仓建设过程中,也当然会遇到数据倾斜问题。在统计卖家的单量时,有些卖家单量大,有些卖家单量小,单量超大的卖家,就会产生数据倾斜;在统计行业的单量时,有些行业单量大,有些行业单量小,单量超大的行业,就会产生数据倾斜;在统计货品的库存流水情况时,有些货品库存流水频繁,一些货品库存流水较少,库存流水超频繁的货品就会产生数据倾斜……

我们应该如何处理数据倾斜问题呢?以统计卖家的单量为例,以前我们会先把订单这个 Key 作 Hash,先针对 Hash 之后的值做一次去重的聚合操作,再在此基础上,再做一次针对原 Key 去重的聚合操作。两次类似的聚合操作,导致代码写起来比较复杂,体力劳动比较多。

2017年,我们的实时数据开始全面切换到 Blink 上,Blink 在数据倾斜这块,又给我们提供了什么的方案呢?Blink 给出的答案是:MiniBatch/MicroBatch+LocalGlobal+PartialFinal。

MiniBatch/MicroBatch,可以实现微批处理,进而减少对 State 的访问,提升吞吐。因为微批处理会导致一定的延迟,最好结合 Blink 提供的允许延迟的相关参数来使用。

LocalGlobal,分为 Local 和 Global 两个阶段,有点类似 MapReduce 中的Combine 和 Reduce 两个阶段。LocalGlobal 可以很好地处理非去重类的聚合操作,但对 Count Distinct 的优化效果一般,因为在 Local 阶段,可能 Distinct Key的去重率并不会很高,进而导致后续的 Global 阶段,仍然会有热点。

PartialFinal,可以很好地解决 Count Distinct 带来的数据倾斜问题。PartialFinal 可以将 Distinct Key 自动打散,先聚合一次,在此基础上,再聚合一次,从而实现打散热点的作用。PartialFinal 跟手动 Hash 再聚合两次的效果一致,通过 Blink 提供的 PartialFinal 参数,可以自动实现,不再需要人为手工编写 Hash 再聚合两次的代码。

由上可以看出,Blink 在数据倾斜的处理上,已经实现了自动化,以前人为编写的打散热点方案,现在几个参数就能全部搞定,大大提升了代码的编写效率。

下面是相关参数,用户可以直接在 Blink 的作业参数中进行配置。

# miniBatch/microBatch攒批的间隔时间
blink.miniBatch.allowLatencyMs=5000
blink.microBatch.allowLatencyMs=5000
# 防止OOM,每个批次最多缓存多少条数据
blink.miniBatch.size=20000

# 开启LocalGlobal
blink.localAgg.enabled=true
# 开启PartialFinal
blink.partialAgg.enabled=true

另外,更多 Blink 的优化技巧,极力推荐阅读:高性能 Flink SQL 优化技巧。

超时统计

上架是仓储业务的重要组成部分。上架,顾名思义,就是要把到仓的货品,上到仓库的存储货架上。上架一般分为采购上架、销退上架、调拨上架等。及时上架是对仓库的重要考核项之一,无论哪一种类型的上架,我们经常需要针对到货后超过 x 小时未上架的订单进行预警。

但是,Blink 的计算是消息机制,需要上游发送消息才能触发下游计算,而上述的场景中,未上架就说明不会有上架的消息流入 Blink,进而无法完成下游的计算。

对于这种实时超时统计的问题,应该如何来解呢?我们尝试了几种方案,供参考:

方案1:针对部分 Source Connector,Blink 提供了"延时下发"的功能,用户可以通过指定 DataDeliveryDelayMs 参数,实现消息延迟下发。正常的消息正常流入,正常消息也可以通过配置该参数,使其按照自己的需求延时流入。这样,通过正常流入的消息关联延时流入的消息,可以触发 Blink 在消息正常流入时计算一次,在延时消息流入时再触发计算一次。这种方案,可以实现我们的业务需求,但是这种方案会把所有消息重新发送一遍,而不仅仅是到货后超过x小时未上架的消息,这样会造成计算资源的浪费,我们不建议在数据量很大的场景下使用该方案。

方案2:如果有第三方的消息中间件,而这个消息中间件又能支持配置超时下发的规则,这将是一个比较好的方案。据了解,Kafka 的最新版本已经能够根据业务需求,配置消息超时下发的规则。我们只需要在 Blink 中,通过正常流入的消息流关联关键Kafka 超时下发的消息流,就可以触发 Blink 进行超时消息的统计。这样,除了Blink,我们需要同时保障 Kafka 的稳定性。Kafka的超时消息订阅,可以参见:基于 Kafka 的定时消息/任务服务。

方案3:我们能够很自然的想到 CEP,而 Blink 也已经提供了 CEP 的功能,且已经SQL化。用户可以通过 Blink CEP 完成上述业务需求的统计。在实操过程中,我们发现,通过 Blink CEP 统计的结果,往往与真实结果(明细汇总统计)有一定的出入。什么原因呢?原来到货时间,被回传了多次,有可能开始回传的是9点,但是后面发现回传错了,改成了8点,而 CEP 的 Watermark 是全局地向前走的,对于这种场景,无法很好的适配。

方案4:Flink 的 ProcessFunction,是一个 Low-Level 的流处理操作。通过改写其中的 ProcessElement 方法,可以告诉 Blink的State 里面存什么,以及如何更新State;通过改写 OnTimer 方法,可以告诉 State 何时下发超时消息。通过对上述几种方案的原理对比及性能压测,我们最终选择的也是这套方案。由于超时场景,在供应链业务中非常常见,我们已经将该方案沉淀下来,同样的场景,通过 1min 配置下相关参数,即可完成类似场景超时消息的下发。

下面是方案4简化后的实现框架图,供了解相关实现及优势。

2509688-f7b36ec2ab38e2dd.png

零点起跳

每次大促,大屏上零点时刻双十一的零点时刻一直是大家关注的焦点,为了在零点一过就让各项指标尽快在大屏上展现出来,我们进行了一些端到端的优化,供参考。

优化1:合理调整 Blink 读取上游消息源的 FlushInterval 。我们知道 Blink 是以Block 的形式传输数据,如果 Block 一直积攒不满,Block 可能一直等待无法下发。这种情况,我们可以通过调整 FlushInterval 参数,直接控制多长时间往下游 sink 一次。这样,Block 积满或间隔达到满足其中一个条件,Block 就会往下流。

优化2:合理调整 MiniBatch/MicroBatch的size 和 AllowLatency 参数。前文提到,MiniBatch/MicroBatch 是微批处理模式,都会带来一定的延迟,可以通过合理控制 Size 和 AllowLatency 参数,来控制该模式带来的延迟。与优化1一样,两者满足其一,就会往下继续执行。

优化3:合理控制写 Checkpoint 的方式以及 Checkpoint 的大小。利用 Checkpoint 实现 Exactly Once 的容错方式一直是 Flink 作为流引擎的一个亮点。但是过于复杂的运算和网络环境有可能导致 checkpoint 的对齐时间过长,从而导致整个 Job 的延迟变长。同时,Exactly Once 模式下做 Checkpoint 的时间间隔与整个任务中数据流的延迟也是一个 Trade Off。因此我们在处理特别复杂的 Job 时也将这个因素考虑了进去,并没有使用默认的 Exactly Once 方式,而是依旧实际需求采用了 At Least Once 。同时,将 Checkpoint 的周期设置为了60s,尽可能的保证了任务在延迟较小的情况下,在 Failover 的情形下仍然能做到快速恢复。

优化4:除了 Blink 端,在数据服务端,大屏上的实时数据,我们建议采用查询性能优异的 Hbase 作为存储引擎,可以保证零点一过,三秒内便能实现大屏数据的跳动。

未来展望

Blink 在不断快速地发展,不仅仅是流处理,当前也开始支持批处理,用户只需要写一套代码就可以同时实现批和流的数据开发,当前在日志型的数据场景上,我们也正在探索利用 Blink 直接实现批流混合模式;不仅仅是半智能资源调优,当前开始内测智能资源调优,Blink 可以根据吞吐量、算子复杂度等因素,对线上作业的资源配置进行全智能自适应调优,再也不用在大促前手动更改资源配置;不仅仅是 Java,更期望有 Python 等多语言生态,来描述计算逻辑,相信开发效率又会上一个新的台阶;不仅仅是 ETL,更期望有更广阔的大数据算法集成,可以实现复杂的大数据AI场景……未来已来,我们相信,Blink 已经做好了迎接未来的准备。



本文作者:apache_flink

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

Blink:Blink流计算平台简介和设计原理 作者:禅与计算机程序设计艺术 1.简介 1.1 Blink简介 Blink是一个高性能的流式计算平台,面向实时处理场景,具备实时的低延迟数据传输能力、高吞吐量的数据处理能力和海量数据存储能力。其具有以下特性: 数据快速高效 阅读详情

相关推荐

VirtualBox增强功能安装全指南:从下载到配置复制粘贴功能

本文详细介绍了VirtualBox增强功能的完整安装与配置流程,重点解决了虚拟机与主机间复制粘贴、文件拖放等核心协作难题。通过分步指南和故障排查,帮助用户在不同操作系统(如Windows、Linux)中实现无缝集成,提升虚拟化工作效率与体验。

weixin_29206669的博客 419

MySQL · B+树并发控制机制的前世今生

前言1970年,Rudolf Bayer教授在《Organization and Maintenance of Large Ordered Indices》一文中提出了B树[1],从它基础上演化产生了B+树。B+树采用多叉树结构,降低了索引结构的深度,避免传统二叉树结构中绝大部分的随机访问操作,从而有效减少了磁盘磁头的寻道次数,降低了外存访问延迟对性能的影响。它保证树节点中键值对的有序性,从而控制...

cpongo011702 611

多模态数据集对比:MicroLens、PixelRec和Amazon在电商推荐中的表现差异

本文深入对比了三大主流多模态数据集MicroLens、PixelRec和Amazon在电商推荐中的表现差异。通过实际测试数据,分析了这些数据集在冷启动处理、模态融合、稀疏性挑战等关键场景下的真实表现,为算法工程师和研究员提供实用指南。特别关注多模态数据集的选择对推荐系统效果的影响,帮助开发者优化模型性能。

weixin_28717939的博客 418

Blink是如何工作的

概述 Blink开发并不简单。对于Blink开发新手,不简单是因为,为了实现一个非常快的渲染引擎,已经引入了许多Blink特定的概念和编程约定。 即使对于经验丰富的 Blink 开发人员来说,这也并不容易,因为 Blink 非常庞大,而且对性能、内存和安全性极为敏感。 本文旨在从“3千米”高空视角来描述“Blink如何工作”,希望能够帮助Blink开发者快速熟悉Blink的架构: 本文档不是关于Blink细节构成和编码规则(可能变动与过时)的手册、指南。相反,该文档简明地描述了 Blink 的基本原

2962

标准化降水指数介绍

Mckee et al.(1993)认为降水量的减少是导致干旱的主要因素,其他气候因子一般变化较小,对干旱产生的影响不大,因此SPI使用降水量作为唯一参数。SPI能较好表达因降水量的大小反映干旱状况,操作简单,所需资料仅为降水量,同时该干旱指数在各个地区和各个时段都具有良好的计算稳定性,是继PDSI之后另一种被广泛应用的干旱指数。𝐻(𝑥)是Γ分布求得的概率,并当𝐻(𝑥)>0.5时,S=1;式中,𝛼是形状参数,𝛽是尺度参数,𝑥是当月降水量,𝛤(𝛼)是Gamma函数,用极大似然估计法计算最佳的𝛼和𝛽,即。

weixin_44259522的博客 2857

泛微OA与泛微OA之间打通实现统一待办配置

问题:学校OA与集团OA均为泛微Ecology8.0 ,由于流程审批互通的需要,要将两套OA系统打通,实现跨系统的流程流转。

symstandsun的博客 2269

应用案例 | Blink 有何特别之处?菜鸟供应链场景最佳实践

本文授权转自阿里技术官方公众号(ali_tech):菜鸟供应链业务链路长、节点多、实体多,使得技术团队在建设供应链实时数仓的过程中,面临着诸多挑战,如:如何实现实时变Key统计?如何实现实时超时统计?如何进行有效地资源优化?如何提升多实时流关联效率?如何提升实时作业的开发效率? 而 Blink 能否解决这些问题?下面一起来深入了解。 背景 菜鸟从2017年4月开始探索 Blink(即 Apach...

Ververica的博客 727

PCL 均匀采样【2026最新版】

根据输入点云数据创建一个微小的三维立方体集合,然后计算每个三维立方体的重心;由于该重心点不一定是原始点云中的点,直接用该点来表示立方体内所有的点会丢失原始点云的细小特征;所以使用k最近邻搜索寻找距离重心点最近的原始点来代替重心点。

点云侠的博客 41万+

AI文章识别实战指南:原理、工具与误判场景

随着人工智能生成内容(AIGC)的普及,如何区分文本出自人类还是AI成为编辑、教育、内容审核等领域的常见需求。从自然语言处理的基本原理看,大语言模型按概率预测续写词汇,导致生成文本在困惑度(Perplexity)与突发性(Burstiness)上呈现特定分布,这构成了AI检测工具的核心逻辑。借助GPTZero、Originality.ai及国内AIGC检测平台,可对文本进行多维度量化评估,但也会因文体、非母语写作或AI辅助润色而产生误判。在实际应用场景中,编辑审稿、作业查重、文案审核均可通过“人工特征排查+

weixin_33816946的博客 418

【Matlab】如何使用Simulink进行电池建模和SOC预估

“通过Simulink电池建模进行SOC预估,其实挺容易!” 1 声明 本文只描述一般性电池建模方法,文中出现的电池相关数据来自一些论文或者外文文献,对数据的真实性不做任何保证。 本文参考了不少国内高校的硕士论文和外文文献,所以本篇文章只作为学术性交流,未经...

wanff1204的博客 2万+

SAP RAP学习系列合集介绍

《SAP RAP学习系列合集:从入门到部署的完整指南》摘要: 本文介绍了作者创建的SAP RAP学习系列合集,涵盖RAP开发从基础概念到实战部署的全流程。系列目前包含17篇文章,系统讲解了RAP核心开发技术:从数据建模、UI构建到行为定义(包括并发控制、草稿功能、授权验证等),最后详细演示了应用部署到Fiori Launchpad的两种方案(OP版和ES版)。

DeveloperMrMeng的博客 1491

菜鸟实时数仓技术架构演进

菜鸟实时数仓技术架构演进 以下文章来源于DataFunTalk,作者贾元乔(缘桥) 分享嘉宾:贾元乔 菜鸟高级数据技术专家 编辑整理:夏飞飞 内容来源:Flink Forward ASIA 出品平台:DataFunTalk 导读:在开源盛世的今天,实时数仓的建设已经有了较为成熟的方案,技术选型上也都各有优劣。菜鸟作为物流供应链的主力军,时效要求已经成为了核心竞争力,离线数仓已不能满足发展的需要,在日益增长的订单和时效挑战下,菜鸟技术架构也在不断发展和完善,如何更准更高效的...

weixin_41836276的博客 541

如何使用Docker部署OpenClaw小龙虾(docker compose快速部署)

本文以飞牛NAS为例💻,带大家一步步完成Docker部署OpenClaw小龙虾🦞。不管你是用NAS、云服务器还是本地电脑,只要支持Docker,都可以参考这个步骤来安装部署⚡

XiaoqiangClub的博客 727

待看博文

Blink 有何特别之处?菜鸟供应链场景最佳实践 http://lxw1234.com/archives/category/spark/page/4 阿里云Flink教程 A Tale of Three Apache Spark APIs: RDDs vs DataFrames and Datasets 平易近人、兼容并蓄——Spark SQL 1.3.0概览 ...

AaronLwx的博客 187

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

使用函数调用的闪灯程序

4. 接着,调用自定义函数`changeBlinkInterval()`来改变LED闪烁的等待时间,并将返回值赋给blinkInterval变量;6. 在函数内部,使用if语句来判断当前设定的时间是否为1000毫秒,如果是,就将时间改为500毫秒,否则将时间改为1000毫秒;3. 在loop函数中,先打开LED并且等待当前设定的时间,然后关闭LED并且再次等待当前设定的时间;1. 定义LED的引脚为数字引脚13,同时初始化LED闪烁的等待时间为1000毫秒;

HaiRwen的博客 465

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

flink学习33:flinkSQL连接mysql,查询插入数据

1.生成运行时env2.生成表环境3.接上数据流,数据流数据生成表4.把数据库中sink保存数据的表,在flink中生成一遍(相当于把flink生成的表,绑定到数据库中的表),配上数据库连接信息,并执行,及注册5.查询表,可以根据注册表名查询6.插入表,可以根据生成的flink表进行数据插入。

hzp666的博客 8115

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Spark中几种ShuffleWriter的区别你都知道吗?
下一篇: Spark内置图像数据源初探
叫我不矜持
博客等级 码龄8年 29粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值