主页

Kafka中的再均衡

在《Kafka消费者的使用和原理》中已经提到过“再均衡”的概念,我们先回顾下,一个主题可以有多个分区,而订阅该主题的消费组中可以有多个消费者。每一个分区只能被消费组中的一个消费者消费,可认为每个分区的消费权只属于消费组中的一个消费者。但是世界是变化的,例如消费者会宕机,还有新的消费者会加入,而为了应对这些变化,让分区所属权的分配合理,这都需要对分区所属权进行调整,也就是所谓的“再均衡”。本文将对再均衡的相关知识进行详细叙述。 触发时机 首先,我们需要了解什么情况下会触发再均衡,在前文已经提到了消费者数量的变化,是需要再均衡的。在使用Kafka时,除了消费者数量可能会变化,分区数量也同样可能变化,我们可以人为的对分区数量进行修改,但是Kafka只允许增加分区,所以我们只能把分区数量...

阅读更多

Kafka消费者的使用和原理

继上周的《Kafka生产者的使用和原理》,这周我们学习下消费者,仍然还是先从一个消费者的Hello World学起: public class Consumer { public static void main(String[] args) { // 1. 配置参数 Properties properties = new Properties(); properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); properties.put("valu...

阅读更多

Kafka生产者的使用和原理

本文将学习Kafka生产者的使用和原理,文中使用的kafka-clients版本号为2.6.0。下面进入正文,先通过一个示例看下如何使用生产者API发送消息。 public class Producer { public static void main(String[] args) { // 1. 配置参数 Properties properties = new Properties(); properties.put("bootstrap.servers", "localhost:9092"); properties.put("key.serializer", "or...

阅读更多

记一次循环依赖踩坑

之前写过一篇《Spring源码-循环依赖(附25张调试截图)》,也算是对循环依赖研究了一番。可是今天还是在循环依赖上踩坑了,真是被安排的明明白白。下面我讲述下这次踩坑的过程,主要涉及的知识点有三个:模板方法、Bean加载顺序和循环依赖。 这次踩坑的起因要从模板方法说起,最近写的一个需求,在Manager中需要对A、B、C三类数据进行处理,处理过程类似且较多,而只是数据类型和细节上有些差异。为了复用,自然想到了用模板方法重写,这也是我第一次尝试在Spring中使用模板方法,然后就踩坑了T T。 下面我大概重现下场景,在Manager中有一个fun方法会根据传入的type使用相应的工具类处理数据,工具类是通过属性注入的UtilA、UtilB和UtilC。Manager中还有一个preH...

阅读更多

理解Kafka中的基本概念

在上篇文章《消息系统概述》中对消息系统进行了介绍,本次将学习Kafka中的基本概念。首先我们回顾下在消息系统的使用场景中有三种角色分别是生产者、消息系统和消费者,其中生产者负责产生消息和发送消息到消息系统,而消息系统将为消费者提供消息用于处理,如下图。 Kafka是基于发布/订阅模式的消息系统,如下图。生产者会将消息推送到Kafka中的某个Topic上,引入Topic的目的则是为了对消息进行分类,这样消费者就可以根据需要订阅相应的Topic获取消息。 虽然Kafka这样已经能开始工作了,但紧接着又面临单点问题。而为了解决单点问题,Kafka引入了Broker的概念。一个Broker是一个Kafka实例,而一台机器上可运行多个Broker,这里我们认为一台机器上只有一个Kaf...

阅读更多

消息系统概述

前言 草捏子最近开始学习Kafka。在学习前,给自己确定了下学习的范围,大致如下: 理解Kafka的相关概念; 掌握Kafka的基本API使用; 了解Kafka的背后原理。 后续将在这学习范围内输出一些相关文章。那么本文作为Kafka系列的第一篇文章,将从“理解Kafka的相关概念”说起。首先Kafka是什么。 Kafka起初是由LinkedIn公司采用Scala语言开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被捐献给Apache基金会。目前Kafka已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。 从上述介绍中,我们可以知道Kafka具有消息系统和流式处理平台两种...

阅读更多

Web开发中的时区问题

在国际化的业务场景中,时区问题是常见的。本文将就Web开发中的时区问题进行探索。 关于时区的概念,想必大家都有些了解。我们的地球被划分为24个时区,北京时间为东八区,而美国的太平洋时间为西八区,和我们差了16个小时。 下面我们从一个案例说起,我们的服务器和数据库部署在北京,而这时美国用户通过浏览器希望能查询北京时间下的“2020年7月1日8点-2020年7月1日18点”这10个小时的数据。 为了模拟浏览器在太平洋时间,只需将系统时间设置为太平洋时间即可。而系统时间的改变会影响到JVM的默认时区,所以为了让服务器程序仍处于北京时间,需要通过代码指定时区,如下: TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); 而数据库...

阅读更多

一致性哈希的分析与实现

哈希函数,想必大家都不陌生。通过哈希函数我们可以将数据映射成一个数字(哈希值),然后可用于将数据打乱。例如,在HashMap中则是通过哈希函数使得每个桶中的数据尽量均匀。那一致性哈希又是什么?它是用于解决什么问题?本文将从普通的哈希函数说起,看看普通哈希函数存在的问题,然后再看一致性哈希是如何解决,一步步进行分析,并结合代码实现来讲解。 首先,设定这样一个场景,我们每天有1千万条业务数据,还有100个节点可用于存放数据。那我们希望能将数据尽量均匀地存放在这100个节点上,这时候哈希函数就能派上用场了,下面我们按一天的数据量来说明。 首先,准备下需要存放的数据,以及节点的地址。为了简单,这里的数据为随机整型数字,节点的地址为从“192.168.1.0”开始递增。 private s...

阅读更多