编辑
2026-09-09
Java基础
00

1、NIO的半包粘包问题

在上一篇《你好,NIO》博客中的提到了NIO使用中半包粘包问题,解决方案是用帧状态机,这一篇单独摘出来细说一下。为什么凑齐一帧必须用"状态机"?

1.1学习NIO的时候一个错误写法

先说下我最初的想法,估计也是大多数人的第一反应:

java
ByteBuffer header = ByteBuffer.allocate(4); while (header.hasRemaining()) { channel.read(header); // 头没凑齐就一直读 } header.flip(); int len = header.getInt(); ByteBuffer body = ByteBuffer.allocate(len); while (body.hasRemaining()) { channel.read(body); // 内容没凑齐就一直读 } // 凑齐了,处理消息

看起来天经地义——"没读满就继续读,直到凑齐为止",BIO 时代不就这么写的吗?但注意:这里是非阻塞通道(configureBlocking(false))。非阻塞的 read() 在没有数据时不会等待,而是立刻返回 0。 于是这段代码在两个场景下会出大事:

1.2场景一

半包(一条消息被拆成多次到达)—— CPU 空转客户端发了一条 3000 字节的消息,真实网络上它被 TCP 拆成多个段,先后到达:

编辑
2026-10-24
微服务
00

SkyWalking 11 从零搭建到实战排障:一份给后端开发的使用手册

本文记录一次完整的 SkyWalking 落地过程:服务端部署(11.0.0)、本地项目接入(JDK 8~21)、以及真正天天用得到的排障方法。

环境:CentOS 7 + JDK 17(服务端)+ Elasticsearch 7.9.3 + SkyWalking 11.0.0 + Java Agent 9.8.0(本地 Java 21 项目)


目录


编辑
2026-10-23
canal
00

Canal + Elasticsearch 实时同步实战(三):8 个踩坑记录与生产环境注意事项

系列文章

  • 第一篇:选型、架构与前置准备
  • 第二篇:部署 canal-server 与 adapter
  • 第三篇:踩坑与注意事项 ← 本篇

目录


一、坑位总表

按实际踩到的顺序排列,也是推荐的排查顺序:

#现象根因解法
0Plugin 'mysql_native_password' is not loadedMySQL 8.4 默认禁用该插件改用 caching_sha2_password
1command 'show master status' has an error!MySQL 8.4 移除了该语句固定位点启动
2认证失败 / 驱动不兼容adapter 自带 5.1.48 驱动换 8.0.33 驱动
3None of the configured nodes are availablees7 适配器默认走 TransportClientmode: rest
4Illegal character in scheme name at index 0hosts 缺协议头改成 http://ip:9200
5启动 NullPointerExceptionapplication.yml 缺 accessKey补上空键
6全量同步 NPE / 导入 0 条索引没建或没有 mapping先建带 mapping 的索引
7ETL 成功但 count=0ES 未 refresh_refresh 或等 1 秒
8CentOS 7 装不上 JDK系统 EOL,yum 源失效用二进制包

坑 0 严格说是 MySQL 侧的坑,但它决定了后面所有配置的方向,所以放第一位。

编辑
2026-10-23
canal
00

Canal + Elasticsearch 实时同步实战(二):部署 server 与 adapter,跑通全量 + 增量

系列文章

  • 第一篇:选型、架构与前置准备
  • 第二篇:部署 canal-server 与 adapter ← 本篇
  • 第三篇:8 个踩坑记录与生产环境注意事项

前置条件:MySQL 已开 ROW binlog,canal 账号已建好,JDK 8 已安装(见第一篇)。 本篇所有配置文件里的 <MYSQL_HOST>、<CANAL_DB_PASSWORD> 等占位符,请替换成你自己的值。


目录


编辑
2026-10-23
canal
00

Canal + Elasticsearch 实时同步实战(一):选型、架构与前置准备

系列文章

  • 第一篇:选型、架构与前置准备 ← 本篇
  • 第二篇:部署 canal-server 与 adapter,跑通全量 + 增量
  • 第三篇:8 个踩坑记录与生产环境注意事项

环境:CentOS 7.9 + MySQL 8.4.1 + Elasticsearch 7.9.3 + Canal 1.1.7

如果你正打算做 MySQL → ES 的实时同步,建议三篇按顺序看。第三篇的坑,基本都是第二篇部署时踩出来的。


目录


一、为什么要用 Canal

业务库在 MySQL,但搜索、列表页、运营后台需要走 Elasticsearch。常见做法有三种:

方案实时性侵入性说明
业务代码双写高高每个写库的地方都要写 ES,容易漏、容易不一致
定时全量刷低低数据量大时扛不住,延迟以分钟/小时计
解析 binlog准实时(秒级)零侵入Canal 就是这一类

Canal 的原理很朴素:把自己伪装成 MySQL 的从库(slave),订阅 binlog,把变更解析成结构化消息。

业务代码一行不用改,MySQL 侧只需要保证 binlog_format=ROW。这是它相比"代码双写"最大的优势——存量代码零改造,也不会因为某处漏写导致数据不一致。

代价是:你多了一个需要运维的中间件,而且它的版本兼容性对 MySQL 版本很敏感(这一点第三篇会详细展开)。