Kafka

【Kafka】Kafka-Eagle 和 Kafka-UI 的安装使用 Kafka Eagle 提供了完善的管理页面,可以监控 Kafka 集群的整体运行情况,很方便的去管理和可视化 Kafka 集群的一些信息,例如 Broker 详情、性能指标趋势、Topic 集合、消费者信息等,在生产环境中经常使用。 阅读详情

在这里插入图片描述

1. Kafka入门(消息写入磁盘)

topic有多个分区(分片),分配在多个broker中,分区之间有副本
不同消费者有不同的位移,每个分区最后读取的消息偏移量保存在Zookeeper 或Kafka上,读取状态不会丢失。

定义:点对点模型和发布订阅模型
作用: 削峰填谷,Kafka是消息引擎系统,也是分布式流处理平台
客户端服务端:生产者和消费者统称为客户端(Clients),Kafka 的
服务器端
由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成
高可用(booker,副本),可伸缩(分区)在这里插入图片描述

2. 客户端

分区(每个分区的消息是有顺序的)

  • 作用(可伸缩,可放到多个机器上,高吞吐,负载均衡)
  • 策略(轮询,随机,按消息键保序)
    如何保证消息顺序(单个分区或基于某个值按照消息键保存,实现单个分区内的顺序)

2.1 压缩( Producer 端压缩、Broker 端保持、Consumer 端解压缩)

有时Broker 会解压缩解压缩(因为消息体格式不一样,主要是为了兼容老版本的消费者程序),

2.2 无消息丢失

生产者有副本(ISR,设置最大延时,重试,副本数等),发消息对回执做处理,producer的ack机制
消费者不要自动提交位移

Kafka 只对“已提交”(当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后,且 Producer 接到 Broker 的应答)的消息做有限度(消息保存在 N 个 Kafka Broker 上,那么这个前提条件就是这 N 个 Broker 中至少有 1 个存活)的持久化保证。

  • 不用producer.send(msg),而要使用 producer.send(msg, callback),要使用带有回调方法的API,我们可以根据回调函数得知消息是否发送成功,如果发送失败了我们要进行异常处理,比如存储到其他介质来保证消息不丢
  • 维持先消费消息(阅读),再更新位移(书签)的顺序
  • 如果是多线程异步处理消费消息,Consumer 程序不要开启自动提交位移,而是要应用程序手动提交位移

如果有些消息我们是可以容忍丢失的,我只希望kafka以最快的速度接收消息

  1. 0,producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时有可能丢失数据。
  2. 1,producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功之前leader故障,那么将会丢失数据。
  3. -1,(all):producer等待broker的ack,partition的leader和follower全部落盘成功后才返回ack。但是如果在follower同步完成后,broker发送ack之前,leader发生故障,那么会造成数据重复。

retries=MAX(重试)
unclean.leader.election.enable = false(follower replica落后太多的不能竞选)
replication.factor (副本数)
min.insync.replicas(ISR副本数)
replica.lag.time.max.ms(ISR副本最大延时)

Apache Kafka 的所有通信都是基于 TCP 的,而不是基于 HTTP 或其他协议
为何采用 TCP?

  • 利用 TCP 本身提供的一些高级功能,比如多路复用请求以及同时轮询多个连接的能力
  • 目前已知的 HTTP 库在很多编程语言中都略显简陋

2.3 消息交付可靠性保障

  • 最多一次(at most once):消息可能会丢失,但绝不会被重复发送。
  • 至少一次(at leastonce):消息不会丢失,但有可能被重复发送。 (默认)
  • 精确一次(exactly once):消息不会丢失,也不会被重复发送。

精准一次的实现

  1. 幂等性,At Least Once + 幂等性 = Exactly Once(幂等性producer,在 Broker 端多保存一些字段。当 Producer 发送了具有相同字段值的消息后,Broker 能够自动知晓这些消息已经重复了)
    只能单分区、单会话(重启失效)上的消息幂等性
  2. 事务(保证将消息原子性地写入到多个分区中。这批消息要么全部写入成功,要么全部失败,性能差)

