Kafka核心设计与实践原理:设计理念、基本概念、主要功能与应用场景

这篇具有很好参考价值的文章主要介绍了Kafka核心设计与实践原理:设计理念、基本概念、主要功能与应用场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设计理念

基本概念

Kafka,核心设计,实践原理,容错的持久化,流式处理平台
1.1.1 主要功能与应用场景

Kafka 作为一个分布式流式处理平台,提供了三个关键的功能:

  1. 消息系统:消息顺序性保障、回湖消费功能、以及传统的消息系统功能 (系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等) 。

  2. 容错的持久化记录消息流:把消息持久化到磁盘,避免了消息丢失的风险。(由此也可以把 Kafka 作为长期的数据存储系统来使用,只需要把对应的数据保留策略设置为“永久”或启用主题的日志压缩功能即可)

  3. 流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库_(如窗口、连接、变换和聚合等各类操作)_。

其主要的应用场景:

  1. 消息队列 :实时流数据管道,可靠地在系统或应用程序之间获取数据。

  2. 异步、削峰: 对产生的流量进行削峰和异步处理

  3. 解耦: 解耦消费方和生产方对消息的处理

1.1.2 相比于其他 MQ 的优缺点

Kafka的设计目标是高吞吐量,所以他的一些特性都和这个目标相关,如

  1. Kafka 使用的是顺序 I/O,为保证顺序,Kafka强制点对点的按顺序传递消息,这意味着,一个 consumer 在分区中只有一个位置。

  2. Kafka 不保存每个消息的状态,不提供以随机访问的形式更新消息的状态,而是使用 offset 划分使用和未使用的消息。

  3. Kafka支持点对点的批量消息传递。

  4. Kafka的消息存储使用了 OS pagecache(页缓存,page cache的大小为一页,通常为4K,用于缓存文件的逻辑内容),提高读写文件时的操作效率。

和其他消息队列的对比:

消息中间件 / 特性KafkaMsgBrokerRabbitMQRocketMq
消息推送模式pullpush多协议,均支持多协议,均支持
持久化能力磁盘(文件系统page cache)DB磁盘磁盘
事务型消息支持(version>0.11)支持支持支持
消息是否有序有序,采用追加写、offset读无序有序有序
数据可靠性replica机制,容错容灾.(依赖ZK中维护的元数据来实现的 )可靠保证数据不丢,slave备份可靠,同步刷盘,同/异步复制
应用场景高吞吐量,分布式规模流式数据处理金融及支付高可靠性,重点强调事务型高可用高吞吐,高可靠

broker \ topic \ partition…关系结构:

Partition(分区) :

属于 Topic 的一部分。一个 Topic 可以有多个 Partition(即多副本机制) ,并且同一 Topic 下的 Partition 可以分布在不同的 Broker 上。
同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,不过ofiset 并不跨越分区,也就是说,Kafka 保证的是分区有序而不是主题有序。
一个topic下,不同的 broker 上多个partition的追加写入:
Kafka,核心设计,实践原理,容错的持久化,流式处理平台

tips:kafka 中 ,Producer 在发布消息时可以选择指定要发送的 Partition,或者使用默认的分区策略让 Kafka 自动选择 Partition。

多副本机制是什么?
   Kafka 为 Partition 引入了多副本(Replica)机制,来实现故障自动转移。Partition 中的多个副本之间会有一个叫做 leader 的家伙,其他副本称为 follower。我们发送的消息会被发送到 leader 副本,然后 follower 副本才能从 leader 副本中拉取消息进行同步。
多副本架构:
Kafka,核心设计,实践原理,容错的持久化,流式处理平台

生产者和消费者只与 leader 副本交互。
follower 保证消息存储的安全性。当 leader 副本发生故障时会从 follower 中选举出一个 leader,但是 follower 中如果有和 leader 同步程度达不到要求的参加不了 leader 的竞选。

多分区 以及多副本机制有什么好处?

  1. 一个 Topic 下的多个 Partition 可以分布在不同的 Broker 上, 可以提供更好的并发能力(类似负载均衡)。

  2. Partition 的 Replica 机制, 极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。

