Kafka消息链路

一、消息发送流程

在这里插入图片描述

1. 外部数据
2. kafka producer 生产者
  • 在main线程中创建一个生产者,通过send方法发送外部数据
4. Interceptors 拦截器(可选项)
  • Flume对数据进行拦截处理
5. Serializer 序列化器
  • 跨节点通信需要对数据进行序列化
  • 由于Java自带的序列化器Serializable太重,携带了太多不需要的信息,所以使用kafka自带的序列化器
6. DefaultPartitioner 分区器
  • 在未定义分区器时,会使用默认的分区器:根据key的hashcode的整数值除以分区数得出该数据应该发送于哪个分区
  • 如果数据既没有指定分区,也没有指定的key,就会选择黏性分区发送,直到该批次(batch.size)满了

在这里插入图片描述

  • 自定义分区器,只需要实现Partition接口,重写partition方法,返回值为数据应该发送的分区号,同时在关联自定义分区器

在这里插入图片描述
在这里插入图片描述

7. RecordAccumulator 缓冲区
  • 缓冲区在内存中,整个区域大小为32M,缓冲区中有多个Deque队列,每个队列有多个批次,缓冲区有一个内存池,当创建队列时会从内存池分走内存,当消息发送完毕,就会释放内存,归还给内存池
  • 数据经过分区器后,会把数据分成多个分区,在缓冲区中一个分区会创建一个队列Deque
  • 经过分区器的数据发送到缓冲区的指定队列时,是按批次发送的,每一个批次大小为16K
  • 数据到达缓冲区的指定队列后会把同一个topic分区的消息先汇总起来,形成一个batch(真正发往kafka服务器的消息都是以batch为单位的),当batch的容量达到指定的batch.size或者到达指定的linger.ms后就会由sender线程发送至kafka集群的指定主题的指定分区,消息发送完之后,batch不再使用了,就把内存块归还给缓冲区
8. sender线程
  • 从缓冲区的队列里主动拉取数据发送至kafka的对应分区。
  • 拉取数据有两个条件,一个式batch.size,一个是linger.ms,这两者是或的关系,任何一个满足要求都会触发sender线程对数据进行拉取
  • sender线程发送数据时,是以节点为单位进行发送,一个节点broker.id为key,value为该节点的请求进行发送
9. selector
  • 缓冲区和kafka集群之间的“高速公路”,数据通过selector才能从缓冲区发送到kafka集群
10. kafka集群
  • 集群在收到消息后进行副本的同步,同步之后进行应答 ,如果应答成功就清理掉该节点缓存的请求,并清理队列中的批数据
  • 如果失败了就重试,默认的重试的次数是int的最大值,也可以自定义重试次数
  • 在发送请求的时候也在等待kafka节点的应答,如果连续5个请求都没有收到一个应答,就会停止发送
  • 在发送请求时有一个应答机制ack:0、1、-1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过使用 Spring Cloud Sleuth 和 Spring Cloud Stream 实现在 Spring Boot 应用中将链路日志发送到 Kafka。 首先,在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-kafka</artifactId> </dependency> ``` 然后,在 application.yml 文件中配置 Sleuth 和 Kafka: ```yaml spring: application: name: my-application sleuth: sampler: probability: 1.0 cloud: stream: kafka: binder: brokers: localhost:9092 bindings: my-log-output: destination: my-topic ``` 接下来,在应用中添加一个 LogMessage 类来表示要发送到 Kafka 的日志信息: ```java public class LogMessage { private String traceId; private String spanId; private String message; // getters and setters } ``` 然后,在应用中使用 Sleuth 记录链路日志,并将日志信息发送到 Kafka: ```java @RestController public class MyController { private final Tracer tracer; private final MessageChannel myLogOutput; public MyController(Tracer tracer, MessageChannel myLogOutput) { this.tracer = tracer; this.myLogOutput = myLogOutput; } @GetMapping("/hello") public String hello() { Span span = this.tracer.nextSpan().name("my-span").start(); try (Tracer.SpanInScope ws = this.tracer.withSpan(span)) { String traceId = span.context().traceIdString(); String spanId = span.context().spanIdString(); String message = "Hello, world!"; LogMessage logMessage = new LogMessage(); logMessage.setTraceId(traceId); logMessage.setSpanId(spanId); logMessage.setMessage(message); this.myLogOutput.send(new GenericMessage<>(logMessage)); return message; } finally { span.end(); } } } ``` 这样,当应用处理请求时,它将使用 Sleuth 记录链路日志,并将日志信息发送到 Kafka 中的 "my-topic" 主题中。你可以通过消费该主题中的消息来实现对链路日志的监控和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值