手记

Fastly推出Pub/Sub计算应用,实现实时更新推送

我们激动地宣布推出 Fastly Compute 的 Pub/Sub 应用,它使向浏览器和其他设备推送实时信息更新变得轻松。消息通过 Server-Sent Events 或 MQTT 协议进行传送。查看 演示 以了解其实际效果,继续阅读以了解如何快速地设置自己的实例!

Pub/Sub 是Fastly提供的首批用户可安装的应用之一,Pub/Sub应用开箱即用,可以直接投入生产。它不是需要修改的模板或启动套件。只需安装即可使用。当然,由于代码是开源的,您可以自由分叉并添加自己的功能。我们也欢迎任何贡献。

您可能知道,Fastly还提供了强大的实时消息传递功能,通过Fanout。但是,Fanout是为对消息协议、认证和存储有严格要求的API运营商设计的。如果您不是在构建或运营推送API,只是想把消息发送到连接您网站的浏览器,那么您可以选择Pub/Sub应用。趣闻:有趣的是,Pub/Sub应用是基于Fanout构建的。

该Pub/Sub应用程序非常灵活和可扩展,没有固定的限制。它支持数百万个并发连接和通道,并且单个通道没有数量限制的订阅。虽然用户可以自行安装,但无需管理。Fastly在全球范围内完全无服务器地运行此应用。

开始吧

要开始,请克隆代码库,并使用 fastly 工具部署。

克隆GitHub上的fastly/pubsub仓库吧。
然后进入pubsub目录。
发布fastly compute。

切换到全屏,退出全屏

假设 fastly.toml 文件没有被改动,上述命令会创建一个新的计算服务,并配置相关的资源。

之后,启用服务中的Fanout(即扇出)。

fastly 产品 --enable=fanout

点击全屏按钮可以进入全屏模式,再次点击可以退出。

为您的服务添加一个名为“self”的后端,用于将Fanout管理的请求回传到服务本身。将{DOMAIN}替换为您在部署时选择的域名:

fastly backend create \
  --name self \
  --address {DOMAIN} \  # {DOMAIN}代表你的域名
  --port 443 \
  --version latest --autoclone
fastly service-version activate --version latest \  # 激活最新版本的服务

注:以上命令用于创建一个名为self的后端,并激活最新版本的服务。

全屏/退出全屏

找出名为 'secrets' 的密钥库的 ID:

fastly resource-link list --version latest

进入全屏 退出全屏

找到资源类型为 secret-store 且名称为你给该“secrets”密钥存储命名的那一部分输出。该资源的ID就是这个存储的ID。

创建一个能够发布Fanout消息的Fastly API令牌。为此,请进入Fastly管理面板 -> 账户 -> API令牌 -> 个人令牌 -> 创建令牌。选择自动化类型为purge_select,范围限制在服务内并且没有过期时间,然后点击创建令牌。然后将该令牌保存在上述存储中。

fastly secret-store-entry create \
  -s {STORE_ID}  # 使用STORE_ID作为存储ID \
  --name publish-token  # 该命令用于创建一个名为publish-token的条目

切换到全屏模式,退出全屏

运行该命令会提示你输入 token,你可以直接粘贴。

恭喜你,你已经拥有一个消息推送服务了!接下来,我们就来聊聊怎么用它吧,

用法

消息可以通过HTTP或MQTT协议进行发送和接收,并且需要通过令牌进行授权。接下来我们将讨论如何通过HTTP发送消息。

首先,你需要创建一个令牌签名密钥(token signing key)。比如,你可以通过向应用的 /admin/keys 端点发送一个 POST 请求来完成。

curl \
  -X POST \
  -H "Fastly-Key: $FASTLY_API_TOKEN" \
  https://{DOMAIN}/admin/keys

这是一个用于从Fastly服务中创建或检索API密钥的命令。该命令通过发送一个HTTP POST请求到https://{DOMAIN}/admin/keys,使用Fastly密钥作为API令牌来执行操作。Fastly密钥$FASTLY_API_TOKEN,用于验证请求并确保其安全性。

进入全屏,退出全屏

应用程序将返回一个键ID和值。请将它们保存在安全的地方。这个值用于签署JWT,而这个ID必须放在JWT的kid头部字段里。

当你有了签名密钥后,你就可以根据需要为订阅者和发布者创建权限令牌。下面举一个例子,使用Python和PyJWT库创建令牌,允许访问名为“test”的主题。记得把 {KEY_ID}{KEY_VALUE} 替换为你自己的密钥ID和值。

import jwt
import time

# 这里生成一个JWT令牌,有效期为一小时
jwt.encode({
    "exp": int(time.time()) + 3600,
    "x-fastly-read": ["test"],
    "x-fastly-write": ["test"],
}, "{KEY_VALUE}", headers={"kid": "{KEY_ID}"})

# {KEY_VALUE}是你的密钥值,{KEY_ID}是密钥ID

全屏 / 退出全屏

既然你已经有了一个令牌,你可以注册一个客户端。这里有一个使用curl的例子:

curl \
  -H "Authorization: Bearer $TOKEN" \
  "https://{DOMAIN}/events?topic=test"

使用curl命令请求API接口,获取与特定主题相关的事件。

全屏;退出

上述命令创建了一个客户端可以用来持续接收消息的无限响应体。

这里告诉你怎么发消息

curl \
    -H "Authorization: Bearer $TOKEN" \
    -d '{"text":"hello world"}' \
    "https://{DOMAIN}/events?topic=test"

切换到全屏 退出全屏

运行上述命令之后,curl 的输出应为:

    event: 信息
    data: {"text":"hello world"}

全屏模式 退出全屏

如需更多详情,包括如何通过MQTT使用该应用,请参阅README

有问题:想说的吗?

随时可以在 GitHub 仓库 上提交关于具体代码相关问题或功能请求的 issue,或者在 Fastly 社区论坛 上与我们交流。

0人推荐
随时随地看视频
慕课网APP