Broker

概念:
  • AR(Assigned Replicas): 所有副本 (replicas) 统称为 AR;

  • ISR (In Sync Replica): Leader 副本保持一定同步(是指可忍受flower的滞后范围,这个范围可以通过参数进行配置)的 follower 副本, 包括 leader 副本自己;

  • OSR(Out-of-Sync Replicas):与 leader 副本同生滞后过多的副本(不包括 leader 副本)组成 OSR

  • HW : Highwatermark, 俗称高水位,它表示了一个特定的消息偏移量(offset), 在一个 parttion中consumer只能拉取这个 offset 之前的消息(此 offset 跟 consumer offset 不是一个概念) ;

  • LEO: LogEndOffset , 日志末端偏移量, 用来表示当前日志文件中下一条写入消息的offset;

In Sync Replica:

默认情况下,当 leader 副本发生故障时,只有在ISR 集合中的副本才有资格被选举为新的 leader。
ISR 与 HW 和LEO 也有紧密的关系。Kafka 通过ISR的同步机制及优化策略,用 HW & LEO 的方式很好地确保了数据不丢失以及吞吐率。而ISR的管理最终都会反馈到 ZK 上。

ISR相关参数:

  • replica.lag.time.max.ms: 配置副本与 leader 副本之间的最大同步延迟时间。如果同步延迟超过这个时间,那么它将被移出 ISR。默认值为 10,000 毫秒(10秒)。

  • replica.lag.max.messages: 配置副本与 leader 副本之间的最大消息数差异。如果消息数差异超过这个值,那么它将被移出 ISR。默认值为 4,000,000 条消息。

ISR 与 HIW 和 LEO

Kafka,核心设计,实践原理,容错的持久化,流式处理平台
说明:

  • 日志文件的 HIW 为6,表示消费者只能拉取到ofiset 在0 至5之间的消息,而offset 为6的消息对消费者而言是不可见的

  • 分区 ISR 集合中的每个副本都会维护自身的 LEO(Log End Offset),而ISR 集合中最小的 LEO即为分区的HW,对消费者而言只能消费 HW 之前的消息。

Leader和Follower之间的消息同步过程,以及HW、LEO的变化:

  1. 投递消息:

Kafka,核心设计,实践原理,容错的持久化,流式处理平台

  1. leader写入消息

Kafka,核心设计,实践原理,容错的持久化,流式处理平台

  1. follower同步消息

Kafka,核心设计,实践原理,容错的持久化,流式处理平台

  1. ISR完成同步消息

Kafka,核心设计,实践原理,容错的持久化,流式处理平台

生产者

生产者客户端的整体架构:
Kafka,核心设计,实践原理,容错的持久化,流式处理平台

Kafka有很多版本的生产者客户端:

  • 于 Kafka 开源之初使用 Scala 语言编写的客户端;

  • 从 Kafka 0.9.x 版本开始推出的使用 Java 语言编写的客户端;

  • 在Kafka官网中, “CLIENTS” 的入口提供了一份多语言的支待列表, 其中包括常用的C、C++、 Python 、 Go等语言, 不过这些其他类语言的客户端并非由Kafka社区维护。

核心对象:

public class ProducerRecords<K, V>{
    private final String topic; //主题
    private final Integer partition; //分区号
    private final Headers headers; //消息头部
    private final K key; //键
    private final V value; //值
    private final Long timestamp;//消息的时间戳//省略其他成员方法和构造方法}


说明:

  • headers 字段是消息的头部,Kafka 0.11.x版本才引入这个属性,它大多用来设定一些与应用相关的信息,如无需要也可以不用设置。

  • key 是用来指定消息的键,它不仅是消息的附加信息,还可以用来计算分区号,进而可以让消息发往特定的分区。这个 key可以让消息再进行二次归类,同一个key 的消息会被划分到同一个分区中。

