java卡夫卡接收消息_kafka java消费者消息拉取

本文详细介绍了Java Kafka消费者如何在版本2.4.0中接收消息。消费者首先确保加入组并获取分配的topic分区,然后通过发送OffsetFetchRequest获取每个分区的消费偏移量。在接收到消息时,消费者使用fetchRequests()方法拉取数据,并通过fetchRecords()解析消息。整个过程包括拉取请求的构造、发送、响应处理和消息解析,确保了消息的正确消费。
摘要由CSDN通过智能技术生成

版本2.4.0

Kafka的客户端消费者在启动的过程中会通过ensureActiveGroup()方法来确保自己是可用的消费者,在这个方法中,会向kafka的broker集群发送join请求,在join请求的response中可以得到该生产者所订阅的topic中被分配得到的分区信息。而接下来的消息拉取将会只请求此处分配得到的topic分区。此时,当前获得的topic分区的消费偏移量还是未知的,在正式拉取消息之前需要构造fetchOffset请求得到具体的偏移量位置以便消费。

private RequestFuture> sendOffsetFetchRequest(Setpartitions) {

Node coordinator = checkAndGetCoordinator();

if (coordinator == null)

return RequestFuture.coordinatorNotAvailable();

log.debug("Fetching committed offsets for partitions: {}", partitions);

// construct the request

OffsetFetchRequest.Builder requestBuilder = new OffsetFetchRequest.Builder(this.groupId,

new ArrayList<>(partitions));

// send the request with a callback

return client.send(coordinator, requestBuilder)

.compose(new OffsetFetchResponseHandler());

}

每次当kafka的消费者需要通过poll()方法拉取消息的时候,将会通过sendFetches()方法来试图拉取消息。

在准备发送fetch请求拉取消息的时候,首先需要通过prepareFetchRequests()方法来准备fetch请求。

已经完成拉取而没有实际处理的topic分区暂时没有必要再次拉取消息,而过滤掉以上情况的broker分配给该消费者的topic分区,将会用来做发送fetch请求的准备。

private ListfetchablePartitions() {

Setexclude = new HashSet<>();

if (nextInLineRecords != null && !nextInLineRecord

卡夫卡通过其内部的设计机制保证消息不被重复消费,主要依赖以下几个组件: 1. **分区(Partition)**:消息被划分为多个分区,每个分区都有唯一的分区ID。当消息发布到特定主题时,可以根据键值(key)的哈希值确定它会被发送到哪个分区。 2. **偏移量(Offset)**:每个分区都有一个独立的偏移量索引,记录了消费者消费的位置。消息按照顺序存储,新的消息会替换旧的消息。 3. **消费者组(Consumer Group)**:一组消费者可以组成一个消费者组,它们共享相同的分区分配策略。这意味着如果有多个消费者订阅同一主题的分区,他们的消费进度将同步。 4. **幂等性(Idempotence)**:有些消息天生就是幂等的,即多次消费不会带来副作用。例如,更新数据库的操作,理论上执行多次结果一致。 5. **消息确认机制(Commit and Offset)**:消费者读取并处理完消息后,向Kafka服务器提交偏移量确认。如果消费者意外断开连接,Kafka基于这个已确认的偏移量继续推送给其他消费者。 6. **消息幂等标记(Offset Commit)**:Kafka允许设置消息幂等标记,如果消息无法正常处理,消费者可以选择回滚到上一个有效偏移量,防止重复处理。 7. **事务消息(Transactional Messages)**:对于一些需要原子性的操作,Kafka提供了一定的事务支持,确保消息要么全部成功,要么全部失败。 总之,通过以上机制,卡夫卡确保了消息在分布式环境下的唯一性,避免了重复消费的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值