2.4 消费者组及重平衡(加入组和平衡组请求,通过心跳机制和协调者来平衡)

Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制
重平衡(Rebalance )此时会stop the world
在这里插入图片描述
触发时机:

  • 组成员数量发生变化。
  • 订阅主题数量发生变化。
  • 订阅主题的分区数发生变化

通知机制(重平衡的通知机制正是通过心跳线程来完成的)
…
在消费者端,重平衡分为两个步骤:分别是加入组和等待领导者消费者(Leader Consumer)分配方案。这两个步骤分别对应两类特定的请求:JoinGroup 请求和 SyncGroup 请求

joinGroup请求 -》broker的协调者收集信息,分配领导者消费者,-> joinGroup响应,告诉领导者订阅信息
领导者分配
sync请求(领导者提交分配的请求) -》 sync响应,协调者返回分配的数据

在这里插入图片描述
在这里插入图片描述
Broker 端
在这里插入图片描述

要避免重平衡,因为会stop the world,,增减成员的没法控制,主要通过控制参数(session.timeout.ms;heartbeat.interval.ms)来控制心跳的频率,超时时间来减少误判

2.5 位移主题(kafka内部主题,记录消费者位移,替换zookeeper保存位移方式)

Kafka 天然实现了高持久性和高吞吐量,那么任何有这两个需求的子服务自然也就不必求助于外部系统,用 Kafka 自己实现就好了,所以有了位移主题

将 Consumer 的位移数据作为一条条普通的 Kafka 消息,提交到 __consumer_offsets 中

位移主题的 Key 中应该保存 3 部分内容:<Group ID,主题名,分区号 >
创建方式:

  • 当 Kafka 集群中的第一个 Consumer 程序启动时,Kafka 会自动创建位移主题(建议使用)
  • 手动创建

在这里插入图片描述

清理位移消息:

对于同一个 Key 的两条消息 M1 和 M2,如果 M1 的发送时间早于 M2,那么 M1 就是过期消息。Compact 的过程就是扫描日志的所有消息,剔除那些过期的消息

在这里插入图片描述

消费者多线程
在这里插入图片描述
看17 ,21 ,22

3. 深入内核

3.1 副本机制

Kafka 的 Broker 是不分主从的

追随者副本是不对外提供服务的(保证信息都是最新的)

在这里插入图片描述

副本消息同步

借助hw(高水位)和LEO(log end offset,该副本日志中下一条消息的位移值),实现leader和flower之间这两个值的更新,从而实现副本同步

ISR( In-sync Replicas)

追随者副本到底在什么条件下才算与 Leader 同步。---- ISR
Kafka 判断 Follower 是否与 Leader 同步的标准,即在ISR中,不是看相差的消息数,而是另有“玄机”。
这个标准就是 Broker 端参数 replica.lag.time.max.ms (ISR副本最大延时)参数值

3.2 请求是怎么被处理的

Reactor 模式
在这里插入图片描述

对于数据类请求和控制类请求优先级不同,将控制类请求直接丢到业务线程处理,提升优先级

3.3 控制器组件(Controller,某个broker)

它是 Apache Kafka 的核心组件。它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群(broker集群),每个broker都能充当控制器,只能有一个控制器,Broker 在启动时,会尝试去 ZooKeeper 中创建 /controller 节点。Kafka 当前选举控制器的规则是:第一个成功创建 /controller 节点的 Broker 会被指定为控制器

控制器保存了什么数据

  • 所有主题信息
  • 所有broker信息
  • 所有涉及运维任务的分区
    数据服务,控制器上保存了最全的集群元数据信息;数据其实在 ZooKeeper 中也保存了一份。每当控制器初始化时,它都会从 ZooKeeper 上读取对应的元数据并填充到自己的缓存中。有了这些数据,控制器就能对外提供数据服务了。这里的对外主要是指对其他 Broker 而言,控制器通过向这些 Broker 发送请求的方式将这些数据同步到其他 Broker 上

3.4 高水位(生产者的位移)