  • 一个ProducerRecords最少需要指定 topic 和 value。

生产者实例化

1、KafkaProducer:
KafkaProducer 是 Kafka 客户端库提供的原生生产者实现,它提供了更底层的 API 来操作 Kafka 生产者。通过使用 KafkaProducer,您可以更细粒度地控制生产者的配置和行为,包括设置生产者的属性、自定义分区策略、实现自定义的消息发送等。
优点:

  • 提供更灵活、更底层的控制,适合特定的定制化需求。

  • 可以使用原生的 Kafka 类型和接口。

缺点:

  • 使用更复杂,需要手动管理生产者的初始化、线程安全等。

  • 需要编写更多的代码来处理异常和错误情况。

2、使用 KafkaTemplate:
KafkaTemplate 是 Spring Kafka 提供的高级封装,它简化了 Kafka 生产者的使用,并提供了更易于理解和使用的 API。通过使用 KafkaTemplate,您可以不必关心生产者的初始化、线程安全等细节,而是直接使用 KafkaTemplate 提供的方法来发送消息。
优点:

  • 简化了 Kafka 生产者的使用,减少了样板代码,提高开发效率。

  • Spring Kafka 提供了更友好的 API,支持将消息发送到指定的 topic、partition 和 key,以及实现异步发送等功能。

缺点:

  • 提供的功能相对较为有限,如果需要更多的细粒度控制,可能需要借助额外的配置和扩展。

发送消息

KafkaProducer对外提供了两个 send()方法:

public Future<RecordMetadata> send(ProducerRecord<K, V> record)public Future<RecordMetadata> send(ProducerRecord<K, V> record,Callback callback)


  • RecordMetadata对象里包含了消息的一些元数据信息,比如当前消息的主题、分区号、分区中的偏移量(offset)、 时间戳等。如果在应用代码中需要这些信息,则需要使用 future.get(); 的方式来阻塞主流程,等待消息发送结果

