• Kafka(分布式流式系统)


    Kafka如何保证顺序消费

    发送端:
    发送端不能异步发送,异步发送在发送失败的情况下,就没办法保证消息顺序。

    存储端:
    (1)消息不能分区。也就是一个topic,只能有一个队列。在Kafka中,它叫做partition;在RocketMQ中,它叫做queue。 如果你有多个队列,那同一个topic的消息,会分散到多个分区里面,自然不能保证顺序。

    (2)即使只有一个队列的情况下,会有第2个问题。该机器挂了之后,能否切换到其他机器?也就是高可用问题。

    比如你当前的机器挂了,上面还有消息没有消费完。此时切换到其他机器,可用性保证了。但消息顺序就乱掉了。

    要想保证,一方面要同步复制,不能异步复制;另一方面得保证,切机器之前,挂掉的机器上面,所有消息必须消费完了,不能有残留。很明显,这个很难。

    接收端:
    对于接收端,不能并行消费,也即不能开多线程或者多个客户端消费同一个队列。

    如何保证不重复,不丢失

    Kafka消息保证生产的信息不丢失和重复消费问题
    1)使用同步模式的时候,有3种状态保证消息被安全生产,在配置为1(只保证写入leader成功)的话,如果刚好leader partition挂了,数据就会丢失。

    2)还有一种情况可能会丢失消息,就是使用异步模式的时候,当缓冲区满了,如果配置为0(还没有收到确认的情况下,缓冲池一满,就清空缓冲池里的消息),数据就会被立即丢弃掉。

    在数据生产时避免数据丢失的方法:
    只要能避免上述两种情况,那么就可以保证消息不会被丢失。
    1)就是说在同步模式的时候,确认机制设置为-1,也就是让消息写入leader和所有的副本。

    2)还有,在异步模式下,如果消息发出去了,但还没有收到确认的时候,缓冲池满了,在配置文件中设置成不限制阻塞超时的时间,也就说让生产端一直阻塞,这样也能保证数据不会丢失。在数据消费时,避免数据丢失的方法:如果使用了storm,要开启storm的ackfail机制;如果没有使用storm,确认数据被完成处理之后,再更新offset值。低级API中需要手动控制offset值。

  • 相关阅读:
    cocos2d-x 3.0rc1 编译cpp-testsproject
    [wxWidgets]_[0基础]_[不常见但有用的类wxStandardPaths]
    教你摆脱低级程序猿 项目中cocopads的安装使用
    Android使用代码模拟HOME键的功能
    UVA 1508
    asp.net mvc5 安装
    Java_并发线程_Semaphore、CountDownLatch、CyclicBarrier、Exchanger
    crm操作产品实体
    BZOJ 3172 [Tjoi2013]单词 AC自己主动机(fail树)
    ADO与ADO.Net
  • 原文地址:https://www.cnblogs.com/yyml181231/p/12693480.html
Copyright © 2020-2023  润新知