作用

  • 定义消息可见性,即用来标识分区下的哪些消息是可以被消费者消费的。
  • 帮助 Leader 副本确定其高水位,也就是分区高水位。进而帮助 Kafka 完成副本同步。
    HW值被用于衡量副本备份的成功与否以及在出现failture时作为日志截断的依据
    在这里插入图片描述
    consumer无法消费未提交消息。这句话如果用以上名词来解读的话,应该表述为:consumer无法消费分区下leader副本中位移值大于分区HW的任何消息。这里需要特别注意分区HW就是leader副本的HW值。
    LEO:日志末端位移

规则
leader根据自己和副本的leo确定同步情况
leader保留自己的hw和leo以及所有的follower副本的LEO,
follow保留自己的hw和leo
leo会在插入log时更新,leader的hw = min(自己及副本的leo),follow的hw=min(leader的hw和自己的leo)
机制
通过follower尚未发送FETCH请求及响应,来更新hw和leo,保持主从同步;但HW值的更新是异步延迟的,Follower 副本的高水位更新需要一轮额外的拉取请求才能实现,故这中间发生的任何崩溃都可能导致HW值的过期

Follower HW 在某一阶段内总是落后于 Leader HW,因此副本在根据 HW 值截取数据时将有可能发生数据的丢失或不一致。

后面有**leader epoch来标识leader broker的起始偏移值解决日志截断**的问题
原来通过hw做日志截断,现在向leader副本发送一个请求,来获取Follower自身所在 Epoch 的 Last Offset,避免截断;broker内存中为每个分区都缓存 Leader Epoch 数据,同时它还会定期地将这些信息持久化到一个 checkpoint 文件中

leader epoch前提是 leader的leo和follower的leo是同步的,需要版本是因为如果主节点切换多次,那么现在的leader不包含当前follower的leo信息;

日志截断

恢复时必须要放弃之前提交消息,如果不进行日志截断,那么新leaderB如果收到又一个producer的消息那么他这个位置和老leader这个位置就产生数据不一致了。所以将LEO恢复到HW位置,因为只有HW位置之前的数据都是所有副本已备份并且认同的,之后的数据并没有与所有副本(ISR集合)确认,需要抛弃这些数据然后重新和新的leader进行同步。

4. 管理与监控

配置

在config/server.properties改主要的配置信息
Topic 级别参数会覆盖全局 Broker 参数的值
Broker 端参数

  1. zookeeper.connect(zookeeper集群地址)
  2. auto.create.topics.enable(是否允许自动创建 Topic)
  3. log.retention.{hour|minutes|ms}(一条消息数据被保存多长时间。从优先级上来说 ms 设置最高、minutes 次之、hour 最低)
  4. log.retention.bytes(这是指定 Broker 为消息保存的总磁盘容量大小)
  5. message.max.bytes(控制 Broker 能够接收的最大消息大小)

Topic 级别参数

  1. retention.ms(规定了该 Topic 消息被保存的时长)
  2. retention.bytes:(规定了要为该 Topic 预留多大的磁盘空间)
  3. max.message.bytes( Kafka Broker 能够正常接收该 Topic 的最大消息大小)

Topic级别参数配置时机

  1. 创建 Topic 时进行设置
  2. 修改 Topic 时设置

主题管理

  • 创建topic ./kafka-topics.sh --create --zookeeper 10.101.98.149:2181 --replication-factor 1 --partitions 1 --topic aaa

  • 查看topic c ./kafka-topics.sh --zookeeper 10.101.98.149:2181 --list

  • 查看某个topic的配置信息 ./kafka-topics.sh --zookeeper 10.101.98.149:2181 --describe --topic aaa

  • 增加分区 ./kafka-topics.sh --zookeeper 10.101.98.149:2181 --alter --topic aaa --partitions 2

  • 修改主题配置 ./kafka-configs.sh --zookeeper 10.101.98.149:2181 --entity-type topics --entity-name aaa --alter --add-config
    max.message.bytes=10485760

动态broker参数(看)

修改之后无需重启broker即可生效

重置消费者位移

