美文网首页
kafka消息流转解读

kafka消息流转解读

作者: 浅浅微笑_da3b | 来源:发表于2019-06-07 19:25 被阅读0次

    Apache kafka是消息中间件的一种,笔者在学习其中的一些概念时,遇到了不少坑,其本质原因在于官方文档和一些博客对其核心概念的解释要么不够深入,要么不够通俗,加大了学习成本。因此在这里记录下学习过程中自己的理解,一方面加强记忆,一方面分享自己的心得

    参考文档

    kafka官网
    orchome kafka教程参考
    qingyunzong的博客

    • Broker
      已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker). 消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。
    • Topic
      Kafka将消息种子(Feed)分门别类,每一类的消息称之为一个主题(Topic).
    • Partition
      一个topic所有的消息在一个或多个partition中分开存储,注意,每个partition存储不同的消息,且每个partition内消息是有序的,partition的意义是实现高的吞吐量
    • Replication
      我们可以为Partition配置备份,从而保证高可用
    • Producer
      发布消息的对象称之为主题生产者(Kafka topic producer)
    • Consumer Group
      kafka使用Consumer Group的概念对消息进行消费,一个Consumer Group内可能有多个成员,一般情况下,一个成员消费topic中的一个或多个partition,但每个partition不会同时分配给多个成员。可以理解为,在理想情况下,一个Consumer Group对一个topci进行消费后,每个消息只被消费了一次。如果group中的成员数目多于partition,那么多出的成员不会分配到partition,因此不会消费到任何消息。
    • offset
      从Consumer Group的解析可以看出,Consumer Group中的成员消耗一个或者多个partition,如何记录消息是否消费呢?对于每个partition来说,消息是有序的,kafka通过提交offset来记录消息的消费情况。早起的offset存在zookeeper,现在存在kafka,你也可以存到其他地方,比如你可能为了实现恰好消费一次的语义而把offset和业务数据存在一个库中
    • consumer position
      这个概念是我自己的一个理解,但是在编码时是一个重要的概念,我们可以随意的提交offset至任何位置,例如,现在有10条消息,我们消费完第一条,但是可以提交offset至5;或者我们已经消费了7条消息,但是我们仅仅提交offset为4。我们往往不会这么做,但是必须清楚如果我们这么做了,或者因为某些bug出现了这样的情况,接下来会发生什么。首先,无论提交的offset是超前了还是滞后了,最终offset都会被正常保存。接下来客户端poll消息的时候,不会受到任何影响,最终,我们仍然收到了10条消息。也就是说,poll消息使用的是单独的position,在这里我称之为consumer position。可以理解为offset维护的是我们已经消费的消息的偏移量,而position维护了我们之后需要从partition的哪个位置拉取消息

    消息流转解读

    以上是基本概念介绍,接下来介绍一下消息是如何从生产者流向消费者的。

    • 生产者发送消息至某个topic,假设其发送了30条消息,且该topic有三个partition,那么消息最终可能有9条在partition1,11条在partition2,10条在partition3。生产者可以自己控制把消息发送到哪个分区
    • 消费者声明其所在的消费者组,每个消费者组消费某一个主题的策略是,消费者组中的不同消费者会消费该主题不同的分区,如果消费者多于分区,则多出的消费者不会消费到消息。如果恰好相等,则每个消费者消费一个分区,如果消费者少于分区,某些消费者会消费多个分区,但是可以确定的是,一个分区最终只会被一个消费者消费。消费者负责维护该分区下一条未被消费的消息的offset

    相关文章

      网友评论

          本文标题:kafka消息流转解读

          本文链接:https://www.haomeiwen.com/subject/hmhvxctx.html