02 2023 档案
摘要:# 消费者客户端开发 在了解了消费者与消费组之间的概念之后,我们就可以着手进行消费者客户端的开发了。在 Kafka 的历史中,消费者客户端同生产者客户端一样也经历了两个大版本:第一个是于 Kafka 开源之初使用 Scala 语言编写的客户端,我们可以称之为旧消费者客户端(Old Consumer)
阅读全文
摘要:消费者与消费组 与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息。不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法理解如何使用 KafkaConsumer。 消费者(Consumer)负责订阅 Ka
阅读全文
摘要:除了可以承受更多的并发流量、存储海量数据外,分布式系统另外一个优点就是:利用数据备份来防止数据丢失。但也正是由于数据副本的存在,也引入了一些其他的问题,比如,如何选取主副本、复制数据时如何保证各个副本的数据一致性等。 为了解决分布式存储系统中数据复制的问题,微软提出了 PacificA 算法,而 E
阅读全文
摘要:生产者拦截器 拦截器(Interceptor)是早在 Kafka 0.10.0.0 中就已经引入的一个功能,Kafka 一共有两种拦截器:生产者拦截器和消费者拦截器。 生产者拦截器既可以用来在消息发送前做一些准备工作,比如按照某个规则过滤不符合要求的消息、修改消息的内容等,也可以用来在发送回调逻辑前
阅读全文
摘要:分区器 消息在通过 send() 方法发往 broker 的过程中,有可能需要经过拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)的一系列作用之后才能被真正地发往 broker。拦截器(下一章会详细介绍)一般不是必需的,而序列化器是必需的。消息经过
阅读全文
摘要:序列化 生产者需要用序列化器(Serializer)把对象转换成字节数组才能通过网络发送给 Kafka。而在对侧,消费者需要用反序列化器(Deserializer)把从 Kafka 中收到的字节数组转换成相应的对象。 消息的 key 和 value 都使用字符串,对应程序中的序列化器也使用了客户端自
阅读全文
摘要:参数配置 bootstrap.servers:该参数用来指定生产者客户端连接 Kafka 集群所需的 broker 地址清单,具体的内容格式为 host1:port1,host2:port2,可以设置一个或多个地址,中间以逗号隔开,此参数的默认值为“”。注意这里并非需要所有的 broker 地址,因
阅读全文
摘要:什么是 ZooKeeper 假设对 ZooKeeper 中的数据做了变更(比如新增了一台 Kafka 或者挂掉了一个 Kafka 节点),这时候 ZooKeeper 会主动通知其他监听这个数据的客户端,立即告诉其他客户端说这份元数据有变更。 ZooKeeper 的设计十分巧妙,它的主动通知机制采取的
阅读全文
摘要:对于一个数据存储系统来说,如何保证数据可靠性、提高读写吞吐量是重中之重。 一、文档分布式存储的流程 我们知道 ES 的索引有一个或者多个分片,而分片又分为主分片和副本分片两种。 那数据写入索引的过程是怎么样的呢?数据写入主分片和副分片的流程又是怎样的呢? 文档分布式存储首先需要找到能存储文档的主分片
阅读全文
摘要:如上图,这个倒排索引使用哈希表来实现也是可以的,其有着 O(1) 查询复杂度,能完美地满足我们的需求。但是呢,现实中数据往往是海量的,如果简单地使用哈希表来实现倒排索引是不可行的,因为存储海量的数据时,系统将会面临下面几个问题: 分词形成的词项(term)可能是海量的,需要可以在内存和磁盘上高效存储
阅读全文
摘要:垃圾回收算法 新生代中因为对象都是“朝生夕死的”,深入理解JVM虚拟机上说98%的对象存活率很低,适用于复制算法,复制算法比较适合用于存活率低的内存区域。它优化了标记/清除算法的效率和内存碎片问题。 老年代中存活率较高,要是使用复制算法,每次都要复制大量的对象,会浪费大量的时间,因此复制算法不适合回
阅读全文
摘要:Java 内存模型规定了 JVM 应该如何使用计算机内存(RAM)。 广义来讲, Java 内存模型分为两个部分: JVM 内存结构 JMM 与线程规范 其中,JVM 内存结构是底层实现,也是我们理解和认识 JMM 的基础。 大家熟知的堆内存、栈内存等运行时数据区的划分就可以归为 JVM 内存结构。
阅读全文
摘要:字符集简介 我们知道在计算机中只能存储二进制数据,那该怎么存储字符串呢?当然是建立字符与二进制数据的映射关系了,建立这个关系最起码要搞清楚两件事儿: 你要把哪些字符映射成二进制数据? 也就是界定清楚字符范围。 怎么映射? 将一个字符映射成一个二进制数据的过程也叫做编码,将一个二进制数据映射到一个字符
阅读全文
摘要:为什么要学习 RocketMQ? 相信无论是前端还是后端的同学,不管是在平常的自我充电、还是日常的工作中,对 RocketMQ、Kafka 等主流消息队列多多少少都有一定的了解。现在的服务端架构中,一个业务模块中的服务往往会根据一定维度拆分成多个服务。而消息队列大家可以理解为 多个服务、系统之间沟通
阅读全文
摘要:初识Kafka Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种
阅读全文
摘要:整合RocketMQ 在开始运行 RocketMQ 之前,我们先思考一个实际的场景。 假设我们项目中有一个消息的生产者和消费者,它们连接到一个 RocketMQ 实例上,如下图所示。 随着业务规模的不断扩大,一个 RocketMQ 的实例已经有些不堪重负,于是我们需要将单机版的 RocketMQ 改
阅读全文