Elasticsearch 几乎不用 Java 自带的 `java.io.Serializable` 机制,而是自己定义了一套“写-读”协议,核心就是两个接口方法:
1. `void writeTo(StreamOutput out)`
2. `static T readFrom(StreamInput in)`
只要一个类实现了这对方法,框架就能把它的字段按顺序写成字节、再按同样的顺序读回来;与 `Serializable` 没有任何关系。
`ClusterState` 以及 `DiscoveryNode`、`IndexMetaData`、`ShardRouting` 等所有集群级对象都遵循这套协议,所以它们虽然没实现 `Serializable`,照样可以在节点之间来回传输并完整重建。
---
一、ES 的网络层:基于 Netty 的 “Transport” 协议
- 节点之间所有通信(包括集群状态发布、索引请求、搜索请求)统一走 TCP 传输层,称作 transport。
- 传输的消息必须实现 `TransportRequest` 或 `TransportResponse` 接口,而这两个接口的唯一要求就是:
“你会把自己写到 `StreamOutput`,也能从 `StreamInput` 读回来”。
- 因此,ES 里只要出现跨节点的对象,就一定会配套实现 `writeTo`/`readFrom`,否则连编译都过不了。
---
二、StreamOutput / StreamInput:定制的“高效字节流”
- 位于 `org.elasticsearch.common.io.st

最低0.47元/天 解锁文章
1360

被折叠的 条评论
为什么被折叠?



