在后台运行带有事件和 cron 计划的 Next.js 函数
当您的应用程序变得过于复杂而无法完全由同步 API 端点组成时,就会出现某个时间点。 API 非常适合您的用户正在采取的需要立即响应的 CRUD 操作,但是当您想在后台在应用程序中做一些工作时,有些用例:
-
非关键路径任务 - 当您的 API 需要执行一些并非真正关键的工作时,您应该将其移出请求的关键路径,以确保用户及时响应。您的用户不必等待更长时间的响应,因为您的应用程序需要发送电子邮件、更新 CRM 或执行一些数据聚合以存储在您的数据库中。
-
计划任务 - 您需要定期运行一些事情,例如向您的用户发送每周摘要电子邮件或定期进行数据清理。
为了完成这些类型的事情,你通常有一些选项需要设置更多的基础设施,比如消息队列、发布订阅,或者将你的代码部署到另一个进行调度的平台。对此有两个考虑:
-
时间和复杂性: 它需要构建一些您自己的基础架构,这很耗时,而且,如果您不熟悉这些架构,您将了解问题和陷阱以及艰难的方式。
-
**日志和可观察性:**如果没有其他服务的更多配置和代码检测,您将无法获得有关后台发生的事情的日志、指标或跟踪。
Ingest 平台可以通过完整的可观察性和审计跟踪为您做到这一点,而无需配置新的基础设施。让我们看看我们如何在几分钟内使用在 Vercel 或 Netlify 上运行的现有 Next.js 项目来完成这项工作。
调度功能
如果您想向您的用户发送每周电子邮件摘要,您需要每周在特定时间运行一次。也许您已经编写了代码来查询数据库中的用户,查询他们每周的产品使用情况,并格式化精心设计的电子邮件以发送给他们。这是一个很棒的功能和用户保留工具。这是a Next.js api route中的一些假设代码:
/* /pages/api/sendWeeklyDigests.js */
export default async function handler(req, res) {
const results = await sendWeeklyDigestEmailsToAllUsers();
res.status(200).json({
message: `Weekly digests sent to ${results.sent} users successfully`,
});
}
进入全屏模式 退出全屏模式
在 Ingest 上安排这个只是几个简单的步骤:
1.安装inngestcli:
$ curl -sfL https://raw.githubusercontent.com/inngest/inngest-cli/main/install.sh | sh && \
sudo mv ./inngest /usr/local/bin/inngest
进入全屏模式 退出全屏模式
- 导航到项目的仓库并初始化一个新函数。在这里您可以选择您的日程安排 - 您可以稍后更改(Crontab Guru对于生成日程安排很有用)。选择“调用 URL” - 这将是您要请求的端点的 URL。在这里,我们将在每周一的 12pm (
0 12 * * 1) 使用一次:
1.登录并部署您的功能:
$ inngest login
$ inngest deploy
进入全屏模式 退出全屏模式
在 Ingest Web 应用程序中创建计划函数
您还可以在 Ingest Web 应用程序中快速创建计划函数。从的“Functions”选项卡中,单击“New Function”按钮并选择“Call an existing HTTP endpoint”。在右侧,您将能够单击功能“触发器”下拉菜单并选择“按计划运行”。然后,您可以选择“运行”来测试您的功能或“部署”来部署它并使其生效!
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--hWWn3t3n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/ https://www.inngest.com/assets/blog/run-nextjs-functions-in-the-background/web-ide-cron-job.png)
后台作业和事件驱动功能
将代码移出请求的关键路径可以为您的 API 后端带来多项好处。如果您以前没有这样做过,将一些代码移动到后台作业或函数的一些优点:
-
解耦可以重复使用的关键逻辑
-
确保初始 API 请求保持尽可能快
-
提供由谁以及何时触发的作业的审计跟踪
当您实现此模式时,您的初始端点会向 Ingest 发送一条消息并立即响应,从而允许您向用户返回响应。 Ingest 记录消息(也称为事件),然后将请求分派到您选择的端点并等待响应,记录响应代码和正文。
[
分派的后台作业的图表](https://res.cloudinary.com/practicaldev/image/fetch/s--3KgF7ugV--/c_limit% 2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.inngest.com/assets/blog/run-nextjs-functions-in-the-background/call-url-diagram.gif)
第一步是选择您的事件消息发送到您的后台功能。这由事件名称和有关该事件和相关用户的任何相关数据组成。对于此示例,我们的事件名称将为user.signup,我们将传递用户的电子邮件以及他们在您的注册调查中捕获的团队角色。我们的活动将如下所示:
{
name: "user.signup",
data: {
signupReason: "some string"
},
user: {
email: "the.user.email@example.com"
}
}
进入全屏模式 退出全屏模式
让我们定义将被调用的函数:
1.安装inngestcli
$ curl -sfL https://raw.githubusercontent.com/inngest/inngest-cli/main/install.sh | sh && \
sudo mv ./inngest /usr/local/bin/inngest
进入全屏模式 退出全屏模式
- 导航到项目的仓库并初始化一个新函数。在这里,您可以选择您的事件作为触发器并输入新的
user.signup。选择“调用 URL” - 这将是您要发送请求的端点的 URL,例如https://myapp.com/api/sendWelcomeEmail。
$ inngest init
Let's get you set up with a new serverless function.
Answer these questions to get started.
1. Function name: Send Welcome Email
2. Function trigger: Event based
3. Function type: Call a URL
4. Event trigger: user.signup
🎉 Done! Your project has been created in ./send-welcome-email
For more information, read our documentation at https://www.inngest.com/docs
进入全屏模式 退出全屏模式
- 使用 inngest JavaScript 库,我们可以在 API 的注册函数中发送此事件(您可以根据需要创建任意数量的唯一源密钥):
/* /pages/api/signup.js */
import { Inngest } from "inngest";
export default async function handler(req, res) {
const { email, password, signupReason } = req.body;
const result = await createNewUser(email, password);
const inngest = new Inngest(process.env.INNGEST_SOURCE_KEY);
await inngest.send({
name: "user.signup",
data: { signupReason },
user: { email },
});
res.status(200).json({ success: true });
}
进入全屏模式 退出全屏模式
- 我们的后台作业函数将接收此事件为
req.body,因此,对于此示例,我们的函数可能如下所示:
/* /pages/api/sendWelcomeEmail.js */
export default async function handler(req, res) {
const { event } = req.body;
const result = await sendEmail({
template: "welcome-email",
to: event.user.email,
data: {
// The template will use this to show useful content to our new user
signupReason: event.user.data.signupReason,
},
});
const messasge = result.ok ? "Successfully sent" : result.error;
res.status(result.ok ? 200 : 500).json({ message });
}
进入全屏模式 退出全屏模式
- 现在一切就绪,您可以将您的功能部署到 Ingest:
$ inngest login
$ inngest deploy
进入全屏模式 退出全屏模式
当您下一次部署 Next.js 应用程序时,您现在将开始将工作卸载到后台作业!请记住首先将 Ingest Source Key 添加到您的环境变量中 😉。
在 Ingest Web 应用程序中创建后台作业或事件驱动函数
与上面创建计划函数非常相似,您可以在我们的 Web 应用程序中创建一个由事件触发的函数。单击默认事件触发器将允许您选择一个新事件。您可以创建自己的新事件并根据需要命名。您还可以轻松地编辑测试事件paylod,然后单击“运行”将请求发送到您的服务器。当您对所拥有的内容感到满意时,请单击“部署功能”以使其生效!
查看事件和功能历史
当您部署计划函数或后台作业时,您将获得应用程序发送的事件消息和后台函数发送的响应的完整历史记录。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--6Dt5vEny--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880 /https://www.inngest.com/assets/blog/run-nextjs-functions-in-the-background/web-inspect-events.gif)
现在去发货吧!
恭喜!您现在知道如何轻松地将应用程序中的关键逻辑移动到异步并移出请求的关键路径。后台作业对于您拥有的任何可扩展和高性能应用程序都很重要,因此我们认为这将真正帮助您开发令人惊叹的产品。
PS - 如果您需要为事件运行更长时间的后台作业(最多 15 分钟!),您可以将您的函数直接部署到 Ingest:这是创建和部署 TypeScript 函数的快速入门指南
更多推荐



所有评论(0)