  • Callback是否有序?

消息自动重试

KafkaProducer中一般会发生两种类型的异常:可重试的异常和不可重试的异常。
常见的可重试异常有:NetworkException、LeaderNotAvailableException, UnknownTopicOrPart廿ionException、 NotEnoughReplicasException、NotCoordinatorException 等。重试配置:org.apache.kafka.clients.producer.ProducerConfig#RETRIES_CONFIG。
Kafka,核心设计,实践原理,容错的持久化,流式处理平台

不可重试的异常,如 RecordTooLargeException(发送的消息太大) 异常,KafkaProducer对此不会进行任何重试, 直接抛出异常。

分区器

分区器的作用就是为消息分配分区。
如果消息 ProducerRecord 中指定了 partition字段, 那么就不需要分区器, 因为partition代表的就是所要发往的分区号。
如果消息ProducerRecord中没有 指定partition字段,那么就需要依赖分区器,根据key 这个字段来计算partition的值。

Kafka 中提供的默认分区器是 org.apache.kafka.clients.producer.internals.DefaultPartitioner

相关配置

#kafka配置,更多配置请参考:KafkaPropertiesspring.kafka:
  #公共参数,其他的timeout.ms, request.timeout.ms, metadata.fetch.timeout.ms保持默认值
  properties:
    #指定producer在发送批量消息前等待的时间,当设置此参数后,即便没有达到批量消息的指定大小(batch-size),到达时间后生产者也会发送批量消息到broker。默认情况下,生产者的发送消息线程只要空闲了就会发送消息,即便只有一条消息。设置这个参数后,发送线程会等待一定的时间,这样可以批量发送消息增加吞吐量,但同时也会增加延迟。
    linger.ms: 50 #默认值:0毫秒,当消息发送比较频繁时,增加一些延迟可增加吞吐量和性能。
    #这个参数指定producer在一个TCP connection可同时发送多少条消息到broker并且等待broker响应,设置此参数较高的值可以提高吞吐量,但同时也会增加内存消耗。另外,如果设置过高反而会降低吞吐量,因为批量消息效率降低。设置为1,可以保证发送到broker的顺序和调用send方法顺序一致,即便出现失败重试的情况也是如此。
    #注意:当前消息符合at-least-once,自kafka1.0.0以后,为保证消息有序以及exactly once,这个配置可适当调大为5。
    max.in.flight.requests.per.connection: 1 #默认值:5,设置为1即表示producer在connection上发送一条消息,至少要等到这条消息被broker确认收到才继续发送下一条,因此是有序的。
  producer:
      #这个参数可以是任意字符串,它是broker用来识别消息是来自哪个客户端的。在broker进行打印日志、衡量指标或者配额限制时会用到。
      clientId: ${spring.application.name} #方便kafkaserver打印日志定位请求来源
      bootstrap-servers: 127.0.0.1:8080 #kafka服务器地址,多个以逗号隔开
      #acks=0:生产者把消息发送到broker即认为成功,不等待broker的处理结果。这种方式的吞吐最高,但也是最容易丢失消息的。
      #acks=1:生产者会在该分区的leader写入消息并返回成功后,认为消息发送成功。如果群首写入消息失败,生产者会收到错误响应并进行重试。这种方式能够一定程度避免消息丢失,但如果leader宕机时该消息没有复制到其他副本,那么该消息还是会丢失。另外,如果我们使用同步方式来发送,延迟会比前一种方式大大增加(至少增加一个网络往返时间);如果使用异步方式,应用感知不到延迟,吞吐量则会受异步正在发送中的数量限制。
      #acks=all:生产者会等待所有副本成功写入该消息,这种方式是最安全的,能够保证消息不丢失,但是延迟也是最大的。
      acks: all #默认值:1
      #当生产者发送消息收到一个可恢复异常时,会进行重试,这个参数指定了重试的次数。在实际情况中,这个参数需要结合retry.backoff.ms来使用,建议总的重试时间比集群重新选举leader的时间长,这样可以避免生产者过早结束重试导致失败。
      #另外需注意,当开启重试时,若未设置max.in.flight.requests.per.connection=1,则可能出现发往同一个分区的两批消息的顺序出错,比如,第一批发送失败了,第二批成功了,然后第一批重试成功了,此时两者的顺序就颠倒了。
      retries: 2  #发送失败时重试多少次,0=禁用重试(默认值)
      retry-backoff-ms: 1000 #重试等待间隔
      #默认情况下消息是不压缩的,此参数可指定采用何种算法压缩消息,可取值:none,snappy,gzip,lz4。snappy压缩算法由Google研发,这种算法在性能和压缩比取得比较好的平衡;相比之下,gzip消耗更多的CPU资源,但是压缩效果也是最好的。通过使用压缩,我们可以节省网络带宽和Kafka存储成本。
      compressionType: "none" #如果不开启压缩,可设置为none(默认值),比较大的消息可开启。
      #当多条消息发送到一个分区时,Producer会进行批量发送,这个参数指定了批量消息大小的上限(以字节为单位)。当批量消息达到这个大小时,Producer会一起发送到broker;但即使没有达到这个大小,生产者也会有定时机制来发送消息,避免消息延迟过大。
      batch-size: 16384 #默认16K,值越小延迟越低,但是吞吐量和性能会降低。0=禁用批量发送
      #这个参数设置Producer暂存待发送消息的缓冲区内存的大小,如果应用调用send方法的速度大于Producer发送的速度,那么调用会阻塞一定(max.block.ms)时间后抛出异常。
      buffer-memory: 33554432 #缓冲区默认大小32M


专题讨论

如何保证消息的可靠性(或如何避免消息丢失)?

一条消息的流转,会经过 Producer / Broker / Consumer ,所以消息的丢失,可能出现在这三个位置,我们分情况讨论。具体的实现,可参考:消息可靠性方案的实现

Producer 端消息丢失

1. Producer 是否等待 TopicLeader 的消息回执(ack:默认为1)

acks = 1: Leader 写入消息到本地日志,则请求被认为成功。如果此时 Leader 应答请求后挂掉了,消息会丢失。

acks = 0: Producer 执行发送请求后立即返回,不等待 Leader 的确认,消息会丢失。

acks = -1:分区 Leader 必须等待消息被成功写入到所有的ISR副本(In-Sync Replace)中才认为请求成功。该种情况下配合 Producer 的消息重试机制 来保证消息可靠性。

2. Producer 进程意外停止导致的消息丢失

为了提升发送效率,减少IO次数,Producer 在发送数据时,可以将多个消息缓存在本地 buffer 中进行合并后发送(主要通过在 KafkaProducer 对象中配置  buffer.memory 、batch.size 、linger.ms 参数来控制)。

可以看到存在本地 Buffer 的消息,在 Producer 进程突然结束后,会出现消息丢失的情况。如果有必要,可以适当调小上面提及的参数,使发送频率变高,减少丢失数据。

3. Producer 网络问题导致的消息丢失

由于 Producer 的网络问题,在经过 retries 和 retry.backoff.ms 后,依然发送失败,那么将使用其他的方案进行重试发送。

Broker 消息丢失

1. Leader 切换

Broker 的消息丢失,最容易出现在 Partition Leader 切换时,我们可以通过如下的一些参数来保证 Broker 消息的可靠性:

