首先kafka的throughput
很牛逼,参考:http://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines

 

接着主要谈一下,Kafka的可靠性问题,有哪些机会可能丢数据?

从producer,broker,consumer的角度,分别看看

a. Producer到broker

    把request.required.acks设为1,丢会重发,丢的概率很小

b. Broker

    b.1 对于broker,落盘的数据,除非磁盘坏了,不会丢的

    b.2 对于内存中没有flush的数据,broker重启会丢
        可以通过log.flush.interval.messages和log.flush.interval.ms来配置flush间隔,interval大丢的数据多些,小会影响性能
        但在0.8版本,可以通过replica机制保证数据不丢,代价就是需要更多资源,尤其是磁盘资源,kafka当前支持GZip和Snappy压缩,来缓解这个问题
        是否使用replica取决于在可靠性和资源代价之间的balance

c. Consumer

    和其他的平台不同的是,其实Kafka真正比较复杂的是consumer,Kafka有两种consumer

    c.1 High-level consumer

    这个使用比较简单,已经封装了对partition和offset的管理,默认是会定期自动commit offset,这样可能会丢数据的,因为consumer可能拿到数据没有处理完crash
    之前我们在0.7上是使用这个接口的,为了保证不丢数据,把自动commit关掉,consumer处理完所有数据,再手动commit,这样丢数据的概率比较小

    对于storm,没法这样做,因为spout是会预读大量数据的,当然只要spout线程不crash,也是可以保证这些数据基本不会丢失(通过storm的acker机制)
    但如果spout线程crash,就会丢数据
    所以High-level接口的特点,就是简单,但是对kafka的控制不够灵活

    c.2 Simple consumer,low-level

    这套接口比较复杂的,你必须要考虑很多事情,优点就是对Kafka可以有完全的控制
    You must keep track of the offsets in your application to know where you left off consuming.
    You must figure out which Broker is the lead Broker for a topic and partition
    You must handle Broker leader changes

    在考虑如何将storm和kafka结合的时候,有一些开源的库,基于high-level和low-level接口的都有

    我比较了一下,还是kafka官方列的storm-kafka-0.8-plus比较靠谱些
    这个库是基于simple consumer接口实现的,看着挺复杂,所以我先读了遍源码,收获挺大,除了发现我自己代码的问题,还学到些写storm应用的技巧呵呵

    这个库会自己管理spout线程和partition之间的对应关系和每个partition上的已消费的offset(定期写到zk)
    并且只有当这个offset被storm ack后,即成功处理后,才会被更新到zk,所以基本是可以保证数据不丢的
    即使spout线程crash,重启后还是可以从zk中读到对应的offset

So, 结论就是kafka和storm的结合可靠性还是可以的,你真心不想丢数据,还是可以做到的
Kafka只是能保证at-least once逻辑,即数据是可能重复的,这个在应用上需要可以容忍
当然通过Storm transaction也是可以保证only once逻辑的,但是代价比较大,后面如果有这样的需求可以继续深入调研一下
对于kafka consumer,一般情况下推荐使用high-level接口,最好不要直接使用low-level,太麻烦

当前其实Kafka对consumer的设计不太到位,high-level太不灵活,low-level又太难用,缺乏一个medium-level
所以在0.9中consumer会被重新design,https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Client+Re-Design

Kafka可靠性的思考的更多相关文章

  1. RabbitMQ和Kafka可靠性

    RabbitMQ和Kafka可靠性 https://www.cnblogs.com/haolujun/p/9641840.html 我们通过前文知道,RabbitMQ的队列分为master queue ...

  2. 055 kafka可靠性与高性能

    一:可靠性 1. 二:高性能 1.

  3. kafka可靠性

    文章转载自: http://blog.csdn.net/u013256816/article/details/71091774

  4. Kafka的存储机制以及可靠性

    一.kafka的存储机制 kafka通过topic来分主题存放数据,主题内有分区,分区可以有多个副本,分区的内部还细分为若干个segment. 所谓的分区其实就是在kafka对应存储目录下创建的文件夹 ...

  5. kafka如何保证数据可靠性和数据一致性

    数据可靠性 Kafka 作为一个商业级消息中间件,消息可靠性的重要性可想而知.本文从 Producter 往 Broker 发送消息.Topic 分区副本以及 Leader 选举几个角度介绍数据的可靠 ...

  6. Kafka丢失数据问题优化总结

    数据丢失是一件非常严重的事情事,针对数据丢失的问题我们需要有明确的思路来确定问题所在,针对这段时间的总结,我个人面对kafka 数据丢失问题的解决思路如下: 是否真正的存在数据丢失问题,比如有很多时候 ...

  7. kafka学习笔记(一)消息队列和kafka入门

    概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...

  8. kafka主题offset各种需求修改方法

    简要:开发中,常常因为需要我们要认为修改消费者实例对kafka某个主题消费的偏移量.具体如何修改?为什么可行?其实很容易,有时候只要我们换一种方式思考,如果我自己实现kafka消费者,我该如何让我们的 ...

  9. 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局

    一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦 ...

随机推荐

  1. 在php4下可用,简单的php数组转成json格式,

    function array_to_json( $array ){     if( !is_array( $array ) ){         return false;     }       $ ...

  2. hdu 5284 BestCoder Round #48 ($) 1001 水题 *

    题意:看一个字符串中是否包含顺序的  w  y  h ,字符之间可以有其他字符,并且如果有多个连续的vv,则可以看做一个w 比较水,直接看代码 #include<cstdio> #incl ...

  3. SQLServer2008 和SQLServer2008 R2版本导出 数据库结构和数据sql

    ①SQLServer2008 版本导出 数据库结构和数据sql ②SQLServer2008R2 版本导出 数据库结构和数据sql 采集 #HUABAN_WIDGETS .HUABAN-red-nor ...

  4. transient的理解

    用法解释 1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. 2)transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被 ...

  5. mvc-4控制器和状态(2)

    访问视图 常见地视图模式时一个视图对应一个控制器,视图包含一个id,通过id传入控制器:在视图之中的元素则使用class 这里会使用jquery的选择器,为了减少使用,可以设置一个专门用于存放选择器到 ...

  6. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

    ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...

  7. sqlserver2008使用设置sa用户登录步骤

    1.打开sql server 2008,使用windows身份验证. 2.成功登录后,点击安全性->登录名,“sa”右键选择属性,设置密码,勾选“强制密码实施策略”. 3.然后选择属性页下的“状 ...

  8. Chart系列(一):Chart的基本元素

    如何使用一个Chart,则首先必须要了解其组织结构,其次知道其API. Chart元素 首先,来看看Chart组成元素. Axis Label:坐标轴标签   Axis Title:坐标轴标题   C ...

  9. 如何对Backbone.Collection进行过滤操作

    首先我想说的是这篇文章的题目起的很怪,因为我不知道起个什么名字比较好.渲染列表是我们应用中最常见的操作了吧,在运用Backbone的应用中,我们一般会把列表作为一个Collcetion,然后指定一个V ...

  10. 调用WebServiceWebService提示The maximum string content length quota (8192) has been exceeded while reading XML data的解决办法

    在web.config中,bindings节点下,对应的服务名称中,原本可能是自动折叠的“/>”,需要改成手动折叠的</binding>,然后在中间加上<readerQuota ...