`SearchTransportService` 是 **协调节点与数据节点之间“搜索子请求”通信的运输层**
`SearchTransportService` 是 **协调节点与数据节点之间“搜索子请求”通信的运输层**,它把**协调节点**发出的 **查询阶段、取回阶段、DFS 阶段、滚动上下文等** 请求 **序列化并通过 TCP 发送给各个数据节点**,再把数据节点的返回结果 **反序列化后交还给协调节点**。
一句话:
> **“协调节点不直接调用 SearchService,而是通过 SearchTransportService 把请求发出去,让数据节点上的 SearchService 干活。”**
---
### ✅ 核心职责(8.x)
| 职责 | 说明 |
|---|---|
| **发送子请求** | `sendExecuteQuery`、`sendExecuteFetch`、`sendExecuteDfs`、`sendFreeContext` … |
| **注册处理器** | 在启动时把 `SearchService` 的各阶段方法注册为 `TransportRequestHandler`,让数据节点能够接收并执行。 |
| **结果回调** | 所有方法都是 **异步** 的,返回 `ActionListener<SearchPhaseResult>` 给协调节点。 |
| **连接管理** | 内部封装 `TransportService`,自动处理节点下线、重试、超时。 |
---
### ✅ 典型调用链(协调节点 → 数据节点)
```
协调节点 SearchPhase
↓ 调用 SearchTransportService.sendExecuteQuery(...)
↓ TCP
数据节点 SearchTransportService → 对应 RequestHandler
↓ 调用 SearchService.executeQueryPhase(...)
↓ 返回结果
↓ TCP
协调节点 listener.onResponse(...)
```
---
### ✅ 关键源码片段(8.x)
```java
// 协调节点:TransportSearchAction → InitialSearchPhase
searchTransportService.sendExecuteQuery(
connection,
queryShardRequest,
new ActionListener<QuerySearchResult>() { ... });
// 数据节点:启动时注册
transportService.registerRequestHandler(
QUERY_ACTION_NAME,
QuerySearchRequest::new,
ThreadPool.Names.SEARCH,
(request, channel, task) -> {
QuerySearchResult result = searchService.executeQueryPhase(request, (SearchShardTask) task);
channel.sendResponse(result);
});
```
---
### ✅ 一句话总结
> `SearchTransportService` 是 **协调节点与数据节点之间的“搜索 RPC 层”**,所有跨节点的查询/取回/DFS/滚动请求都经它转发,真正的查询逻辑仍落在数据节点的 `SearchService`。