![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
kafka
文章平均质量分 85
JavaHxg
Java从业者
展开
-
八、Kafka时间轮与常见问题
Kafka中存在大量的延时操作。1、发送消息-超时+重试机制2、ACKS 用于指定分区中必须要有多少副本收到这条消息,生产者才认为写入成功(延时 等)Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能,而是基于时间轮自定义了一个用于实现延迟功能的定时器(SystemTimer)JDK的Timer和DelayQueue插入和删除操作的平均时间复杂度为O(log(n)),并不能满足Kafka的高性能要求,而基于时间轮可以将插入和删除操作的时间复杂度都降为O(1)。原创 2023-07-26 14:35:56 · 1881 阅读 · 0 评论 -
七、Kafka源码分析之网络通信
将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器,首先得从 Deque 里找到自己的目标分区,如果没有就新建一个批量消息 Deque 加进入。原创 2023-07-26 14:11:30 · 2009 阅读 · 0 评论 -
六、consumer源码解读
extends 类AbstractPartitionAssignor,然后在消费者端增加参数:properties.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,类.class.getName());即可。原创 2023-07-12 09:46:06 · 310 阅读 · 0 评论 -
五、Producer源码解读
这里讲一讲拦截器的使用和基本作用,拦截器一般用得不多,所以这里只是讲一讲案例,不推荐生产中使用。想要实现拦截器,我们需要先实现ProducerInterceptor接口即可,然后在生产者中设置进去即可。1、想要把发送的数据都带上时间戳2、实现统计发送消息的成功次数和失败次数在里面,根据消息发送后返回的异常信息来判断是否发送成功。一般异常如果为空就说明发送成功了,反之就说明发送失败了。然后定义两个变量,并根据Exception的值分别累加就可以统计到了。原创 2023-06-20 11:11:57 · 547 阅读 · 0 评论 -
四、kafka集群与可靠性
设置acks=all,且副本数为3极端情况1:默认min.insync.replicas=1,极端情况下如果ISR中只有leader一个副本时满足min.insync.replicas=1这个条件,此时producer发送的数据只要leader同步成功就会返回响应,如果此时leader所在的broker crash了,就必定会丢失数据!这种情况不就和acks=1一样了!所以我们需要适当的加大min.insync.replicas的值。原创 2023-06-20 11:05:58 · 747 阅读 · 0 评论 -
三、Kafka的消费全流程
我们接着继续去理解最后这条消息是如何被消费者消费掉的。其中最核心的有以下内容。1、多线程安全问题2、群组协调3、分区再均衡。原创 2023-06-20 11:00:47 · 3734 阅读 · 0 评论 -
二、Kafka生产与消费全流程
代码见:代码中使用到了自定义序列化。id的长度4个字节,字符串的长度描述4个字节, 字符串本身的长度nameSize个字节自定义序列化容易导致程序的脆弱性。举例,在我们上面的实现里,我们有多种类型的消费者,每个消费者对实体字段都有各自的需求,比如,有的将字段变更为long型,有的会增加字段,这样会出现新旧消息的兼容性问题。特别是在系统升级的时候,经常会出现一部分系统升级,其余系统被迫跟着升级的情况。解决这个问题,可以考虑使用自带格式描述以及语言无关的序列化框架。原创 2023-06-13 11:05:21 · 2166 阅读 · 0 评论 -
一、kafka入门
我们要为Kafka选择合适的硬件时,优先考虑存储,包括存储的大小,然后考虑生产者的性能(也就是磁盘的吞吐量),选好存储以后,再来选择CPU和内存就容易得多。网络的选择要根据业务上的情况来定,也是非常重要的一环。原创 2023-06-08 10:59:48 · 725 阅读 · 0 评论