Kafka基础

2018-09-05

Kafka基础

[TOC]

1.概念

基于发布/订阅的消息系统(类似JMS特性,但设计实现却不同)

分布式/可分区/可复制/日志服务

官方文档↓

http://kafka.apache.org/documentation.html

2.场景

1.Messaging 常规消息

对于一些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势.不过到目前为止,我们应该很清楚认识到,kafka并没有提供JMS中的”事务性””消息传输担保(消息确认机制)””消息分组”等企业级特性;kafka只能使用作为”常规”的消息系统,在一定程度上,尚未确保消息的发送与接收绝对可靠(比如,消息重发,消息发送丢失等)

2.Websit activity tracking 网站活动追踪的最佳工具

可以将网页/用户操作等信息发送到kafka中.并实时监控,或者离线统计分析等

3.Log Aggregation 日志收集中心

kafka的特性决定它非常适合作为”日志收集中心”;application可以将操作日志”批量””异步”的发送到kafka集群中,而不是保存在本地或者DB中;kafka可以批量提交消息/压缩消息等,这对producer端而言,几乎感觉不到性能的开支.此时consumer端可以使hadoop等其他系统化的存储和分析系统.

3.结构

producer:提供者

将消息发布到Topic中,同时将决定该消息属于哪个Partition,比如基于”round-robin”方式或者通过其他的一些算法等.

consumer:消费者

每个Consumer都属于一个Consumer Group;

Consumer Group中可以存在多个Consumer;

Topic中的一个消息,只会被Group中的一个Consumer订阅;

即:

  1. 如果只有一个Consumer Group且组内有多个Consumer,那么相当于queue模式,消息会在group内负载均衡
  2. 如果有多个Consumer Group且组内只有一个Consumer,那么相当于topic模式,消息将会发布给所有Consumer

注意,一个partition内部不允许并发,组内如果有多于partition的consumer存在,将会有接受不到消息的consumer

建议partition数量为Consumer的倍数,这样可以提高性能和合理负载

topic:主题

逻辑上的概念,消息类别,物理上存在的是partition

partition:区

一个topic可以有多个partition区,每个partition都有存储xxx.log文件,

任何发布到此partition的消息都会append到log文件中,如

00000000000.log

00000000001.log

00000000002.log

每次的Record消息都拥有offset偏移量(下标) 0 ,1, 2, 3, 4…相对于partition内的有序队列

offset: 偏移量

每个partition中消息的偏移量,partition间互不影响,kafka通过offset来使用,时间复杂度为O(1),效率飞铲高

Record:消息

每一条消息都由Key/value和时间戳构成

broker: Server

kafka和JMS不同的是,即使消息被消费,也不会立马消失,会根据broker中的日志配置,如配置了两天后删除,那么无论消息是否被消费,两天后都会被清除

Distribution:分布

一个Topic可以有多个partition,每个partition都可以分配到集群的broker(负责partition读写操作)中,

broker中可以配置partition备份个数(Replicated),来完成负载均衡/高可用

Replicated:备份

基于partition的备份,可以备份在多个Server中

Guarantees:担保

1.发送到partition中的消息,将会按照他接受的消息追加到日志中

2.对于消费者而言,消息的接受顺序和日志的追加顺序保持一致

3.如果Topic中的 replicationfactor(复制因子) 为N ,那么允许N-1个实例失效(待深入)


精华传送门,入门+原理+配置说明

https://www.cnblogs.com/likehua/p/3999538.html


4.Java/服务器中的使用

详细使用代码地址

https://www.2cto.com/kf/201804/739331.html

JAVA

4-1.Maven依赖
4.2.Producer
  1. Producer发布消息
  2. producer拦截器
  3. Producer自定义路由规则
4-3.Consumer
  1. 自动提交
  2. 手动提交
  3. 自定义Consumer拦截器
  4. 定义offset,提交回调方法

服务器

  1. 开启zookeeper(在安装目录下使用命令)
  2. 启动kafka(安装目录下使用命令)
  3. 创建topic
  4. 删除topic
  5. 查看topic名称列表
  6. 查看topic详情
  7. 创建Consumer
  8. 创建Producer
  9. 查询topic所有分区的offset值
  10. 查询kafka集群当前topic所有分区中的消息数目