本篇文章是kafka的入门篇,主要介绍kafka一些基本的知识和架构,并没有涉及到一些原理的讲解,算是一篇入门文章。
一、kafka的特性
1.高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
2.可扩展性:kafka集群支持热扩展
3. 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
4. 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
5.高并发:支持数千个客户端同时读写
二、kafka的场景
1.消息队列:对于一些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势。
2.kafka可以作为"网站活性跟踪"的最佳工具,可以将网页/用户操作等信息发送到kafka中,并实时监控,或者离线统计分析等行为。
3.日志收集: application可以将操作日志"批量""异步"的发送到kafka集群中,而不是保存在本地或者DB中。kafka可以批量提交消息/压缩消息等,这对producer端而言,几乎感觉不到性能的开支,此时consumer端可以使hadoop等其他系统化的存储和分析系统。
三、kafka介绍
kafka的拓扑关系图如下所示:
kafka由producer、broker、comsumer和zookeeper几部分构成,kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Cosumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。
无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。
1.Topic/logs
一个Topic可以认为是一类消息,每个topic将被分成多个partition(区),每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型数字,它是唯一标记一条消息,它唯一的标记一条消息。
每一条消息被发送到broker中,会根据partition规则选择被存储到哪一个partition。如果partition规则设置的合理,所有消息可以均匀分布到不同的partition里,这样就实现了水平扩展。(如果一个topic对应一个文件,那这个文件所在的机器I/O将会成为这个topic的性能瓶颈,而partition解决了这个问题)。
备注:可以通过配置文件中的参数来配置partition的数量 num.partitions=3
2.Producers
Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition,比如基于"round-robin"方式。
3.Consumers
每个consumer属于一个consumer group,反过来说,每个group中可以有多个consumer。发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费。
如果所有的consumer都具有相同的group,这种情况和queue模式很像,消息将会在consumers之间负载均衡。
如果所有的consumer都具有不同的group,那这就是"发布-订阅",消息将会广播给所有的消费者。
在kafka中,一个partition中的消息只会被group中的一个consumer消费。
每个group中consumer消息消费互相独立;我们可以认为一个group是一个"订阅"者,一个Topic中的每个partions,只会被一个"订阅者"中的一个consumer消费,不过一个consumer可以消费多个partitions中的消息。kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的。而不同的partition之间的消息的顺序性是保证不了的。
4.zookeeper
zookeeper保存consumer和producer状态信息,kafka集群几乎不需要维护任何consumer和producer状态信息,这样producer和comsumer的实现就很轻量级,他们可以轻易的离开集群而不会对整个集群产生额外的影响。
代码语言:javascript复制zookeeper协调控制的事情:
1. 管理broker与consumer的动态加入与离开。(Producer不需要管理,随便一台计算机都可以作为Producer向Kakfa Broker发消息)
2. 触发负载均衡,当broker或consumer加入或离开时会触发负载均衡算法,使得一
个consumer group内的多个consumer的消费负载平衡。(因为一个comsumer消费一个或多个partition,一个partition只能被一个consumer消费)
3. 维护消费关系及每个partition的消费信息。
实现方式:
1. 每个broker启动后会在zookeeper上注册一个临时的broker registry,包含broker的ip地址和端口号,所存储的topics和partitions信息。
2. 每个consumer启动后会在zookeeper上注册一个临时的consumer registry:包含consumer所属的consumer group以及订阅的topics。
3. 每个consumer group关联一个临时的owner registry和一个持久的offset registry。
对于被订阅的每个partition包含一个owner registry,内容为订阅这个partition的consumer id;
同时包含一个offset registry,内容为上一次订阅的offset。
参考资料:
1.https://www.cnblogs.com/likehua/p/3999538.html 2.https://honeypps.com/mq/deep-interpretation-of-kafka-data-reliability/
3.https://www.infoq.cn/article/kafka-analysis-part-1/
4.https://www.cnblogs.com/bbgasj/p/4176915.html
5.https://blog.csdn.net/u013573133/article/details/48142677