我们激动地宣布推出 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 社区论坛 上与我们交流。