Jitsu Functions 能做什么?
Jitsu Functions 让你在事件写入数据仓库之前,用 JavaScript 修改、过滤或增强事件数据。它运行在 JavaScript 运行时环境中,可以调用 npm 包、库和键值存储,适合需要自定义数据处理逻辑的团队。如果你只是想把网站事件原样搬进仓库,不需要它;如果你要在入库前做去重、发通知、补字段这类加工,它就是 Jitsu 里最值得关注的部分。
它在数据管道里的位置
Jitsu 的定位是 warehouse-first:把数据仓库当作数据的唯一真实来源,Jitsu 负责尽快把事件送进去。Functions 就插在“事件产生”和“事件入库”之间。
流程可以理解为:
- 从网站、应用、API、CRM 等来源捕获事件
- 事件进入 Jitsu
- Functions 在这里执行——修改、过滤或增强事件
- 处理后的数据写入你选择的数据仓库
这意味着加工发生在入库前,仓库里存的是已经处理过的数据,而不是先入库再清洗。
具体能做什么
官方给出的能力是三类:修改(modify)、过滤(filter)、增强(augment)。落到实际场景:
- 去重:判断某个用户是否已经注册过,避免重复处理
- 触发外部动作:比如新用户注册时向 Slack 发一条通知
- 字段加工:在写入前补充、改写或剔除事件字段
- 按条件过滤:只让符合条件的事件进入仓库
一个来自官方文档的例子:当事件类型是 identify 时,用键值存储检查该邮箱是否已经注册过。如果已注册,只记一条日志;如果是新用户,写入标记并向 Slack 发送消息。
export default async function(event, { log, props, store }) {
if (event.type === "identify") {
if (await store.set(`signup/${event.traits.email}`)) {
log(`User ${event.traits.email} already signed up`);
} else {
await store.set(`signup/${event.traits.email}`, true);
await fetch(`https://slack.com/api/chat.postMessage`, {
method: "POST",
body: JSON.stringify({
token: props.SLACK_TOKEN,
channel: props.CHANNEL_ID,
text: `Hooray! We have new user ${event.traits.email}`
})
});
}
}
}
这个例子同时用到了键值存储(store)、日志(log)、配置参数(props)和外部 API 调用(fetch),基本覆盖了 Functions 的典型用法。
为什么用 JavaScript 运行时
Functions 跑在 JavaScript 运行时环境里,这带来两个直接好处:
- 可以用 npm 生态:需要解析、校验、转换数据时,直接引入现成的包,不用自己从头写
- 有键值存储:可以跨事件保存状态,去重、计数、标记“已处理”这类逻辑才成立
对已经有 JavaScript 开发能力的团队,这意味着学习成本低,现有工具和代码片段大多能直接复用。
什么情况下值得用
适合用 Functions 的信号:
- 事件入库前需要按业务规则加工,而不是原样存储
- 需要跨事件维护状态(去重、限流、累计)
- 需要在数据到达仓库的同时触发外部动作
- 团队有 JavaScript 能力,愿意维护自定义逻辑
可能不需要的情况:
- 只需要标准的事件采集和入库,没有加工需求
- 团队没有开发资源维护自定义函数
- 加工逻辑更适合放在仓库内用 SQL 完成
和普通采集方式的区别
| 维度 | 仅用 Jitsu 采集 | 配合 Functions |
|---|---|---|
| 数据形态 | 事件原样入库 | 入库前已加工 |
| 去重/状态 | 需在仓库内处理 | 可在入库前处理 |
| 外部触发 | 需另建链路 | 可在函数内直接调用 |
| 维护成本 | 低 | 需要维护 JavaScript 代码 |
| 灵活度 | 受限于内置能力 | 可调用 npm 生态 |
选择的关键在于:加工逻辑放在入库前还是入库后。放在入库前,仓库里的数据更干净,下游分析不用重复清洗;代价是要维护函数代码。
上手前需要知道的
- Functions 是 Jitsu 功能的一部分,具体可用范围以官方文档为准
- 函数里可以访问
log、props、store等运行时能力,写代码前先确认当前版本支持哪些 - 涉及外部 API 调用(如 Slack)时,令牌等敏感信息应通过配置传入,不要硬编码在函数里
- 键值存储适合轻量状态,不适合当数据库用
如果你的目标是让数据在进入仓库前就符合业务要求,Jitsu Functions 提供了一条用 JavaScript 实现自定义逻辑的路径;如果只是搬运数据,先用基础采集能力即可。