用途:pubsub 是一个基于主题的发布/订阅消息 worker,用于实时通知类场景,例如 UI 实时更新、临时信号、遥测镜像,以及事件源无需了解消费者的松耦合场景。
主要能力:提供一个可调用函数 publish(函数 id 为裸名 "publish",无命名空间前缀)和一个触发器类型 subscribe。publish 向命名主题广播事件,所有主题精确匹配的 subscribe 触发器都会以原始负载被调用,无信封、无持久化、无重试。多个触发器可订阅同一主题,各自收到独立副本,实现真正的扇出。
使用方式:安装命令为 iii worker add pubsub。它取代了原先内置的 iii-pubsub worker,触发器类型(subscribe)与函数 id(publish)保持不变,现有应用代码可继续使用。绑定方式:先用 iii.registerFunction('notifications::on-order-shipped', handler) 注册处理器,再用 iii.registerTrigger({ type: 'subscribe', function_id: 'notifications::on-order-shipped', config: { topic: 'orders.shipped' } }) 注册触发器。处理器直接收到 publish 的原始数据,不含 topic 字段;若一个处理器服务多个主题,需在发布时把主题写入 data。处理器返回值被忽略,且没有重试。
适配器:local(默认,内存广播,仅投递到本引擎进程内的订阅者,无外部依赖)与 redis(redis_url: ${REDIS_URL:redis://localhost:6379},使用 Redis Pub/Sub,使事件跨多个引擎实例传播)。适配器在 pubsub 配置项中设置,支持运行时热切换。
限制:无持久化、无顺序保证、无重试,订阅者宕机会永久错过事件;若每个消费者都必须处理每个事件,应改用 queue worker 的 topic 模式 durable:subscriber。主题匹配为精确字符串相等,不支持通配符或层级模式,每个主题需注册一个触发器。空主题会被拒绝:publish 返回 topic_not_set,以空主题注册的 subscribe 触发器永不触发。pubsub 承载离散事件而非状态,键值或流变更响应应使用 state 或 stream worker。查询已发布负载结构可对 publish 或处理器函数 id 调用 iii get function info。