面试题:说一说kafka工作的流程?

      相信大家读完本文就可以知道该如何回答了,首先我们先来了解下kafka分区, 分区(Partition)是最小的并行单位 一个消费者可以消费多个分区 、一个分区可以被多个消费者组里的消费者消费,但是,一个分区不能同时被同一个消费者组里的多个消费者消费。

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka

发布-订阅模式:每个消费者都属于不同的消费者组

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka两个节点的消费者_02

点对点(一对一) :   所有消费者都属于同一个消费者组

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka两个节点的消费者_03

 分区与消息顺序:同一个生产者发送到同一分区的消息,先发送的偏移量(offset)比后发送的offset小 同一个生产者发送到不同分区的消息,消息顺序无法保证。

kafka两个节点的消费者 kafka多个消费者消费一个partition_服务端_04

 分区与消费顺序:消费者按照消息在分区里的存放顺序进行消费的 Kafka只保证分区内的消息顺序,不能保证分区间的消息顺序。

kafka两个节点的消费者 kafka多个消费者消费一个partition_服务端_05

 1.设置一个分区,这样就可以保证所有消息的顺序,但是失去了拓展性和性能。

 2.支持通过设置消息的key,相同key的消息会发送的同一个分区。

消息传递语义

最多一次——消息可能会丢失,永远不重复发送

最少一次——消息不会丢失,但是可能会重复

精确一次——保证消息被传递到服务端且在服务端不重复

需要生产者和消费者共同来保证

 生产者(至少一次)

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka两个节点的消费者_06

 生产者(至多一次)

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka两个节点的消费者_07

 精确一次  在Kafka 0.11.0 及之后的版本才实现

send() 异步发送

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka_08

同步发送

Future<RecordMetadata> result = producer.send(new ProducerRecord<String, String>("mytopic", "" + (i % 5), Integer.toString(i)));
try {
RecordMetadata recordMetadata = result.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e){
e.printStackTrace();
}

 事务

Isolation_level   隔离级别

默认为: read_uncommitted    脏读

read_committed    读取成功提交的数据,不会脏读

下面举一个实例场景:

一个新用户注册成功之后、购买商品生成了一个订单,之后又取消了这个订单。 这些事件之间的顺序很重要。 Kafka 是不保证分区之间的顺序的。如果取消订单这条消息在注册用户或者购买商品之前,处理逻辑就会有问题。你们觉得问题出在哪?请继续下文

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka两个节点的消费者_09

 这种情况下。 为了保证消费顺秀,将所有事件放在同一 个主题的同一个分区中。因此使用用户 ID 作为分区的key,使它们位于相同分区。

kafka两个节点的消费者 kafka多个消费者消费一个partition_服务端_10

 最后聊一聊环境搭建:(二选一)

kafka两个节点的消费者 kafka多个消费者消费一个partition_kafka_11

 在公司有内外部网络隔离的情况下:

kafka两个节点的消费者 kafka多个消费者消费一个partition_服务端_12

 一小时的学习只能算是,初始Kafka,安装以及部署,以及简单的消息处理流程,后面还会有机会学习Kafka基础API,Kafka API高级特性,Kafka 架构进阶。