  1. replication.factor 设置 topic 的副本

  2. 服务端设置 min.insync.replicas(ISR)>1,确保切换 Leader 时有同步的 Flower。需要 replication.factor > min.insync.replicas

  3. producer 端设置 acks=all,保证消息写入所有 ISR 列表中

  4. producer 端设置 retries 和 retry.backoff.ms 对 Broker 存储失败的消息进行重发

Consumer 消息丢失

1. Consumer 按时间间隔自动提交 offset

使用 enable.auto.commit 和 auto.commit.interval.ms 控制异步 offset 提交,可能会出现消息丢失或者重复消费。

2. Consumer 手动提交 offset

手动提交 offset 并不能 100% 保证消息一定不丢失,(比如,消费某几条消息失败后,导致 offset 没有提交,那么默认情况下,消费者会进行重试,如果重试还是失败,消费者将继续消费下一批消息,如果后续的消费成功提交 offset ,那么消费失败的消息将会丢失),需要配合异常重试、死信队列、死信队列消息处理机制,才能保证 Consumer 100% 不丢失消息。

如何保证消息的唯一性

消息不唯一,可能会出现在 Producer 端多次发送,在 Consumer 端多次消费,下面分情况讨论:

1. Producer 客户端通过 Producer ID(PID)和 Sequence Number 保证消息唯一

0.11.0 后的版本,引入了 Producer ID(PID)和 Sequence Number 实现 Producer 的幂等,保证一个消息只被投递一次。

2. Consumer 添加持久化的去重判断

Consumer 消息的消费和业务紧密相关,所以需建立持久化的唯一标识,来避免消息重复消费。

如何保证消息的消费顺序?

Kafka 只能为我们保证每个 Partition(分区) 中的消息有序, 同一个 Topic 下的多个 Partition 内的消息在消费时,不保证有序性.

为了保证消息的顺序消费, 有如下几种方案:

  1. 1 个 Topic 只配置一个 Partition

  2. Producer 发送消息的时候指定 key 和 Partition, 保证需要顺序消费的消息在同一个 Partition 中, 此时无论是哪一个 Consumer 来 pull 消息都是有序的.

    • 1 和 2从本质上来讲, 都是利用 Partition 中的有序性来实现顺序消费

  3. 在消息中加入状态(如订单的预下单>支付中>支付完成>撤销), Consumer 消费消息时, 判断状态决定消费还是抛出异常, 异常后等待被重新消费

    • 通过业务来控制有序的消费消息文章来源地址https://www.toymoban.com/news/detail-837006.html

到了这里,关于Kafka核心设计与实践原理:设计理念、基本概念、主要功能与应用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Zookeeper设计理念与源码剖析

