• Kafka 消费语义


    作为一个消息系统,当消息从producer流到consumer,有许多因素都会影响到消息的消费,在kafka中,消息有3种消费语义:

    对于这3种语义,我们来看一下可能出现的场景

    producer端

    发送一条消息后,可能有几种状况和行为

    网络可能出错,导致producer端无法收到ack,producer又重新发送消息,在kafka0.11之前的版本,会导致消息在broker上重复写入(保证至少一次语义),但在0.11版本开始,通过引入PID及Sequence Number支持幂等性,保证精确一次语义

    根据producer端request.required.acks的配置取值,

    0:不等broker的ack就返回,性能最高,但有可能数据发出去了,但如石沉大海,实际没有发送成功,数据可能丢失

    1:leader确认消息存下来了,再返回,保证至少一次语义

    all:leader和ISR中所有replica都确认消息存下来了,再返回,保证至少一次语义

    broker端

    对上面acks设置为1的情况下,假如leader还没来得及复制消息就挂了,那么消息会丢失,因为producer端成功收ack,任务消息发送成功,不会再发送消息了,这是至多一次语义

    consumer端

    consumer消费消息时,有2种过程可供选择

    • 读取消息 -> 提交offset -> 处理消息

    如果保存offset成功,但处理消息失败,consumer又挂了,发生reblance,新接管的consumer将从上次保存的offset的下一条继续消费,导致消息丢失,保证至多一次语义,如下图所示:

    • 读取消息 -> 处理消息 -> 提交offset

    如果消息处理成功,但保存offset失败,consumer又挂了,导致刚才消费的offset没有被成功提交,发生reblance,新接管的consumer将从上次保存的offset的下一条继续消费,导致消息重复消费,保证至少一次语义,如下图所示

    参考:

    https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging#KIP-98-ExactlyOnceDeliveryandTransactionalMessaging-ProposedChanges

    http://www.jasongj.com/kafka/transaction/

    https://blog.csdn.net/mlljava1111/article/details/81180351

  • 相关阅读:
    visual basic VB.NET实例系列教程第三节(常用循环结构之乘法表与数列)
    visual basic VB.NET实例系列教程第二节(好玩又有趣的龟兔赛跑程序)
    visual basic VB.NET实例系列教程第一节(简单实用抽奖程序)
    对DevSecOps的一点认识
    轻便的一句话反弹shell语句
    ActiveMQ 反序列化漏洞(CVE-2015-5254)复现
    《信息安全风险管理》梗概
    微信服务商分账功能开发(PHP)
    哈夫曼编码—文件的压缩与解压(Java)
    哈夫曼编码—数据压缩与解压(Java)
  • 原文地址:https://www.cnblogs.com/benfly/p/9877154.html
Copyright © 2020-2023  润新知