定义
应用目的
削峰(缓冲)
略
解耦
基于消息的通信是平台无关、语言无关的,只取决于通信双方是否可以正确解析消息内容
异步
同步接口转异步的常规套路
应用场景
分布式事务
通过将分布式事务拆分为流程
不同流程节点对应不同 topic,结合分布式锁可以实现分布式事务
通信次数多但单个消息处理简单
日志、用户活动跟踪、监控
Producer
生产者,生产消息的一方
Consumer
消费者,使用消息的一方
Topic
主题,约等于消息的类型
Partition
分区,是某个 Topic 的一部分
broker
代表存储数据的物理设备
通常对于一个 Topic 而言,不同的 Partition 需要分布在不同的 broker 上
Consumer Group
消费者组,一个消费者组可以共同消费一个 Topic
但 Topic 中的一个 Partition 只能由消费者组中的一个消费者消费
Replication
副本,是对某 Topic 的某 Partition 的备份
Leader
主副本,生产和消费行为只针对 leader
Follower
从副本
主副本存活时,生产和消费行为与 follower 无关
follower 只定期从 leader 同步信息,作为备份
leader 宕机后 follower 会代替
Zookeeper
Kafka 2.8.0 后可以不配合 Zookeeper
作为 kafka broker 和 topic 的注册中心,信息存放于
通信模式
模型
工作流程
send()
batch.size
大小,默认 16Klinger.ms
时间,默认 0ms,即无延时分区策略
默认分区策略
key.hashcode()%partitionCount
自定义分区策略
自定义分区器
public class XXPartitioner implements Partitioner{
@Override
public int partition(String topic,Object key,byte[] keyBytes,Object value, byte[] valueBytes,Cluster cluster){
//String topic 主题
//Object key 键
//byte[] keyBytes 序列化之后的键的字节数组
//Object value 值
//byte[] valueBytes 序列化之后的值的字节数组
//Cluster cluster 集群
}
}
使用分区器
Properties properties = new Properties();
...
properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.xx.xx.xx.XXPartitioner");
...