策略:
在这里插入图片描述
方式:

  • 通过消费者 API 来实现。
  • 通过 kafka-consumer-groups 命令行脚本来实现(11之后的版本)

常用工具脚本

  • 创建生产者 ./kafka-console-producer.sh --broker-list localhost:9092 --topic aaa
  • 创建消费者 ./kafka-console-consumer.sh --zookeeper 10.101.98.149:2181 --topic aaa --group test-group --from-beginning
  • 启动 ./kafka-server-start.sh …/config/server.properties
  • 后台启动: ./kafka-server-start.sh config/server.properties >/dev/null 2>&1 &
    等等

看32,33,34

跨集群备份解决方案(看35)

通常我们把数据在单个集群下不同节点之间的拷贝称为备份,而把数据在集群间的拷贝称为镜像(Mirroring)
MirrorMaker

主机监控
top监控load和cpu使用率
集群监控

调优

面试

为什么不支持读写分离,仅leader可读写

自 Kafka 2.4 之后,Kafka 提供了有限度的读写分离。
场景不适用。读写分离适用于那种读负载很大,而写操作相对不频繁的场景。
延迟大:同步机制。Kafka 采用 PULL 方式实现 Follower 的同步,同时复制延迟较大。

Replica副本的作用

在 Leader 副本所在的 Broker 宕机后,随时准备应聘 Leader 副本
自 Kafka 2.4 版本开始,社区可以通过配置参数,允许 Follower 副本有限度地提供读服务

如何防止重复消费

幂等id
每次消费需提交offset

保证数据不丢

生产者生产消息可以通过comfirm配置ack=all解决
消费者丢失可以关闭自动提交offset功能,系统处理完成时提交offset
Broker同步过程中leader宕机可以通过配置ISR副本+重试解决

如何保证顺序消费

单个分区,单个消费者消费
如只需要单key有序,为每个key申请单独内存 queue

5. 集群搭建

