程序形态插件以子进程方式运行,内核通过标准输入输出交换请求响应,任意语言只要具备读取标准输入、写出标准输出与日志走错误流的能力即可作为插件。程序形态提供完整的文件与数据库能力,并通过进程边界实现崩溃隔离。
标准输入输出通道的传输成本在微秒级,无需分配端口、探测就绪与回收端口,插件作者只需要读一行 JSON 与写一行 JSON。回环 HTTP 作为可选方案保留给流式与大文件场景,当前版本以标准输入输出为默认通道。
启动时内核按命令与参数拉起进程并注入环境变量,建立两根管道后等待第一行握手,握手行包含就绪标记与协议版本,超时未收到则判定启动失败。握手之后的每一行输出都必须是响应,任何调试信息都要写入错误流。
关闭时内核关闭插件标准输入,插件读到文件结束信号后自行清理并退出,超时未退出会被强制终止。这套约定在 Windows 与 Linux 上行为一致,插件不需要编写平台相关的信号处理代码。
请求包含协议版本、方法、路径、查询串、协议、请求头、正文与站点上下文以及剩余超时;响应包含状态码、头与三种正文之一。多值头用数组表示,逐跳头在双向都会被剥离,内容长度由内核重算,日期与服务器头由内核覆盖。
正文根据大小与编码自动选择通道:合法的短文本走文本字段,二进制或转义后超限的内容走编码字段,超过落盘阈值的内容走文件字段并给出临时文件路径。插件应当三种通道都实现,否则处理上传类路由时会拿到空正文。临时文件由内核在响应写回后自动清理,插件不要删除它。
内核注入的环境变量覆盖插件标识、站点编号与名称、域名、网站路径、数据目录、配置 JSON、实例序号与内核能力清单。插件不必自己解析请求主机判断站点,多站点数据隔离由插件按站点编号自行处理,内核不提供数据访问接口。
单个插件实例内部严格串行,并发能力来自多实例:内核按实例数拉起多个进程,请求分派到空闲实例,实例全部占用时进入等待队列,队列超限返回繁忙状态。需要应对突发吞吐的场景可以开启弹性伸缩,按负载在配置区间内自动增减实例。
实例异常的处理策略同样由内核承担:超时的实例被强制终止并重新拉起,崩溃实例上的在途请求立即失败而不等待超时;连续失败达到阈值后插件被熔断停用,修复程序文件后自动恢复。
日志与调试输出记得留在错误流:内核会把错误流的内容限速采集进站点日志,行长度与每分钟行数都有上限,更长的输出会被截断或丢弃,因此不要把大段数据打进日志。
站点级安全响应头由中间件链自动附加到插件响应上,插件无需自己处理;需要额外的自定义头时在响应的头字段中声明即可,逐跳头会被内核剥离。
程序形态插件约束可以概括为四条:先握手、串行处理、日志走错误流、读完标准输入即退出。把这四条落实之后,插件进程就与主程序形成清晰的边界,异常只影响自身实例,主程序保持存活。
评论
加载中...