5分钟了解Kafka
2016-07-20 00:00
169 查看
带着“为啥要用Kafka”这样的问题,读了下面这些关于Kafka的文档,把一些Kafka特性的东西摘抄出来。假设读者对标准的队列服务有认识,了解生产者、消费者、发布者、订阅者、queue、topic这些概念,这里摘抄的基本都是Kafka不符合我们理解的标准队列服务的特性。
Kafka入门经典教程 2014-1
分布式发布订阅消息系统 Kafka 架构设计 2013-11
Apache kafka原理与特性(0.8V) 2014-9
###Kafka消息
……即使消息被消费,消息仍然不会被立即删除.日志文件将会根据broker中的配置要求,保留一定的时间之后删除。
本质上kafka只支持Topic.
如果所有的consumer都具有相同的group,这种情况和JMS queue模式很像;消息将会在consumers之间负载均衡.
如果所有的consumer都具有不同的group,那这就是"发布-订阅";消息将会广播给所有的消费者.
partitions的设计目的……最根本原因是……来避免文件尺寸达到单机磁盘的上限……(以及)消息保存/消费的效率。
###Kafka消费者
对于consumer而言,它需要保存消费消息的offset。
kafka集群几乎不需要维护任何consumer和producer状态信息,这些信息有zookeeper保存。
当consumer启动时,所触发的操作:
首先进行"Consumer id Registry";
然后在"Consumer id Registry"节点下注册一个watch用来监听当前group中其他consumer的"leave"和"join";只要此znode path下节点列表变更,都会触发此group下consumer的负载均衡.(比如一个consumer失效,那么其他consumer接管partitions).
在"Broker id registry"节点下,注册一个watch用来监听broker的存活情况;如果broker列表变更,将会触发所有的groups下的consumer重新balance.
###Kafka消费方式
在JMS实现中,Topic模型基于push方式,即broker将消息推送给consumer端.不过在kafka中,采用了pull方式.
……,当消息消费成功后,(消费者)向zookeeper提交消息的offset,而不会向broker交付ACK.或许你已经意识到,这种"宽松"的设计,将会有"丢失"消息/"消息重发"的危险.
对于JMS实现,消息传输担保非常直接:有且只有一次(exactly once).在kafka中稍有不同,……
at most once: 消费者fetch消息,然后保存offset,然后处理消息;
at least once: 消费者fetch消息,然后处理消息,然后保存offset。
exactly once: kafka中并没有严格的去实现(基于2阶段提交,事务),我们认为这种策略在kafka中是没有必要的。
###啊,不要停
kafka中,replication策略是基于partition,而不是topic;kafka将每个partition数据复制到多个server上,任何一个partition有一个leader和多个follower(可以没有);
Follower就像一个"consumer"(broker内销),消费消息并保存在本地日志中;leader负责跟踪所有的follower状态,如果follower"落后"太多或者失效,leader将会把它从replicas同步列表中删除。
当所有的follower都将一条消息保存成功,此消息才被认为是"committed",那么此时consumer才能消费它。
即使只有一个replicas实例存活,仍然可以保证消息的正常发送和接收,只要zookeeper集群存活即可.(备注:不同于其他分布式存储,比如hbase需要"多数派"存活才行)
当leader失效时,需在followers中选取出新的leader,可能此时follower落后于leader,因此需要选择一个"up-to-date"的follower。
###Why Kafka?
和标准的队列系统来比,Kafka的吞吐量和处理机制还是很有特性的。和ZeroMQ的对比就不那么明显了。看到知乎里说,Kafka也可以用ZeroMQ做底层通信机制,换句话说Kafka和ZeroMQ不完全是一个层级的东西。
总之,看了一些不同消息产品的对比文章,反而对RabbitMQ和0MQ有了好感。
[消息队列软件产品大比拼] (http://www.cnblogs.com/amityat/archive/2011/08/31/2160293.html) MSmQ vs ActvieMQ vs RabbitMQ vs 0MQ
消息队列的选择 Kafka vs RabbitMQ vs 0MQ
###那到底什么时候用?
动态汇总(News feed)功能。将你朋友的各种活动信息广播给你相关性以及排序。
安全:网站需要屏蔽行为不端的网络爬虫(crawler),对API的使用进行速率限制,探测出扩散垃圾信息的企图,并支撑其它的行为探测和预防体系,以切断网站的某些不正常活动。
运营监控:大多数网站都需要某种形式的实时且随机应变的方式,对网站运行效率进行监控并在有问题出现的情况下能触发警告。
报表和批处理: 将数据装载到数据仓库或者Hadoop系统中进行离线分析,然后针对业务行为做出相应的报表,这种做法很普遍。
Kafka入门经典教程 2014-1
分布式发布订阅消息系统 Kafka 架构设计 2013-11
Apache kafka原理与特性(0.8V) 2014-9
###Kafka消息
……即使消息被消费,消息仍然不会被立即删除.日志文件将会根据broker中的配置要求,保留一定的时间之后删除。
本质上kafka只支持Topic.
如果所有的consumer都具有相同的group,这种情况和JMS queue模式很像;消息将会在consumers之间负载均衡.
如果所有的consumer都具有不同的group,那这就是"发布-订阅";消息将会广播给所有的消费者.
partitions的设计目的……最根本原因是……来避免文件尺寸达到单机磁盘的上限……(以及)消息保存/消费的效率。
###Kafka消费者
对于consumer而言,它需要保存消费消息的offset。
kafka集群几乎不需要维护任何consumer和producer状态信息,这些信息有zookeeper保存。
当consumer启动时,所触发的操作:
首先进行"Consumer id Registry";
然后在"Consumer id Registry"节点下注册一个watch用来监听当前group中其他consumer的"leave"和"join";只要此znode path下节点列表变更,都会触发此group下consumer的负载均衡.(比如一个consumer失效,那么其他consumer接管partitions).
在"Broker id registry"节点下,注册一个watch用来监听broker的存活情况;如果broker列表变更,将会触发所有的groups下的consumer重新balance.
###Kafka消费方式
在JMS实现中,Topic模型基于push方式,即broker将消息推送给consumer端.不过在kafka中,采用了pull方式.
……,当消息消费成功后,(消费者)向zookeeper提交消息的offset,而不会向broker交付ACK.或许你已经意识到,这种"宽松"的设计,将会有"丢失"消息/"消息重发"的危险.
对于JMS实现,消息传输担保非常直接:有且只有一次(exactly once).在kafka中稍有不同,……
at most once: 消费者fetch消息,然后保存offset,然后处理消息;
at least once: 消费者fetch消息,然后处理消息,然后保存offset。
exactly once: kafka中并没有严格的去实现(基于2阶段提交,事务),我们认为这种策略在kafka中是没有必要的。
###啊,不要停
kafka中,replication策略是基于partition,而不是topic;kafka将每个partition数据复制到多个server上,任何一个partition有一个leader和多个follower(可以没有);
Follower就像一个"consumer"(broker内销),消费消息并保存在本地日志中;leader负责跟踪所有的follower状态,如果follower"落后"太多或者失效,leader将会把它从replicas同步列表中删除。
当所有的follower都将一条消息保存成功,此消息才被认为是"committed",那么此时consumer才能消费它。
即使只有一个replicas实例存活,仍然可以保证消息的正常发送和接收,只要zookeeper集群存活即可.(备注:不同于其他分布式存储,比如hbase需要"多数派"存活才行)
当leader失效时,需在followers中选取出新的leader,可能此时follower落后于leader,因此需要选择一个"up-to-date"的follower。
###Why Kafka?
和标准的队列系统来比,Kafka的吞吐量和处理机制还是很有特性的。和ZeroMQ的对比就不那么明显了。看到知乎里说,Kafka也可以用ZeroMQ做底层通信机制,换句话说Kafka和ZeroMQ不完全是一个层级的东西。
总之,看了一些不同消息产品的对比文章,反而对RabbitMQ和0MQ有了好感。
[消息队列软件产品大比拼] (http://www.cnblogs.com/amityat/archive/2011/08/31/2160293.html) MSmQ vs ActvieMQ vs RabbitMQ vs 0MQ
消息队列的选择 Kafka vs RabbitMQ vs 0MQ
###那到底什么时候用?
动态汇总(News feed)功能。将你朋友的各种活动信息广播给你相关性以及排序。
安全:网站需要屏蔽行为不端的网络爬虫(crawler),对API的使用进行速率限制,探测出扩散垃圾信息的企图,并支撑其它的行为探测和预防体系,以切断网站的某些不正常活动。
运营监控:大多数网站都需要某种形式的实时且随机应变的方式,对网站运行效率进行监控并在有问题出现的情况下能触发警告。
报表和批处理: 将数据装载到数据仓库或者Hadoop系统中进行离线分析,然后针对业务行为做出相应的报表,这种做法很普遍。
相关文章推荐
- mongo实现消息队列
- Kafka 之 中级
- 进程间通信之深入消息队列的详解
- 基于条件变量的消息队列 说明介绍
- Linux下Kafka单机安装配置方法(图文)
- PHP消息队列用法实例分析
- PHP使用php-resque库配合Redis实现MQ消息队列的教程
- PHP+memcache实现消息队列案例分享
- Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
- Python中线程的MQ消息队列实现以及消息队列的优点解析
- Kafka使用入门教程第1/2页
- 利用Python学习RabbitMQ消息队列
- Python的消息队列包SnakeMQ使用初探
- Logstash 与Elasticsearch整合使用示例
- 大数据实验室(大数据基础培训)——Kafka的安装、配置及基础使用
- 大数据实验室(大数据基础培训)——概要
- kafka-manager 的编译和使用(附安装包)
- Kafka源码调试环境搭建
- Kafka+Log4j实现日志集中管理