Skip to content

Laf x Heartbeat ​

一个基于 Laf 的云函数心跳服务。

构成 ​

本项目主要构成有3部分。

  1. 心跳服务端云函数:/laf-cloud/functions/__heartbeat_server_test.ts
  2. 心跳客户端云函数:/laf-cloud/functions/__heartbeat_client_test.ts
  3. 供客户端注册、配置的web服务:除 /laf-cloud/ 目录外其它文件。访问地址:heartbeat.muyi.dev

基本逻辑 ​

  1. client 注册到 server,并生成配置项。
  2. 配置 client ,激活 client 在 server 的状态。
  3. client 向 server 发送心跳,更新 server 中记录的更新时间,并重置异常次数和推送次数。
  4. server 定期查询,并处理数据
    1. 更新时间比当前时间超 1 分钟,且异常次数超过最大设定值的,发起推送并计数,直到超过最大推送次数后不再发送。
    2. 更新时间比当前时间超 1 分钟,但异常次数未超过最大设定值的,异常次数+1.

客户端部署流程 ​

前置条件:需要已知一个 Laf x HeartBeat server 地址。如果还没有,可以查看下面内容自己部署一个。

从 Laf 函数市场 或本项目 /laf-cloud/functions/ 中找到 client 函数,部署至自己的 Laf 实例中。注意: 一定要把函数名改掉,随机的最好。尽量不要泄露你的 client 地址。

注册到心跳服务器 ​

此流程基于web界面可视化操作,打开 heartbeat.muyi.dev,输入 server 地址,如下图。

image-20230720095249601

如果 server 正常,则会显示服务基本信息,如下图。然后填写你的 client 地址。

image-20230720095325042

未注册到当前服务器的 client 会出现以下提示,点击确定后即可注册到当前 server。

image-20230720095624405

然后,页面会显示两个配置信息,需要你把配置信息填写到你的 client 云函数中,如下图。最后点击“激活”按钮。

image-20230720105903222

image-20230720095835184

激活后就可以看到如下配置界面,下次再登录也会显示该界面。

image-20230720100051833

至此,注册和配置就完成了。还需要配置触发器,让心 跳起来。

配置触发器 ​

还不了解 Laf 触发器,可以看这里。

如果你当前 Laf 实例还未创建触发器,可以先为触发器创建一个云函数(内容在下面),然后创建触发器指向这个云函数即可;如果当前实例中已经有触发器了,可以参考下面的代码把 heartBeat 引入你的触发器函数。

js
import { heartBeat } from '@/你 client 函数的名字'
exports.main = async function () {
    await heartBeat()
}

需要注意的是,服务端中配置的异常间隔是 1 分钟,所以触发器中配置的定时器,不要超过 1 分钟。

服务端部署流程 ​

server 和 client 不要部署在同一个 Laf 实例中,尽量也不要部署在一个 Laf 站点中。我不确定 laf.run (或 laf.dev) 内的实例是不是在一台物理服务器上,是否会出现整个 laf.run (或 laf.dev) 的实例一起停止。

从 Laf 函数市场 或本项目 /laf-cloud/functions/ 中找到 server 函数,部署至自己的 Laf 实例中。最好把名字改一下,简单好记为准,方便分享。

如果你希望公开你的 server 服务,你可以提交 server 信息至 issues,我会把它展示到 web 端供大家使用。提 pr 就更好了,搓手期待!

为保证心跳服务不会影响到您实例中的实际业务,这里做了最大注册数的配置项,根据实际情况自行配置。

image-20230720102232281

配置触发器 ​

还不了解 Laf 触发器,可以看这里。

如果你当前 Laf 实例还未创建触发器,可以先为触发器创建一个云函数(内容在下面),然后创建触发器指向这个云函数即可;如果当前实例中已经有触发器了,可以参考下面的代码把 heartBeat 引入你的触发器函数。

js
import { schedule } from '@/你 server 函数的名字'
exports.main = async function () {
    await schedule()
}

需要注意的是,schedule 方法中配置的异常间隔是 1 分钟,所以触发器中配置的定时器,设置大于等于 1 分钟即可,推荐 1 分钟。

技术栈 ​

  • Laf 云函数
  • nuxt.js v3
  • pinia
  • elementUI plus
  • unocss

下面是立项时构思的大致逻辑, 实际有些许出入.

20834de9a8c0edd5c766c9887230680

client ​

作为客户端的云函数,主要就两个功能

  1. 接收server发来的验证请求,返回设定好的key给server进行验证。
  2. 发送心跳,去更新server中的数据信息。需要触发器指向这个方法。

server ​

作为服务端的云函数,主要有以下功能

  1. 获取 client
  2. 注册 client
  3. 激活 client
  4. 切换 client 暂停状态
  5. 删除 client
  6. 更新 client 配置
  7. 接收心跳,并更新数据。
  8. 定时处理异常数据,需要触发器指向这个方法。
  9. 获取服务器数据

web ​

无服务的web界面,主要有以下功能

  1. 用户身份为客户端,选择一个 server,把自己的 client 注册到此 server,并做相关配置。
  2. 用户身份为服务端,输入鉴权信息登录后,管理当前 server 下所有 client 数据。