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订阅;
即:
- 如果只有一个Consumer Group且组内有多个Consumer,那么相当于queue模式,消息会在group内负载均衡
- 如果有多个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
- Producer发布消息
- producer拦截器
- Producer自定义路由规则
4-3.Consumer
- 自动提交
- 手动提交
- 自定义Consumer拦截器
- 定义offset,提交回调方法
服务器
- 开启zookeeper(在安装目录下使用命令)
- 启动kafka(安装目录下使用命令)
- 创建topic
- 删除topic
- 查看topic名称列表
- 查看topic详情
- 创建Consumer
- 创建Producer
- 查询topic所有分区的offset值
- 查询kafka集群当前topic所有分区中的消息数目