1.broker
2.topic
消息分类器,用于存储与分类不同的消息数据
3.partition
![](https://i-blog.csdnimg.cn/blog_migrate/414b3c2b9ef6a4f4c0f4aeaa2ffd0968.png)
备份高可用
分配算法
![](https://i-blog.csdnimg.cn/blog_migrate/b3d5cd46dc1c84082a3d52edc3487f98.png)
4.producer,生产者
5.consumer,消费者
6.消费者组consumer group
7.传输方式
8.消息可靠性
kafka 有两种数据保存策略
生产者规则
9.与zookeeper关系
![](https://i-blog.csdnimg.cn/blog_migrate/020d8651d5485fb461a0aed76c0bdccc.png)
zookeeper是一个开源的分布式数据一致性的解决方案,分布式应用程序可以基于zookeeper实现数据发布订阅,负载均衡,命名服务,分布式协调,集群管理,分布式锁和分布式队列等一系列功能,可以保证如下分布式一致性特性:
1)顺序一致性:从同一个客户端发起的事务请求,最终将会严格按照其发起顺序被应用到zookeeper中去;
2)原子性:要么整个集群所有机器都成功应用了某一个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况;
3)单一视图:无论客户端连接的是哪个zookeeper服务器,其看到的服务器算数据模型都是一致的;
4)可靠性:一旦服务端成功得应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更会一致被保留下来,除非有另外一个事务又对其进行了变更;
5)实时性:zookeeper仅仅保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
ZAB协议
是一种专门为zookeeper设计的一种支持崩溃回复的原子广播协议,是一种通用的分布式一致性算法,基于该协议,zookeeper实现了一种主备模式的系统架构来保持集群中各副本之间数据的一致性。具体来说,zookeeper使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用ZAB的原子广播协议,将服务器数据的状态变更为以事务的形式广播到所有的副本进程上去,该协议的这个主备模式架构保证了同一时刻集群中只能够有一个主进程来广播服务器的状态变更。
简言之,该协议核心就是定义了对于那些会改变zookeeper服务器数据状态的事务请求的处理方式,所有事务请求都必须由一个全局唯一的服务器来协调处理,即leader服务器。
调控方式
调控方式
注册细节
10.SpringBoot整合
pom配置
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
properites文件配置
#kafka配置
spring.kafka.bootstrap-servers=xx.xx.xx.xx:9092
#producer
spring.kafka.producer.retries=0
spring.kafka.producer.batch-size=16384
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
#consumer
spring.kafka.consumer.group-id=cs_kafka_group
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.auto-commit-interval=100s
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
生产者代码
采用定时任务发消息
@Service
public class KafkaProducer {
private static Logger logger = LoggerFactory.getLogger(KafkaProducer.class);
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
private Gson gson = new GsonBuilder().create();
@Scheduled(cron = "0/3 * * * * *")
public void send() {
for (int i = 0; i < 5; i++) {
Message message = new Message();
message.setId(System.currentTimeMillis());
message.setMsg(UUID.randomUUID().toString() + "---" + i);
message.setSendTime(new Date());
logger.info("发送消息 ----->>>>> message = {}", gson.toJson(message));
kafkaTemplate.send("cstopic", gson.toJson(message));
}
}
}
消费者类
采用KafkaListener注解监听消息
@Component
public class KafkaCustomer {
private static Logger logger = LoggerFactory.getLogger(KafkaCustomer.class);
@KafkaListener(topics = {"cstopic"})
public void listen(ConsumerRecord<?, ?> record) {
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
Object message = kafkaMessage.get();
logger.info("----------------- record =" + record);
logger.info("------------------ message =" + message);
}
}
}
11.Linux kafka配置
单机版本config/server.properties配置
listeners=PLAINTEXT://:9092
# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
advertised.listeners=PLAINTEXT://xx.xx.xx.xx:9092
#创建topic
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic cstopic
#生产者发消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic cstopic
#消费者收消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic cstopic --from-beginning --group cs_kafka_group