2024年大数据最全【大数据】Kafka高频面试题(四)_kafka消息发送的几种模式

本文详细探讨了Kafka中的三种消息发送模式:发后即忘、同步和异步,并根据业务场景选择合适的方法。此外,文章还介绍了分区的作用,如何设置分区数以优化性能,以及Kafka的副本机制和读写高速实现的关键技术,如零拷贝和消息批量处理。
摘要由CSDN通过智能技术生成

发后即忘发送模式

发后即忘模式「fire-and-forget」,它只管发送消息,并不需要关心消息是否发送成功。其本质上也是一种异步发送的方式,消息先存储在缓冲区中,达到设定条件后再批量进行发送。这是 kafka 吞吐量最高的方式,但同时也是消息最不可靠的方式,因为对于发送失败的消息并没有做任何处理,某些异常情况下会导致消息丢失。

同步发送模式

同步发送模式 「sync」,调用 send() 方法会返回一个 Future 对象,再通过调用 Future 对象的 get() 方法,等待结果返回,根据返回的结果可以判断消息是否发送成功, 由于是同步发送会阻塞,只有当消息通过 get() 返回数据时,才会继续下一条消息的发送。

异步发送模式

异步发送模式「async」,在调用 send() 方法的时候指定一个 callback 函数,当 Broker 接收到返回的时候,该 callback 函数会被触发执行,通过回调函数能够对异常情况进行处理,当调用了回调函数时,只有回调函数执行完毕生产者才会结束,否则一直会阻塞

以上三种方式各有各的特点,具体还要看业务的应用场景适合哪一种:

1)**场景1:**如果业务只是关心消息的吞吐量,且允许少量消息发送失败,也不关注消息的发送顺序的话,那么可以使用发后即忘发送「fire-and-forget」的方式,配合参数 acks = 0,这样生产者并不需要等待服务器的响应,以网络能支持的最大速度发送消息。
2)场景2:如果业务要求消息必须是按顺序发送的话,且数据只能落在一个 Partition 上,那么可以使用同步发送「sync」的方式,并结合参数来设置 retries 的值让消息发送失败时可以进行多次重试「retries > 0」,再结合参数设置「acks=all & max_in_flight_requests_per_connection=1」,可以控制生产者在收到服务器成功响应之前只能发送1条消息,在消息发送成功后立即进行 flush, 从而达到控制消息顺序发送。
3)**场景3:**如果业务需要知道消息是否发送成功,但对消息的顺序并不关心的话,那么可以用「异步async + 回调 callback 函数」的方式来发送消息,并配合参数 retries=0,待发送失败时将失败的消息记录到日志文件中进行后续处理。

32.Kafka 为什么要设计分区?

其实这个问题说来很简单, 假如不进行分区的话就如同 MySQL 单表存储一样,发消息就会被集中存储,这样会导致某台 Kafka 服务器存储 Topic 消息过多,如果在写消息压力很大的情况下,最终会导致这台 Kafka 服务器吞吐量出现瓶颈, 因此 Kafka 设计了分区的概念,同时也带来了「负载均衡」、「横向扩展」的能力,如下图所示:。

1)**负载均衡:**发送消息时可以根据分区的数量进行数据均匀分布,使其落在不同的分区上, 这样可以提高并发写性能;同时消费的时候多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力,提高读消息性能。
2)**横向扩

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值