使用kafka-eagle监控kafka kafka-eagle(/'iːg(ə)l/)是一款简单高效的监控系统,用以监控kafka的偏移量、元数据等信息,它还提供了邮件、钉钉、微信报警功能。本篇假设已经存在一个可用的kafka集群,并介绍kafka-eagle搭建与使用。 官网:https://www.kafka-eagle.org/ github:https://github.com/smartloli/kafka-eagle 前... 阅读详情

相关推荐

Kafka(一)使用Docker Compose安装单机Kafka以及Kafka UI_docker 部署单机kafka

还有就是,当使用任何来自于bitnami的镜像,如何遇到了问题,想查看日志,可以将镜像的Debug日志打开,通过环境变量控制由于Docker Hub的说明字数限制,可以在Github上查看。

2501_90252715的博客 2099

安装配置Kafka,并使用Java集成Kafka

Kafka 是Java 语言编写的,因此需要在安装 Kafka 之前先安装 Java 运行环境。Kafka 支持 Java 8 及以上版本。可以通过以下命令检查 Java 运行环境的版本Kafka 的运⾏环境依赖于 ZooKeeper,Kafka 使用 ZooKeeper 进行分布式协调,因此在安装 Kafka 之前,需要先安装 ZooKeeper。

m0_73799407的博客 4329

Kafka Confluent 简介

Apache Kafka 消息分发组件,数据采集后先入Kafka。 Schema Registry Schema管理服务,消息出入kafka、入hdfs时,给数据做序列化/反序列化处理。 Kafka Connect 提供kafka到其他存储的管道服务,此次焦点是从kafka到hdfs,并建立相关HIVE表。 Kafka Rest Proxy 提供kafka的Rest API服务。 Kafk

石权的博客 1万+

kafka实战

1. kafka介绍 1.1. 主要功能 根据官网的介绍,ApacheKafka®是一个分布式流媒体平台,它主要有3种功能:   1:It lets you publish and subscribe to streams of records.发布和订阅消息流,这个功能类似于消息队列,这也是kafka归类为消息队列框架的原因   2:It lets ...

weixin_30614109的博客 6759

docker部署kafka监控服务kafka-exporter

1、kafka需要zookeeper管理,所以需要先安装zookeeper。 下载docker pull wurstmeister/zookeeper:latest版本 docker pull wurstmeister/zookeeper 启动镜像生成容器 docker run -d --restart="always" --name zookeeper -p 2181:2...

zchlove137的博客 4969

Kafka【三】Windows下安装Kafka集群

如果启动过程报错,主要是因为zookeeper和kafka的同步问题,请先执行cluster-clear.cmd文件,再执行cluster.cmd文件即可。集群启动命令后,会打开多个黑窗口,每一个窗口都是一个kafka服务,请不要关闭,一旦关闭,对应的kafka服务就停止了。因为kafka内置了ZooKeeper软件,所以此处将解压缩的文件作为ZooKeeper软件使用。将kafka1文件夹复制两份,改名为kafka2,kafka3。修改文件夹名为kafkazookeeper。

小小默:进无止境 3043

java kafka使用

是一款结合了目前Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具在启动Kafka的脚本前,添加export JMX_PORT=9988上传解压,配置环境变量vim /etc/profile配置vim conf/system-config.properties#修改第4行,配置kafka集群别名#修改第5行,配置ZK集群地址#修改第64行,打开图标统计#修改第122行,开启mysql启动。

wste3567的博客 2194

如何用 Kafka Manager 实现 Kafka 集群全面监控

Apache Kafka 是现代大数据架构中不可或缺的组件,广泛用于日志收集、流处理、消息队列等场景。随着 Kafka 集群规模的增长和业务复杂度的提升,**对 Kafka 的实时监控变得尤为重要**。

九天的专栏 974

Kafka + Kafka-UI

✅ 使用不需要 Zookeeper 的 Kafka—— 那就是Kafka KRaft 模式从 Kafka 2.8+ 起官方支持,3.3+ 开始默认推荐。去掉 zookeeper 依赖简化部署,性能更高更符合现在 Kafka 的新一代标准架构。

Bruce__taotao的博客 3447

基于K8S的Kafka全家桶安装(Kafka、Kafka Connect、 Schema Registry、KsqlDB)

本文基于K8s集群安装了Kafka、Kafka Connect、 Schema Registry、KsqlDB 1. 安装Operator Lifecycle Manager 下载文件 https://github.com/operator-framework/operator-lifecycle-manager/releases/download/0.16.1/crds.yaml https://github.com/operator-framework/operator-lifecycle-mana

汪云飞记录本 2925

Kafka监控工具Kafka Manage

kafka监控工具有 KafkaOffsetMonitor 、Kafka Manager、Capillary、Kafka Eagle等等。。。 其中Kafka Manager是最常用也是最好用的,下面主要讲一下Kafka Manager的安装与使用: (一) Mac安装Kafka Manager 下载Kafka Manager # 以管理员身份下载kafka-manager...

qq_38412833的博客 1900

Kafka:浅谈对Kafka的认识

消息系统都致力于让Consumer以最大的速率最快速的消费消息,一些消息系统比如Scribe和Apache Flume采用了Push模式,将消息推送到下游的Consumer。更进一步的性能优化是零拷贝的使用,也就是从磁盘日志到消费者客户端的数据传递,因为Kafka是MQ,对于msg不具备加工处理,所以得以实现。物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处。注意:ack的默认值就是1。

王小二(海阔天空) 3269

Kafka笔记 (一) 从Kafka的历史聊起

提到消息中间件,Kafka是我们经常提及的,不过消息中间件的属性只能说是它的基础属性之一,如果你去看官网的简介,会称其为分布式事件流平台,事件流的处理才是它最核心的特点;在我看来,Kafka应该是目前性能最高的开源的事件流平台了,很多开发者可能只是使用了Kafka的Produce和Consume接口来进行消息流的应用,其实它的Connect和Stream API是真正能体现Kafka在流处理上的优势的特性。 Kafka的历史 很多时候优秀的开源项目并不是作者突发奇想地写出来的,而是由实际的业务需求推动后逐步

wangzhenyang2的博客 3171

使用Kafka UI管理Kafka

在使用Kafka进行开发时,有个可视化的管理界面有助于提高开发效率。目前已经有很多Kafka的管理界面实现。本文介绍的Kafka UI是一个新的实现。 该界面的GitHub地址是provectus/kafka-ui。GitHub - provectus/kafka-ui: Open-Source Web GUI for Apache Kafka ManagementOpen-Source Web GUI for Apache Kafka Management. Contribute to provectu

成富的专栏 1万+

【Kafka】Kafka认证与授权

Kafka的认证机制 概述 GSSAPI:使用的Kerberos认证,可以集成目录服务,比如AD。Kafka最小版本 0.9 PLAIN:使用简单用户名和密码形式,Kafka最小版本 0.10 SCRAM:主要解决PLAIN动态更新问题以及安全机制,Kafka最小版本 0.10.2 OAUTHBEARER:基于OAuth 2认证框架,Kafka最小版本 2.0 配置SASL\PLAIN 创建kafka_server_jaas.conf文件 这个文件是配置Broker服务端的JAAS,进入Kafka程序目录的

九师兄 7633

【SAP PO】SAP PO 接口配置完整教程之二REST服务对接

SAP PO 接口配置完整教程之二REST服务对接

XLevon的博客 1万+

kafka系列之camel-kafka

文章目录概述详解camel-kafka 概述 首先关于 camel 的基本概念和用法,以及 kafka 的基本概念和用法,这里就不啰嗦了。这篇文章假设你对二者都有基本的认识。 camel 本身是一个路由引擎,通过 camel 你可以定义路由规则,指定从哪里(源)接收消息,如何处理这些消息,以及发往哪里(目标)。camel-kafka 就是 camel 的其中一个组件,它从指定的 kafka top...

lucasma的博客 4929

【ANSYS Workbench仿真】命令流:压力渗透pressure penetration

对与流体接触的part添加边界压力,使流体压力渗透点的接触应力与流体压力相等,以便得到真实的变形结果,就需要用到“pressure penetration”。 但是在ansys中,只能通过ADPL的形式添加,即在workbench中添加命令流的形式。此文主要介绍了**压力渗透的添加要点**和**命令流使用说明**。

路边小M's Blog 1万+

Kafka——应该选择哪种Kafka?

Kafka——应该选择哪种Kafka?

从知识输入到知识输出 2354

ChatGPT and Claude国内使用站点

这篇博客介绍了不同的AI聊天平台和定价信息,主要对比了ChatGPT和Claude两款产品。文章列出了多个提供聊天服务的AI平台,包括RawChat、ChatGPTPlus、ChatOpens、Wildcard和2233.ai等,并提供了每个平台的网页链接和定价详情。特别关注了Claude平台,介绍了其普通账号与会员账号的不同,以及相关的定价信息。此外,还提到了一些虚拟卡定价和服务细节,为用户选择合适的AI服务提供了多种参考。

nisidjndn的博客 1万+

VUE3如何使得大屏自适应的几种方法?

16:9。

weixin_42711805的博客 1万+

Kafka入门

Kafka是一个分布式系统,由通过高性能TCP网络协议进行通信的服务器和客户端组成。它可以部署在本地和云环境的裸机硬件、虚拟机和容器上。 服务器:Kafka作为一个或多个服务器的集群运行,可以跨越多个数据中心或云区域。其中一些服务器形成存储层,称为代理。其他服务器运行Kafka Connect以将数据作为事件流持续导入和导出,以及将Kafka与现有的系统(例如关系数据库以及其他kafka集群)集成。为了实现关键任务用例,Kafka集群具有高度可扩展性和容错性:如果其中任何一个服务器出现故障,其他服务器将

qq_45039852的博客 1万+

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

eNSP无法启动AR报错码40,而且按照eNSP帮助手册排查都没用,我的处理方法【自己存档版】

mizhiakk的博客 8405
上一篇: 2. 深入java虚拟机
下一篇: Zookeeper
big muscle
博客等级 码龄11年 145粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值