在 IRIS 系统中,数据库 License 通常存在最大并发限制(例如最大为 300)。每当一个客户端与服务器建立连接时,都会占用一个 License。当 License 使用量超过最大上限时,系统将无法再分配新的 License,导致后续请求无法正常建立连接,常见表现包括:
与此同时,在 IRIS 中执行 JOB 命令也会额外占用 License。也就是说,每启动一个后台 Job 进程,就会消耗一个独立的 License。如果在业务高峰期的核心流程中频繁调用 JOB,会快速推高 License 使用量,极易造成 License 被撑满,从而影响正常在线业务请求,严重时甚至引发系统不可用。
基于上述风险,需要将业务程序中直接调用 JOB 命令的逻辑,统一调整为通过 JOB 工具进行调度执行,以避免业务高峰期 License 被瞬间打满。
该工具的核心机制如下:
该策略的本质是对后台任务进行“削峰限流”,确保核心在线业务优先获得 License 资源。
JOB工具使用说明
示例接口方法:
ClassMethod Add(x, y)
{
h 30
q x + y
}
通常使用JOB命令调用的接口方式如下:
j ##class(Util.JobUtils).Add($random(10), $random(10))
需要将如上JOB命令调用的接口方式改为使用JOB工具调用,示例如下:
s ret = ##class(Util.JobUtils).RunJobMethod("Util.JobDemo", "Add", $random(10), $random(10))
方法签名如下:
ClassMethod RunJobMethod(className, methodName, arg...) As %Boolean
通过 JOB 工具提交的每次任务调用,都会记录到表:
BS_BSP.ExternalJob
该表用于保存所有任务调用记录,包括任务参数、执行状态、错误信息、执行结果等信息,便于后续追踪与补偿处理。
当系统检测到 License 使用率超过 80% 时:
iserror 字段会置为 1(标记为失败/暂挂任务)errmsg 字段会记录失败原因,例如:超过当前license最大数量80%需要说明的是:该失败属于正常保护机制,并非业务逻辑错误。
当 License 压力下降后,系统会对失败任务进行补偿重试,并按照失败任务的创建时间顺序进入队列执行,确保任务最终完成。
补偿执行过程中字段状态变化如下:
istask = 1istaskfinish = 1taskResult 字段通过该机制,能够保证任务在高峰期不会挤占 License,而在低峰期会自动补偿执行,实现“削峰填谷”的效果。
目前绝大部分 License 阻塞问题,并不是 JOB 工具本身导致,而是由调用的接口执行超时引起。
典型现象为:
BS_BSP.ExternalJob 表中表现为失败任务(iserror = 1)此时在 errmsg 字段通常可以看到提示:
超过80%最大许可
此类问题应当重点查询表:
BS_BSP.InternalJob
重点关注 runtime 字段,筛选 runtime > 3s 的任务(实际上接口执行超过 1s 就已经属于偏慢,需要重点关注)。
如果发现大量 30s、60s、120s,甚至 360s 以上的数据,则说明 JOB 执行耗时严重异常,会直接导致 License 被占用时间过长。
排查结果通常如下:
classname + methodname 指向具体接口实现注意:减少超时时间不是指从 30 秒调整到 10 秒,而是应当从根本上将接口执行耗时控制在 3 秒以内。 否则只是“五十步笑百步”,无法真正解决 License 阻塞问题。

A:常见原因如下:
License 峰值具有瞬时性 高峰期短时间内大量并发 JOB 可能导致 License 瞬间超过 80%,但监控查询时峰值已经回落,因此监控值不能代表当时真实情况。
失败任务会自动补偿重发 JOB 工具触发保护机制后,任务会先失败入表,随后在 License 下降后自动补偿执行。
可通过 ExternalJob 表确认任务是否已补发完成
检查
BS_BSP.ExternalJob
是否存在该条记录,并查看字段:
istask = 1 表示已进入补偿执行队列istaskfinish = 1 表示已补偿执行完成A:需要明确以下几点:
iserror = 1 属于正常限流保护行为
该机制的目的是防止 License 爆满导致核心在线业务不可用,因此失败数量大并不代表系统异常。
失败任务会自动补偿执行
可检查
BS_BSP.ExternalJob
iserror = 1istask、istaskfinish 是否置位为 1
若 istaskfinish = 1,则说明该任务已经补发完成,不会造成数据丢失。如果失败任务未补偿完成,需要重点排查接口耗时问题
查询 BS_BSP.InternalJob 表,筛选 runtime > 3s 的记录。
若存在大量超时数据,需联系对应接口产品组处理,通常原因是接口内部调用第三方服务未设置 timeout,导致线程阻塞。
A:排查思路如下:
查询
BS_BSP.ExternalJob
是否存在对应推送任务记录
iserror = 1errmsg 提示超过 80%查看该任务是否已补偿执行
istask = 1istaskfinish = 1taskResult 是否记录执行结果若存在大量失败且长期未补偿完成,进一步排查 InternalJob
BS_BSP.InternalJob 中 runtime > 3s 的接口classname、methodname,推动接口优化或第三方调用设置超时该问题本质上仍属于“接口执行慢 / 超时 → License 占用过久 → 触发保护机制”链路,处理方式参考上述常见根因分析。
JOB 工具的作用并不是减少任务,而是在高峰期通过限流保护机制确保系统稳定:
通过优化慢接口、控制 runtime 在 3 秒以内,可以显著改善 License 占用阻塞问题,减少 ExternalJob 高峰失败数量,并提升整体系统稳定性。