Skip to content

欢迎光临Wildebeest:Cloudflare上的Fediverse(下)

欢迎光临Wildebeest:Cloudflare上的Fediverse(下)

缓存和Durable Objects

缓存重复性操作也可以提高需要数据处理的复杂应用程序的性能。著名的Netscape开发者Phil Karlton曾说:“计算机科学只有两件难事:缓存失效和命名。”

Cloudflare显然非常了解缓存,毕竟缓存是我们全球CDN的一个核心功能。我们还向客户提供Workers KV——一个低延迟的全球键值数据存储,任何人都可以用它在我们的数据中心缓存数据对象,构建快速的网站和应用程序。

但KV实现了最终一致的性能。虽然这对许多应用程序和用例来说还不错,但对其他应用程序和用例来说却不太理想。

ActivityPub协议高度事务性,无法实现最终一致性。例如:生成完整的时间线成本高昂,所以我们会缓存该操作。然而,发布帖子时,我们需要在缓存失效后再回复客户端。否则,新的帖子就不会出现在时间线上,客户端可能会因为没有看到它而出错,导致发帖失败。这其实就是我们最流行的客户端上发生过的情况。

我们需要更加聪明。团队讨论了几个选项。幸运的是,我们的API目录有很多选择。例如Durable Objects。

Durable Objects是提供事务性存储API的单实例Workers。需要中央协调性、强一致性和状态持久性时,Durable Objects便是理想之选。处理多个WebSocket连接的状态、协调和路由聊天室消息,甚至运行多人游戏(例如Doom)等用例中均可使用Durable Objects。

现在您已经有所了解。是的,我们在Durable Objects的基础上,为Wildebeest实现了键值缓存子系统。通过利用DO的原生事务性存储API,我们可以有力地保证,当我们创建或更改一个键后,下次读取时将总是会返回最新的版本。

这一构想非常直接有效,我们只用了几行代码,就使用两种原语(HTTP PUT和GET)实现了键值缓存。

强一致性就是这样。现在我们来看看用户注册和身份验证。

Zero Trust Access

官方的Mastodon服务器处理用户注册(通常使用电子邮件注册)之后,您才能选择您的本地用户名,开始使用该服务。如果我们从头开始构建,处理用户注册和身份验证可能非常耗时,令人生畏。

此外,人们不希望为想要使用的每一项新服务创建新的凭证,而是希望有更方便的授权和身份验证方法,就像OAuth那样,可以使用他们现有的Apple、Google或GitHub帐户。

我们希望利用Cloudflare的内置功能进行简化。显然,我们有一款产品可以为Cloudflare保护的任何应用程序处理用户引导、身份验证和访问策略;它就是Zero Trust。因此,我们把Wildebeest部署在它后面。

Zero Trust Access可以使用电子邮件进行一次性PIN(OTP)身份验证,或使用多种标识提供程序(例如Google、Facebook、GitHub、LinkedIn)进行单点登录(SSO),包括任何支持SAML 2.0的常规标识提供程序。

开始在客户端上使用Wildebeest时,根本不需要注册。您可以直接登录,然后将重定向到Access页面,并根据您自己(您的实例的所有者)配置的策略来处理身份验证。

该策略定义了谁可以通过身份验证,以及如何验证。

通过身份验证后,Access将把您重定向到Wildebeest。第一次这样登录时,如果我们没有该用户的信息,我们会检测出来,并要求提供用户名和显示名称。这些问题只会问一次,并直接用于创建您的公开Mastodon档案。

在技术上,Wildebeest实现了OAuth 2规范。Zero Trust保护/oauth/authorize端点,并在用户通过身份验证后,在请求标头中出具一个有效的JWT令牌。然后Wildebeest读取并验证JWT,并在URL重定向中返回一个授权码。

客户端获得授权码后,就可以使用/oauth/token端点来获取API访问令牌。随后的API调用会在授权标头中注入一个持有者令牌。

Authorization:Bearer access_token

部署和持续集成

