一. kafka介绍:
1.消息分类按不同类别,分成不同的Topic,Topic⼜拆分成多个partition,每个partition均衡分散到不同的服务器(提⾼并发访问的能⼒)
2.消费者按顺序从partition中读取,不⽀持随机读取数据,但可通过改变保存到zookeeper中的offset位置实现从任意位置开始读取
3.服务器消息定时清除(不管有没有消费)
4.每个partition还可以设置备份到其他服务器上的个数以保证数据的可⽤性。通过Leader,Follower⽅式
5.zookeeper保存kafka服务器和客户端的所有状态信息.(确保实际的客户端和服务器轻量级)
6.在kafka中,⼀个partition中的消息只会被group中的⼀个consumer消费;每个group中consumer消息消费互相独⽴;我们可以认为⼀个group是⼀个"订阅"者,⼀个Topic中的每个partions,只会被⼀个"订阅者"中的⼀个consumer消费,不过⼀个consumer可以消费多个partitions中的消息
7.如果所有的consumer都具有相同的group,这种情况和queue模式很像;消息将会在consumers之间负载均衡.
8.如果所有的consumer都具有不同的group,那这就是"发布-订阅";消息将会⼴播给所有的消费者.
9.持久性,当收到的消息时先buffer起来,等到了⼀定的阀值再写⼊磁盘⽂件,减少磁盘IO.在⼀定程度上依赖OS的⽂件系统(对⽂件系统本身优化⼏乎不可能)
10.除了磁盘IO,还应考虑⽹络IO,批量对消息发送和接收,并对消息进⾏压缩。
11.在JMS实现中,Topic模型基于push⽅式,即broker将消息推送给consumer端.不过在kafka中,采⽤了pull⽅式,即consumer在和broker建⽴连接之后,主动去pull(或者说fetch)消息;这种模式有些优点,⾸先consumer端可以根据⾃⼰的消费能⼒适时的去fetch消息并处理,且可以控制消息消费的进度
(offset);此外,消费者可以良好的控制消息消费的数量,batch fetch.
12.kafka⽆需记录消息是否接收成功,是否要重新发送等,所以kafka的producer是⾮常轻量级的,consumer端也只需要将fetch后的offset位置注册到zookeeper,所以也是⾮常轻量级的.
--kafka使⽤场景,对于⼀些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势.不过到⽬前为⽌,我们应该很清楚认识到,kafka并没有提供JMS中的"事务性""消息传输担保(消息确认机制)""消息分组"等企业级特性;
kafka只能使⽤作为"常规"的消息系统,在⼀定程度上,尚未确保消息的发送与接收绝对可靠(⽐如,消息重发,消息发送丢失等).
kafka的特性决定它⾮常适合作为"⽇志收集中⼼";application可以将操作⽇志"批量""异步"的发送到kafka集群中,⽽不是保存在本地或者DB中;kafka可以批量提交消息/压缩消息等,这对
producer端⽽⾔,⼏乎感觉不到性能的开⽀.consumer端采⽤批量fetch⽅式,此时consumer端也可以使hadoop等其他系统化的存储和分析系统
二. kafka和RabbitMQ区别:
1、RabbitMQ,遵循AMQP协议,由内在⾼并发的erlanng语⾔开发,⽤在实时的对可靠性要求⽐较⾼的消息传递上(有消息确认机制)。
2、kafka是Linkedin于2010年12⽉份开源的消息发布订阅系统,它主要⽤于处理活跃的流式数据,⼤数据量的数据处理上(⽆消息确认机制,但吞吐量⾼),kafka⽤zk做集群负载均衡。
三. 项⽬中哪⾥⽤到了kafka,它有什么特性?
a. 场景:
i. ⼤数据部⻔流数据处理;
ii. elk;
b. 特性:
i. 它被设计为⼀个分布式系统,易于向外扩展;
ii. 它同时为发布和订阅提供⾼吞吐量;
iii. 它⽀持多订阅者,当失败时能⾃动平衡消费者;
iv. 它将消息持久化到磁盘,因此可⽤于批量消费,例如ETL,以及
实时应⽤程序。
四. kafka数据分区和消费者的关系,kafka的数据offset读取流程,kafka内部如何保证顺序,结合外部组件如何保证消费者的顺序?
1、kafka数据分区和消费者的关系:1个partition只能被同组的⼀个consumer消费,同组的consumer则起到均衡效果
2、kafka的数据offset读取流程
1).连接ZK集群,从ZK中拿到对应topic的partition信息和partition的Leader的相关信息
2).连接到对应Leader对应的broker
3).consumer将⾃⼰保存的offset发送给Leader
4).Leader根据offset等信息定位到segment(索引⽂件和⽇志⽂
件)
5).根据索引⽂件中的内容,定位到⽇志⽂件中该偏移量对应的开始
位置读取相应⻓度的数据并返回给consumer
3、kafka内部如何保证顺序:
kafka只能保证partition内是有序的,但是partition间的有序是没办
法的。爱奇艺的搜索架构,是从业务上把需要有序的打到同⼀个
partition。
5. kafka⼯作流程?
Apache Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项⽬的⼀部分。Kafka是⼀种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交⽇志服务。
a. ⽣产者定期向主题发送消息。 b. Kafka代理存储为该特定主题配置的分区中的所有消息。 它确保消息 在分区之间平等共享。 如果⽣产者发送两个消息并且有两个分区, Kafka将在第⼀分区中存储⼀个消息,在第⼆分区中存储第⼆消息。 c. 消费者订阅特定主题。 d. ⼀旦消费者订阅主题,Kafka将向消费者提供主题的当前偏移,并且 还将偏移保存在Zookeeper系综中。 e. 消费者将定期请求Kafka(如100 Ms)新消息。 f. ⼀旦Kafka收到来⾃⽣产者的消息,它将这些消息转发给消费者。 g. 消费者将收到消息并进⾏处理。 h. ⼀旦消息被处理,消费者将向Kafka代理发送确认。 i. ⼀旦Kafka收到确认,它将偏移更改为新值,并在Zookeeper中更新 它。 由于偏移在Zookeeper中维护,消费者可以正确地读取下⼀封邮 件,即使在服务器暴⼒期间。 j. 以上流程将重复,直到消费者停⽌请求。 k. 消费者可以随时回退/跳到所需的主题偏移量,并阅读所有后续消 息。