0%

Kafka 启动与关闭全流程详解

Kafka 是一个依赖 ZooKeeper 的分布式消息系统,其启动过程涉及 ZooKeeper 初始化、Kafka 核心组件加载等步骤。本文将详细介绍 Kafka 及依赖的 ZooKeeper 的启动配置、操作步骤、源码级启动流程,以及安全关闭的方法,帮助理解其运行机制。

前置依赖:ZooKeeper 启动

Kafka 依赖 ZooKeeper 存储集群元数据(如 Broker 信息、主题配置、消费者偏移量等),需先启动 ZooKeeper。Kafka 自带 ZooKeeper 组件,推荐使用自带版本以避免版本兼容问题。

ZooKeeper 配置文件(zookeeper.properties)

Kafka 的 ZooKeeper 配置文件位于 config/zookeeper.properties,核心配置如下:

1
2
3
4
5
6
7
8
# 快照文件存储目录(默认/tmp/zookeeper,建议修改为持久化路径)
dataDir=E:\\zookeeper\\data
# 事务日志存储目录(独立设置可提升性能)
dataLogDir=E:\\zookeeper\\logs
# 客户端连接端口
clientPort=2181
# 允许客户端最大连接数(0表示无限制)
maxClientCnxns=0
  • 注意:路径需避免包含空格,否则可能导致启动失败(报错 “系统找不到指定的路径”)。

启动 ZooKeeper

(1)Windows 环境

进入 Kafka 安装目录的 bin/windows 文件夹,执行启动命令:

1
2
# 启动 ZooKeeper(指定配置文件)
zookeeper-server-start ../../config/zookeeper.properties
(2)Linux/Mac 环境

进入 bin 目录:

1
2
# 启动 ZooKeeper
./zookeeper-server-start.sh ../config/zookeeper.properties
(3)验证启动

ZooKeeper 启动成功后,日志会显示 binding to port 0.0.0.0/0.0.0.0:2181,表示已监听 2181 端口。

Kafka 启动流程

Kafka 核心配置(server.properties)

启动前需确保 config/server.properties 配置正确,关键配置包括:

阅读全文 »

CyclicBarrier和CountDownLatch

这两个类都在jdk的并发包中,都可以用来表示代码运行到某个点上

两者的区别

  • CyclicBarrier表示达到一定数量的线程才会运行;CountDownLatch每来一个线程进行减一操作,直到0为止
  • CyclicBarrier只能唤起一个任务;CountDownLatch可以唤起多个任务
  • CyclicBarrier可重用;CountDownLatch不可重用,只能触发一次事件,值为0后就不可再用了
  • CyclicBarrier允许N个线程相互等待;CountDownLatch是允许1或N个线程等待其他线程完成执行

核心区别对比表

特性 CyclicBarrier CountDownLatch
计数器机制 初始值为 parties,每次 await() 减 1,归 0 后自动重置 初始值为 count,每次 countDown() 减 1,归 0 后不可用
线程协作模式 N 个线程互相等待,全部到达屏障后继续执行 1 个(或多个)线程等待其他线程完成操作
重用性 支持循环使用(通过 reset() 或自动重置) 一次性使用,计数器归 0 后无法重置
屏障动作 支持 Runnable 任务,在所有线程到达后执行 无特殊动作,仅唤醒等待线程
典型场景 并行计算的多阶段同步(如 MapReduce) 主线程等待多个子线程完成初始化
阅读全文 »

MyBatis 拦截器(插件)深度解析:从原理到实战扩展

MyBatis 拦截器(又称插件)是 MyBatis 最强大的扩展机制,允许开发者在不修改 MyBatis 核心源码的前提下,通过动态代理对 SQL 执行流程中的关键节点进行拦截,插入自定义逻辑(如日志记录、性能监控、SQL 改写、参数加密等)。从 “核心定位→接口设计→拦截原理→实战开发” 四个维度,彻底拆解 MyBatis 拦截器的工作机制。

拦截器核心定位与拦截对象

MyBatis 拦截器的核心是 “拦截四大核心对象的方法调用”,这四大对象是 MyBatis 执行 SQL 的关键组件,覆盖 “SQL 执行→参数处理→结果映射” 全流程。

四大可拦截对象与拦截点

MyBatis 仅允许拦截以下四类核心对象的特定方法,其他对象无法通过拦截器扩展:

可拦截对象 核心作用 允许拦截的方法(示例) 典型应用场景
Executor SQL 执行器(调度 StatementHandler) query()update()commit()rollback() 全局 SQL 日志、缓存扩展、性能监控
ParameterHandler 参数处理器(绑定 SQL 参数) getParameterObject()setParameters() 参数加密 / 解密、参数校验
ResultSetHandler 结果集处理器(映射结果) handleResultSets()handleOutputParameters() 结果加密 / 解密、结果过滤、数据脱敏
StatementHandler SQL 语句处理器(创建 Statement) prepare()parameterize()update()query() SQL 改写(如动态加租户条件)、执行日志