    Follower server 可以直接处理读请求,但不能直接处理写请求。写请求只能转发给 leader server 进行处理。 最终所有的写请求在 leader server 端串行执行。(因为分布式环境下永远无法精确地确认不同服务器不同事件发生的先后顺序) ZooKeeper 集群中的所有节点的数据状态通过 ZAB 协

    2024年01月16日
    浏览(27)
  • Hystrix和Sentinel熔断降级设计理念

    Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。 Sentinel 对这个问题采取了两种手段: 通过并发线程数进

    2024年02月09日
    浏览(29)
  • 【开篇 | Spring深度学习】Spring设计理念和整体架构

    个人名片: 🐼 作者简介:一名大二在校生 🐻‍❄️ 个人主页:落798. 🐼 个人WeChat:落798. 🕊️ 系列专栏: 零基础学java ----- 重识c语言 ---- 计算机网络 — 【Spring技术内幕】 🐓 每日一句: 努力赚钱,娶她回家! Spring 是最流行的企业 Java 应用程序开发框架。 全球数以百

    2024年02月16日
    浏览(32)
  • 云原生应用交付平台Orbit设计理念与价值主张

    本文作者: 何文强——腾讯云 CODING 高级架构师 。 负责 CODING DevOps产品解决方案架构设计和技术产品布道以及 CODING 云原生技术研究与落地实践。在多个技术大会担任演讲嘉宾,腾讯云 CODING DevOps 课程认证出品人,腾讯云云原生训练营核心初创成员。 ​ 精通敏捷精益、DevO

    2024年02月10日
    浏览(25)
  • [React源码解析] React的设计理念和源码架构 (一)

    任务分割 异步执行 让出执法权 1.React的设计理念 Fiber: 即对应真实dom, 又作为分隔单元。 Scheduler: 用js实现一套时间片运行的机制, 使得requestIdleCallback()的浏览器的兼容性和触发不稳定的问题解决。 Lane: 异步调度有了, 需要细粒度的管理各个任务的优先级, 让高优先级的先执行

    2024年02月07日
    浏览(27)
  • 【手撕Spring - 深入篇】Spring 的设计理念和整体架构

    👉 博主介绍 : 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ 带你手撕 Spring 🙉八股文专题:剑指大厂,

    2024年02月14日
    浏览(28)
  • Vue3.x的设计理念-Vue3导读

    目录 VUE-NEXT【vue3】 VUE-NEXT最核心的变更 Why not SFC?【单文件组件】 Composition API 生命周期钩子变化 什么是响应式(Reactivity) Reactive值 Proactive vs Reactive 声明式程序 声明式程序:创造语言 声明式程序:Reactive 小结:常见误区 vue3+ts环境配置之后会单独写篇文章,这里就不赘述

    2024年02月06日
    浏览(19)
  • 从零开始理解Linux中断架构(2)-朴素的中断管理设计理念

            既然是从零开始,我们先从最为简单的中断逻辑处理架构开始,这个逻辑结构跟CPU架构没有关系,纯逻辑上的。纯逻辑是跨越系统和应用的,不管对于应用程序员还是系统程序员,逻辑推导是基本的工具,设计原型是基本的出发点。         在系统初始化的时

    2024年02月08日
    浏览(27)
  • 深入Kafka核心设计与实践原理读书笔记第二章

    配置生产者客户端参数及创建相应的生产者实例。 构建待发送的消息。 发送消息 关闭实列 参数说明 bootstrap.servers :用来指定生产者客户端链接Kafka集群搜需要的broker地址清单,具体格式 host1:port1,host2:port2,可以设置一个或多个地址中间,号分割,参数默认 空串。 这里要注意

    2023年04月08日
    浏览(67)
  • BERT模型基本理念、工作原理、配置讲解(图文解释)

    BERT是Birdirectional Encoder Representation from Transformers的缩写,意为多Transformer的双向编码器表示法,它是由谷歌发布的先进的嵌入模型,BERT是自然语言处理领域的一个重大突破,它在许多自然语言处理任务中取得了突出的成果,比如问答任务,文本生成,句子分类等等,BERT成功的

    2023年04月18日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包