zoukankan      html  css  js  c++  java
  • Kafka 信息整理

    请说明什么是传统的消息传递方法?

    传统的消息传递方法包括两种:

    ·排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人。

    ·发布-订阅:在这个模型中,消息被广播给所有的用户。

    为什么要使用 kafka,为什么要使用消息队列

    缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。

    解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。

    冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。

    健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。

    异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

    kafka 为什么那么快

    Cache Filesystem Cache PageCache缓存

    顺序写 由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。

    Zero-copy 零拷技术减少拷贝次数

    Batching of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。

    Pull 拉模式 使用拉模式进行消息的获取消费,与消费端处理能力相符。

    kafka producer 打数据,ack  

    1(默认)  数据发送到Kafka后,经过leader成功接收消息的的确认,就算是发送成功了。在这种情况下,如果leader宕机了,则会丢失数据。
    0 生产者将数据发送出去就不管了,不去等待任何返回。这种情况下数据传输效率最高,但是数据可靠性确是最低的。
    -1 producer需要等待ISR中的所有follower都确认接收到数据后才算一次发送完成,可靠性最高。当ISR中所有Replica都向Leader发送ACK时,leader才commit,这时候producer才能认为一个请求中的消息都commit了。

    Kafka中的消息是否会丢失和重复消费?

    要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消息消费。

    1、消息发送

             Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过producer.type属性进行配置。Kafka通过配置request.required.acks属性来确认消息的生产:

    0---表示不进行消息接收是否成功的确认;
    1---表示当Leader接收成功时确认;
    -1---表示Leader和Follower都接收成功时确认;
    综上所述,有6种消息生产的情况,下面分情况来分析消息丢失的场景:

    (1)acks=0,不和Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;

    (2)acks=1、同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;

    2、消息消费

    Kafka消息消费有两个consumer接口,Low-level API和High-level API:

    Low-level API:消费者自己维护offset等值,可以实现对Kafka的完全控制;

    High-level API:封装了对parition和offset的管理,使用简单;

    如果使用高级接口High-level API,可能存在一个问题就是当消息消费者从集群中把消息取出来、并提交了新的消息offset值后,还没来得及消费就挂掉了,那么下次再消费时之前没消费成功的消息就“诡异”的消失了;

    解决办法:

            针对消息丢失:同步模式下,确认机制设置为-1,即让消息写入Leader和Follower之后再确认消息发送成功;异步模式下,为防止缓冲区满,可以在配置文件设置不限制阻塞超时时间,当缓冲区满时让生产者一直处于阻塞状态;

            针对消息重复:将消息的唯一标识保存到外部介质中,每次消费时判断是否处理过即可。

    消息重复消费及解决参考:https://www.javazhiyin.com/22910.html

    Kafka中是怎么体现消息顺序性的?

    kafka每个partition中的消息在写入时都是有序的,消费时,每个partition只能被每一个group中的一个消费者消费,保证了消费时也是有序的。
    整个topic不保证有序。如果为了保证topic整个有序,那么将partition调整为1.

    解释Kafka的用户如何消费信息?

    在Kafka中传递消息是通过使用sendfile API完成的。它支持将字节从套接口转移到磁盘,通过内核空间保存副本,并在内核用户之间调用内核。

  • 相关阅读:
    2016 -03-08 静态库 .a
    2016 -03 -07 搜索功能 模糊查询
    2016 -03 -07 字符串是否包含字符串/字符
    2016-03-04 一个完整的model 样式
    2016-03-01 地图定位 以及失败
    2016-03-01 svn conerstone
    2016-03-01 svn .a 不能上传到conerstone上的解决
    2016-02-29 不能真机调试的问题
    2016-02-28 00:53:21 version 与build
    Add Two Numbers
  • 原文地址:https://www.cnblogs.com/yizhou35/p/12026744.html
Copyright © 2011-2022 走看看