xiis程序形态插件的stdio协议开发要点

xiis程序形态插件的stdio协议开发要点

1024KB1024KB 使用手册 2026-09-09 16:40:00 浏览 66105 字数 1360

程序形态插件以子进程方式运行,内核通过标准输入输出交换请求响应,任意语言只要具备读取标准输入、写出标准输出与日志走错误流的能力即可作为插件。程序形态提供完整的文件与数据库能力,并通过进程边界实现崩溃隔离。

为什么选择标准输入输出

标准输入输出通道的传输成本在微秒级,无需分配端口、探测就绪与回收端口,插件作者只需要读一行 JSON 与写一行 JSON。回环 HTTP 作为可选方案保留给流式与大文件场景,当前版本以标准输入输出为默认通道。

生命周期与握手行

启动时内核按命令与参数拉起进程并注入环境变量,建立两根管道后等待第一行握手,握手行包含就绪标记与协议版本,超时未收到则判定启动失败。握手之后的每一行输出都必须是响应,任何调试信息都要写入错误流。

关闭时内核关闭插件标准输入,插件读到文件结束信号后自行清理并退出,超时未退出会被强制终止。这套约定在 Windows 与 Linux 上行为一致,插件不需要编写平台相关的信号处理代码。

请求与响应字段

请求包含协议版本、方法、路径、查询串、协议、请求头、正文与站点上下文以及剩余超时;响应包含状态码、头与三种正文之一。多值头用数组表示,逐跳头在双向都会被剥离,内容长度由内核重算,日期与服务器头由内核覆盖。

正文三通道

正文根据大小与编码自动选择通道:合法的短文本走文本字段,二进制或转义后超限的内容走编码字段,超过落盘阈值的内容走文件字段并给出临时文件路径。插件应当三种通道都实现,否则处理上传类路由时会拿到空正文。临时文件由内核在响应写回后自动清理,插件不要删除它。

环境变量与站点上下文

内核注入的环境变量覆盖插件标识、站点编号与名称、域名、网站路径、数据目录、配置 JSON、实例序号与内核能力清单。插件不必自己解析请求主机判断站点,多站点数据隔离由插件按站点编号自行处理,内核不提供数据访问接口。

并发与实例模型

单个插件实例内部严格串行,并发能力来自多实例:内核按实例数拉起多个进程,请求分派到空闲实例,实例全部占用时进入等待队列,队列超限返回繁忙状态。需要应对突发吞吐的场景可以开启弹性伸缩,按负载在配置区间内自动增减实例。

实例异常的处理策略同样由内核承担:超时的实例被强制终止并重新拉起,崩溃实例上的在途请求立即失败而不等待超时;连续失败达到阈值后插件被熔断停用,修复程序文件后自动恢复。

调试与编码要点

  • 单独调试时直接向标准输入喂入一行请求即可,首行会多输出一个握手行属正常现象
  • PowerShell 需要显式设置输出编码,批处理需要切换代码页,否则中文会乱码
  • 注意系统上的解释器别名问题,确认命令指向真实解释器
  • 大文件不要走正文通道返回,改用响应落盘或静态资源托管

日志与调试输出记得留在错误流:内核会把错误流的内容限速采集进站点日志,行长度与每分钟行数都有上限,更长的输出会被截断或丢弃,因此不要把大段数据打进日志。

站点级安全响应头由中间件链自动附加到插件响应上,插件无需自己处理;需要额外的自定义头时在响应的头字段中声明即可,逐跳头会被内核剥离。

程序形态插件约束可以概括为四条:先握手、串行处理、日志走错误流、读完标准输入即退出。把这四条落实之后,插件进程就与主程序形成清晰的边界,异常只影响自身实例,主程序保持存活。

分享到:

评论

加载中...
我
还没有评论,快来抢沙发吧~