我们不想为Mastodon运行托管服务,因为这会在一定程度上削弱联盟和数据所有权的概念。此外,我们必须承认ActivityPub和Mastodon是快速发展的新兴技术,将以难以预测的方式迅速演进。

因此,我们认为,现在帮助构建生态系统的最好方式是提供一个开源软件包,任何人都可以在我们的云上使用、定制、改进和部署。Cloudflare显然会继续改进Wildebeest,并支持社区,但我们希望Fediverse维护者可以完全控制和拥有其实例和数据。

但问题是,当Wildebeest需要配置这么多Cloudflare功能时,我们如何分发Wildebeest软件包并轻松部署到某人的帐户中,以及如何支持长期更新软件?

最终解决方案是将GitHub与GitHub Actions、Deploy with Workers和Terraform巧妙搭配。

用Deploy with Workers按钮这一特制链接,可以自动生成工作流程页面,询问用户一些问题,Cloudflare负责授权GitHub部署到Workers,自动分叉Wildebeest存储库并克隆到用户的帐户中,然后使用GitHub Actions工作流程来配置和部署该项目。

GitHub Actions工作流程是一个YAML文件,其中说明了每一步操作。Wildebeest工作流程(简化版)如下:

更新Wildebeest

每当主分支发生变更,都会自动运行该工作流程,因此,更新Wildebeest就像将上游官方存储库与分叉同步一样简单。您甚至不需要使用git命令;GitHub在用户界面中提供了同步按钮,点击该按钮即可,非常简单方便。

还有呢?更新是增量式的,不涉及销毁。将GitHub Actions工作流程重新部署Wildebeest时,我们只对您的配置做必要的修改,没有任何其他操作。您绝不会丢失数据;我们也不需要删除您现有的配置。我们的操作方法如下:

我们使用Terraform,这是一种声明式配置语言和工具,可与我们的API交互,并可查询和配置您的Cloudflare功能。关键在于,每当我们应用一个新的配置时,我们会在一个Cloudflare KV键中为Wildebeest保留一份Terraform状态的副本。当触发新的部署时,我们可从KV副本中获取该状态,计算差值,只进行必要的修改。

也不会有数据丢失问题。如前文所述,D1支持迁移。如果我们需要给表格增加一个新的列或需要新增一个表格,我们不需要销毁、重建数据库,我们只需要将必要的SQL应用于这一变更。

防护、优化和可观察性,轻而易举

一旦启动并运行Wildebeest,您必须保护它免受不良流量和恶意行为者的影响。Cloudflare在“开箱后”只需点击几下即可为您提供DDoS、WAF和机器人管理保护。

同样,您将通过我们的产品获得即时的网络和内容交付优化,以及有关您的Wildebeest实例的性能和使用情况分析。

ActivityPub、WebFinger、NodeInfo和Mastodon API

尽管是Mastodon普及了Fediverse的概念,但其使用的底层技术许多早已有之。这是一个珍贵的时刻,所有技术最终“齐聚一堂”,共同创建一个工作平台,回答互联网用户的实际用例问题。我们来快速浏览一下Wildebeest必须实现的协议:

ActivityPub

ActivityPub是一个去中心化的社交网络协议,至少从2018年起就以W3C建议书的形式出现了。它定义了用于创建和操作内容的客户端API,以及用于内容交换和通知的服务器到服务器API,也称为联盟。ActivityPub的词汇表使用ActivityStreams,这是一个更老的W3C协议。

许多操作和活动的概念都是在ActivityPub规范中定义的。例如:Actors(档案)、消息或Objects(嘟文)、收件箱(您通过收件箱接收关注对象的嘟文)和发件箱(您通过发件箱向关注对象发送嘟文)。

我们实现了ActivityPub的文件夹如下:

WebFinger

WebFinger是一个简单的HTTP协议,用于发现任何实体(例如配置文件、服务器或特定功能)的相关信息。它将URI解析为资源对象。

Mastodon使用WebFinger查询来发现远程用户的信息。例如,假设您想与user example.com互动,您的本地服务器会请求https://example.com/.well-known/webfinger?resource=acct:user example.com(使用acct方案)并得到类似这样的结果:

