当前位置: 首页 > news >正文

Elasticsearch JS 客户端子客户端(Child Client)实践指南

一、子客户端是什么?

  • 共享连接池:父/子实例共用 TCP 连接与健康状态,避免重复建连。

  • 事件共享:父与子共用同一个事件发射器(diagnostic 等)。

    • 如果你对客户端做了扩展,会继承;
    • 若只对扩展,不会受到影响。
  • 可配项:创建子客户端时,几乎可传入与 new Client() 相同的选项,但不能覆盖连接池相关的选项(ssl/tlsagentpingTimeoutConnectionresurrectStrategy)。

  • 关闭行为父或任一子调用 close()所有共享该连接池的客户端都会被关闭。

二、快速上手

const { Client } = require('@elastic/elasticsearch')const client = new Client({cloud: { id: '<cloud-id>' },auth:  { apiKey: 'base64EncodedKey' }
})const child = client.child({headers: { 'x-foo': 'bar' } // 只对这个子实例生效的默认请求头
})client.info().then(console.log, console.log)
child.info().then(console.log, console.log)

三、典型用法场景

1) 多租户隔离(按租户打标)

const tenantA = client.child({headers: { 'x-tenant': 'A' },opaqueIdPrefix: 'tenantA' // 便于链路追踪
})const tenantB = client.child({headers: { 'x-tenant': 'B' },opaqueIdPrefix: 'tenantB'
})

2) 业务线分治(不同默认超时/压缩)

const searchClient = client.child({requestTimeout: 10_000,compression: 'gzip',name: 'svc-search'
})const ingestClient = client.child({requestTimeout: 60_000, // 写入容忍更长name: 'svc-ingest'
})

3) 可观测与诊断(标识 + 上下文)

const analytics = client.child({name: 'analytics',context: { service: 'analytics', region: 'us-west-2' }
})// 共享的 diagnostic 事件仍然能区分来源(看 name/context/opaqueId)
client.diagnostic.on('response', (e) => {// e.meta.name / e.meta.request.params.context
})

四、最佳实践清单

  • 能用 child 就别 new:只是“默认请求选项不同”时,用 child() 既省内存又省握手成本。
  • 别改连接池级别选项:在子客户端里避免配置/覆盖 ssl/tlsagentpingTimeoutConnectionresurrectStrategy
  • 统一关闭:应用退出时只需在或任一close() 一次即可。
  • Cloud 场景勿 sniff:子客户端沿用父端策略;Cloud 背后是负载均衡,不需要嗅探。
  • 链路可观测:为每个子客户端设置 name / opaqueIdPrefix / context,诊断日志更清晰。

五、反例与踩坑

  • 把不同证书/代理放在子客户端里:这会触及连接池级别配置,API 不允许。需完全独立的 new Client()
  • 误以为 close 只关一个实例:任意父/子 close() 会关闭所有共享该池的实例。
  • 把大块业务逻辑写进请求 Hook 却未区分子实例:请根据 name/headers/context 做分流,避免串线。

六、组合示例:多租户 + 搜索/写入分治

const base = new Client({ cloud: { id: '<cloud-id>' }, auth: { apiKey: '...' } })const tenant = (code) => base.child({headers: { 'x-tenant': code },opaqueIdPrefix: `tenant-${code}`
})const tAsearch = tenant('A').child({ name: 'A-search', requestTimeout: 10_000, compression: 'gzip' })
const tAingest = tenant('A').child({ name: 'A-ingest', requestTimeout: 60_000 })// 使用
await tAsearch.search({ index: 'docs-A', query: { match: { q: 'hello' } } })
await tAingest.index({ index: 'docs-A', document: { id: 1, title: 'hi' } })

七、总结

  • child client = 共享连接池的“轻量克隆”,非常适合多租户、多业务线的默认配置隔离
  • 记住两条铁律:不改池级别配置任意一端 close 全家关
  • 配合 headers / requestTimeout / compression / name / opaqueIdPrefix / context,就能在性能不打折的前提下实现清晰的隔离与可观测。
http://www.dtcms.com/a/328088.html

相关文章:

  • DAY38作业(补)
  • CTO如何通过录音转写和音频降噪,提升企业远程协作效率?
  • Secure 第四天作业
  • Linux环境部署RocketMQ
  • C++算法·排序
  • 第六十四章:AI的“觅食”之路:数据采集器设计与多源数据获取
  • DL-FWI 的三项主要任务: 网络构建, 数据生成, 训练控制
  • 跑腿APP开发未来趋势:同城O2O系统源码在智能调度与个性化中的进化
  • Spring Boot项目中调用第三方接口
  • HCIP项目之OSPF综合实验
  • Flux.1系列模型解析--Kontext
  • 8月12号打卡
  • 【Leetcode hot 100】560.和为K的子数组
  • 无人机航拍数据集|第13期 无人机城市斑马线目标检测YOLO数据集963张yolov11/yolov8/yolov5可训练
  • 为什么304不锈钢仍会生锈?
  • Ubuntu20.06环境下安装VS Code及中文设置方法
  • CSRF 攻击
  • 【机器学习】什么是DNN / MLP(全连接深度神经网络, Deep Neural Network / Multilayer Perceptron)?
  • 【Python】支持向量机SVM
  • Web攻防-业务逻辑篇Fuzz技术数据并发条件竞争JS挖掘参数盲猜Turbo插件SRC
  • c#联合Halcon进行OCR字符识别(含halcon-25.05 百度网盘)
  • 下一代防火墙部署
  • TF-IDF 红楼梦关键词提取
  • 全文深度剖析国产化数据库达梦之备份恢复体系
  • nurbs曲线的matlab
  • RabbitMQ面试精讲 Day 20:RabbitMQ压测与性能评估
  • Hystrix核心内容
  • JUC 面试知识点大纲
  • Notepad++插件开发实战
  • 【从0带做】基于Springboot3+Vue3的校园表白墙系统