注意:拦截器只能拦截上述对象的特定方法(需通过 @Signature 精确匹配方法名和参数列表),无法拦截对象的所有方法。

拦截器的核心价值

  • 无侵入扩展:无需修改 MyBatis 核心代码,通过配置即可接入自定义逻辑;
  • 粒度可控:可精确指定拦截的对象、方法和参数,避免全局影响;
  • 责任链模式:支持多个拦截器叠加,形成拦截链,按配置顺序执行。

拦截器核心接口与注解

MyBatis 为拦截器定义了统一的接口规范(Interceptor)和注解(@Intercepts/@Signature),开发者需遵循该规范实现自定义拦截器。

1. Interceptor 接口:拦截器的标准定义

Interceptor 是所有自定义拦截器的顶层接口,定义了三个核心方法,分别对应 “拦截逻辑”“代理生成” 和 “参数初始化”:

阅读全文 »

Kafka 监控详解:基于 Yammer Metrics 与 JMX 的监控体系

Kafka 内置了完善的监控机制,核心依赖 Yammer Metrics 框架收集和报告集群与客户端的运行指标(metrics),并默认通过 JMX(Java Management Extensions) 暴露这些指标,便于通过工具(如 JConsole、VisualVM)或监控系统(如 Prometheus + Grafana)进行可视化和告警。本文将详细介绍 Kafka 的监控体系、核心指标及常用监控工具。

监控基础:Yammer Metrics 与 JMX

Yammer Metrics 框架

Yammer Metrics 是一个 Java 性能监控库,Kafka 用它来定义和收集各类指标,支持多种指标类型:

  • Gauge:瞬时值(如当前连接数)。
  • Counter:计数器(如总消息数)。
  • Meter:吞吐量(如每秒请求数)。
  • Timer:耗时统计(如请求延迟分布)。
  • Histogram:分布统计(如消息大小分布)。

这些指标被分类存储在 Kafka 的各个组件中(如 Broker、生产者、消费者),形成层次化的指标体系。

JMX 暴露指标

Kafka 默认通过 JMX 暴露所有指标,无需额外配置。JMX 是 Java 平台的标准监控接口,允许外部工具通过 MBean(Managed Bean)访问指标。

  • 启用 JMX 端口:启动 Kafka 时,通过 JMX_PORT 环境变量指定端口(如 9010),否则使用随机端口:

    1
    2
    # 启动 Broker 并指定 JMX 端口
    JMX_PORT=9010 ./kafka-server-start.sh ../config/server.properties
  • JMX 指标路径:指标以层次化命名,格式为 kafka.<组件>.<指标名>,例如:

    • kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec(每秒入站消息数)。
    • kafka.consumer:type=ConsumerFetcherManager,name=FetchRateAndTimeMs(消费者拉取速率)。

核心监控指标

Kafka 的监控指标可分为 Broker 指标生产者指标消费者指标主题 / 分区指标,以下是关键指标:

1. Broker 核心指标

指标名 类型 说明 重要性
MessagesInPerSec Meter 每秒接收的消息总数(入站吞吐量) ⭐⭐⭐⭐⭐
BytesInPerSec Meter 每秒接收的字节数(入站流量) ⭐⭐⭐⭐⭐
BytesOutPerSec Meter 每秒发送的字节数(出站流量) ⭐⭐⭐⭐⭐
RequestHandlerAvgIdlePercent Gauge 请求处理器空闲比例(过低表示 Broker 繁忙) ⭐⭐⭐⭐
LeaderCount Gauge 该 Broker 作为 Leader 的分区数(负载均衡关键指标) ⭐⭐⭐⭐
IsrShrinksPerSec Meter 每秒 ISR 收缩次数(频繁收缩可能意味着副本同步异常) ⭐⭐⭐
IsrExpandsPerSec Meter 每秒 ISR 扩张次数 ⭐⭐⭐
阅读全文 »

Tomcat 中的默认 Servlet:DefaultServlet 与 JspServlet

在 Tomcat 的 conf/web.xml 配置文件中,定义了两个核心的默认 Servlet:DefaultServletJspServlet。它们是 Tomcat 处理请求的基础组件,分别负责静态资源和 JSP 页面的处理。理解这两个 Servlet 的作用和配置,有助于更好地掌握 Tomcat 的请求处理流程。

DefaultServlet:静态资源的默认处理器

DefaultServlet 是 Tomcat 的核心默认 Servlet,其 url-pattern 配置为 /,意味着当客户端请求无法匹配任何其他 Servlet 时,将由它来处理。它的主要职责是处理静态资源(如 HTML、CSS、JS、图片等),并提供基础的目录列表功能。

配置详解

conf/web.xml 中对 DefaultServlet 的默认配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value> <!-- 调试级别,0 表示关闭调试输出 -->
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value> <!-- 是否允许目录列表 -->
</init-param>
<load-on-startup>1</load-on-startup> <!-- 启动优先级:1(较高) -->
</servlet>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern> <!-- 匹配所有未被其他 Servlet 处理的请求 -->
</servlet-mapping>

核心功能

阅读全文 »