当前位置: 首页 > news >正文

kafka 源码调研系列1 特色

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

     kafka 相关调研很多,其中以FrankHui大神(http://my.oschina.net/ielts0909)的kafka系列文章非常精彩,悲催的是,前期调研时候没有看到,老老实实的看完了Apache kafka官方文档(http://kafka.apache.org/introduction.html),但还是云里雾里,和同事讨论的时候发现很多细节都没有琢磨清楚,再看kafka孵化MQ产品MetaQ(http://www.iteye.com/magazines/107)的相关资料和FrankHui的系列博文,对照官方设计文档,有了更清楚的认识。

     kafka比较新颖的特色如以下:

     1 结合实时数据和离线大数据两种数据处理业务,因此方便有相关需求的同志不需要搭建hadoop专门处理离线数据,而后又搭建storm等来处理实时数据;

     2 采取文件系统作为数据存储介质,而不是像ZeroMq之类的基于内存的mq,设计体现的好处是既能保证高吞吐率的同时,又能保证极端情况下数据的恢复,更好的是,极大节约了内存成本。当然为了媲美基于内存MQ的读写性能,kafka做了一些巧妙的设计,最突出的就是利用顺序读写代替基于BTree的读写方式和Zero-copy(具体技术细节见https://www.ibm.com/developerworks/linux/library/j-zerocopy/)。另外,持久化的问题也迎刃而解。

     3 利用consumer存储消费信息,而非传统的broker存储,这样好处是避免的broker存储时对Message的多标签化。具体而言,如果由broker存储消息,一条Message的消费分为broker下发->consumer确认消费->broker确认3个状态,中间涉及两次网络通信,期间可能引起各种原因导致的重下发,而重下发又涉及到消息回滚的排序方式。简而言之,如果重下发的消息入队首,能够立刻下发,减小延迟,但是可能出现该消息错误引起的队列阻塞;入队尾,可能产生很长时间的延迟。
     如果换consumer存储消息,可以避免上述麻烦,感觉这个设计很赞,但是其存在基础是基于kafka顺序读写的设计方式。具体这样做有什么可能的弊端呢?自己当初设计类似流程的时候都在扣标签细节,怎么没有想到这个思路?思维太固化了还是新方案有什么缺陷?(欢迎讨论)

    4 利用游标offset来标注消费数据,可以非常方便的回滚信息。

    5 利用语义分区实现partition,并且保证一个分区发给一个消费组里面的一个consumer,由于partition中消息有序,从而保证该consumer的接收消息有序,从而实习数据收发一致性,并同时保证负载均衡。

    kafka可能的问题:

    1 负载均衡问题:如果有些生产者产生的消息远多于其它生产者,按每个代理对TCP连接进行平均分配可能会导致每个代理接收到的消息总数并不平均;

    2 消息推拉方式:kafka采用producer push消息,consumer poll消息的方式,可能会出现一些应用场景不匹配问题;

    3 partitions 没有副本控制。

    以上问题我在kafka 0.8中已经看到有所更新,衷心佩服各位大牛!

    接下去我去继续写一些关于源码和具体调试中关于kafka的一些想法。新人报道,知识水平,表达方式各方面都存在欠缺,希望大家海涵,同时也希望大家一定要多多指出不足,多多交流,谢谢。

 


   


转载于:https://my.oschina.net/u/591402/blog/145090

相关文章:

  • 小型数据库
  • JQuery在线手册
  • UNIX环境高级编程——线程和信号
  • 忘记mysql数据库root密码
  • SqlServer快捷键整理
  • 分析cocos2d-x中的CrystalCraze示例游戏
  • ios开发之导航控制器的原理
  • Windows下安装使用curl命令
  • paip.数据库发邮件通知配置
  • 20145328 《Java程序设计》实验二实验报告
  • UNIX网络编程——经常使用的套接字选项
  • 【Mysql 学习】SQL服务器模式
  • struts-default.xml解读
  • 用POP动画编写带富文本的自定义动画效果
  • 〖Linux〗不知谁写的,很实用的Linux命令
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • CSS实用技巧
  • flask接收请求并推入栈
  • Git初体验
  • HashMap ConcurrentHashMap
  • java8-模拟hadoop
  • JavaScript异步流程控制的前世今生
  • JS实现简单的MVC模式开发小游戏
  • mockjs让前端开发独立于后端
  • Node项目之评分系统(二)- 数据库设计
  • python 装饰器(一)
  • Python_OOP
  • React+TypeScript入门
  • ubuntu 下nginx安装 并支持https协议
  • ucore操作系统实验笔记 - 重新理解中断
  • web标准化(下)
  • 阿里云Kubernetes容器服务上体验Knative
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 多线程事务回滚
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 解决iview多表头动态更改列元素发生的错误
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 巧用 TypeScript (一)
  • 微信公众号开发小记——5.python微信红包
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Nginx实现动静分离
  • raise 与 raise ... from 的区别
  • #Linux(帮助手册)
  • #pragma预处理命令
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (三)docker:Dockerfile构建容器运行jar包
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)项目管理杂谈-我所期望的新人
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等