现在我们已经知道如何使用https://example.com/ap/users/user endpoint端点与user example.com互动。

我们的WebFinger响应如下:

Mastodon API

最后,设置服务器信息、档案信息、生成时间线、通知和搜索等,都是Mastodon特定的API。Mastodon开源项目定义了一个REST API目录,您可以在他们的网站上查找所有文档。

可以在此处(REST端点)和此处(后端原语)查看我们的Mastodon API实现。下面举一个由Wildebeest实现的Mastodon服务器信息/api/v2/instance示例。

Wildebeest还为客户端通知实现了WebPush,为服务器令牌实现了NodeInfo。

其他与Mastodon兼容的服务器也必须实现所有这些协议;Wildebeest便是其中之一。社区非常积极地讨论未来的增强功能;我们将不断提高我们的兼容性,并增加对更多功能的支持,确保Wildebeest在Fediverse服务器和客户端生态系统的形成过程中发挥积极作用。

立即开始使用

技术方面我们已经讨论了很多,下面我们来了解Fediverse。我们尽可能详细说明部署服务器的所有步骤。要开始使用Wildebeest,请前往公共GitHub存储库,并查阅我们的入门教程。

Wildebeest的大多数依赖项提供优惠的免费计划,允许您为个人或业余项目(与关键业务无关)试用它们,但您需要订阅一个Images计划(最低级的计划应该足以满足大多数需求),并视服务器负载情况订阅Workers Unbound(同样,最便宜的计划应该足以满足大多数用例)。

我们倡导内部测试,因此,Cloudflare今天也正式加入了Fediverse。您可以开始关注我们的Mastodon帐户,并使用您最喜爱的Mastodon应用程序获取Cloudflare的定期更新,与通过其他社交平台获取更新的体验毫无二致。这些帐户完全在Wildebeest的服务器上运行。

cloudflare@cloudflare.social-我们的主要帐户

radar@cloudflare.social-Cloudflare Radar

Wildebeest与大多数客户端应用程序兼容;我们已确认可与官方的Mastodon Android和iOS应用程序、Pinafore、Mastodon和tooot兼容,并还在研究与Ivory等其他应用程序的兼容性。如果您最喜爱的应用程序不能兼容,请在此提交问题,我们将尽力提供支持。

结语

Wildebeest完全构建在我们的Supercloud栈上。这是我们创建的最完整、最复杂的项目之一,使用了Cloudflare的各种产品和功能。

希望这篇内容分享能激励您不仅尝试部署Wildebeest,加入Fediverse,并在Cloudflare上构建您的下一个应用程序,无论应用程序要求有多高。

Wildebeest目前还只是一个非常简单可行、与Mastodon兼容的服务器,但我们会不断改进,推出更多功能,支持更多应用程序;毕竟,我们的官方帐户也在使用它。Wildebeest是一种开源服务器,非常欢迎您通过拉动请求或反馈献计献策。

同时,我们在我们的Developers Discord Server上开设了Wildebeest空间,并始终关注GitHub存储库问题选项卡。欢迎与我们交流,我们渴望了解您是如何使用Wildebeest的,也乐意回答您的问题。

PS:为方便阅读并节省空间,本博客中的代码片段经过了简化(例如,删除了TypeScript类型和错误处理代码)。请参阅GitHub存储库的链接,查看完整版本。

相关推荐: 欧洲12国VAT申报周期及其他注意事项

厦门商城系统开发英国 英国的标准税率为20%,只需要进行季报,也就是一年有四次需要申报,季度申报可随意连续三个月进行,在每个季度结束之后的第二个月的7号之前完成申报和缴纳税金(如4月申报1-3季度,那么截止日期是5月7号),平台会代扣代缴,其他部分申报的税金,…

    码刀科技(www.lekshop.cn)是国内知名企业级电商平台提供商,为企业级商家提供最佳的电商平台搭建(多种模式电商平台搭建:B2B/B2B2C/B2C/O2O/新零售/跨境等)、平台管理系统开发及互联网采购解决方案服务, 联系客服了解更多.

    电子商务网站建设的重要性和好处