Skip to content

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

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

最近,Fediverse一直是一个热门话题,成千上万甚至上十万新用户在Mastodon等平台上创建帐户,或完全转移到“另一端”,或试用和了解这一全新的社交网络。

今天我们要介绍的是Wildebeest。这是一个易于部署的开源服务器,与ActivityPub和Mastodon兼容,完全构建在Cloudflare的Supercloud之上。若想在Fediverse中运行自己的服务器,现在您可以完全通过Cloudflare实现。

构建在Cloudflare上的Fediverse。

若想加入Mastodon联盟网络,现在您有两个选择:或加入现有的服务器(服务器也称社区,每个社区都有自己的基础设施和规则),或运行自己的自托管服务器。

想运行自己的服务器有以下几种原因:

您想创建一个新的社区,并通过共同的主题和使用规则来吸引其他用户。

您大概率不会希望不得不必须信任第三方服务器并遵守他们的策略,相反,您会更希望您的服务器可以在您自己的域中为您的个人帐户服务。

您希望完全控制自己的数据、个人信息和内容,并了解实例的运行情况。

非营利组织Mastodon gGmbH使用Ruby、Node.js、PostgreSQL和Redis来帮助实现服务器。不过,运行官方服务器可能存在挑战。您需要在某个地方拥有或租赁一台服务器或虚拟专用服务器(VPS);您必须安装和配置软件,设置数据库和面向公众的web服务器,配置和保护您的网络免遭攻击或滥用。然后,您必须维护所有这些设备,并不断更新。您需要处理大量的脚本和技术工作才能确保正常的启动和运行;非技术爱好者绝对不想这么麻烦。

Wildebeest的宗旨:让您可以在Cloudflare上快速部署与Mastodon兼容的自有服务器,并在几分钟内连接到Fediverse;无需担心维护、滥用或攻击问题;Cloudflare会自动为您处理这些工作。

Wildebeest不是一项托管服务。它是您的实例、数据和代码,以您的Cloudflare帐户在我们的云中运行。而且它是一项开源服务,这意味着它会不断发展,将拥有更多功能,任何人都可以扩展并改进。

目前我们支持:

与ActivityPub、WebFinger、NodeInfo、WebPush和Mastodon兼容的API。Wildebeest可以连接其他Fediverse服务器或接收来自其他Fediverse服务器的连接。

与最常用的Mastodon web(例如Pinafore)、桌面和移动客户端兼容。我们还提供一个简单的只读web界面来浏览时间线和用户档案。

可以发布、编辑、推广或删除帖子、sorry帖、嘟文。我们支持文本、图像,马上还将支持视频。

任何人都可以关注您;您也可以关注任何人。

可以搜索内容。

可以在您的实例下注册一个或多个帐户。可使用电子邮件,或与Cloudflare Access兼容的任何IdP(例如GitHub或Google)进行身份验证。

可以编辑您的档案信息、头像和标头图像。

我们的网络是如何打造的

以上提到的兼容及功能得以实现完全以我们的产品和API为基础。构建Wildebeest是另一个绝佳机会,可以展示我们功能强大、用途广泛的技术栈,证明任何人都可以使用Cloudflare来构建涉及多个系统和复杂要求的大型应用程序。

Wildebeest架构的鸟瞰图如下:

现在我们来了解其细节和技术。

Cloudflare页面

本质上而言,Wildebeest是一个使用Pages Functions运行代码的Cloudflare Pages项目。Cloudflare Pages为构建和部署应用程序、支持您的捆绑资产提供了很好的基础,Functions则让您能够完全访问Workers生态系统,您可在其中运行任何代码。

Functions有一个基于文件的内置路由器。/functions目录结构,按Wildebeest的持续部署版本上传,它定义了您的应用程序路由以及哪些文件和代码负责处理每个HTTP端点请求。这种路由技术与Next.js等框架使用的技术相似。

例如,Mastodon的/api/v1/timelines/public API端点由/functions/api/v1/timelines/public.ts使用onRequest方法处理。

端点单元测试也变得更加简单,只需从测试框架中调用handleRequest()函数即可。请参阅我们的一个Jest测试——mastodon.spec.ts。

与其他普通Worker一样,Functions也允许设置绑定,以便与其他Cloudflare产品和功能交互,例如KV、R2、D1、Durable Objects,等等。可交互的产品和功能还在不断增加。

我们使用Functions来实现官方Mastodon API规范的大部分内容,使Wildebeest与其他服务器和客户端应用程序的现有生态系统兼容,同时在同一项目代码库中运行我们自己的只读web前端。

Wildebeest的web前端使用Qwik。Qwik是一个旨在加快速度的多用途web框架,使用JSX JavaScript语法扩展等现代概念,支持服务器端渲染(SSR)和静态网站生成(SSG)。

Qwik提供一个“开箱即用”的Cloudflare Pages Adaptor,所以我们可以直接使用(查看我们的框架指南,进一步了解如何在Cloudflare页面上部署Qwik网站)。样式设计方面,我们使用Qwik原生支持的Tailwind CSS框架。

可通过/frontend目录查找我们的前端网站代码和静态资产。应用程序由/functions/【【path】】.js动态路由处理,它基本上能捕捉所有非API请求,然后调用Qwik自己的内部路由器Qwik City,由其负责后面的所有工作。

Pages和Functions路由功能强大,用途广泛,使得在同一项目下同时运行后端API和服务器端渲染的动态客户端(实际上是一个全栈应用程序)成为可能。

现在我们来深入了解服务器如何与我们架构中的其他组件交互。

D1

Wildebeest使用D1。D1是Cloudflare为Workers平台构建的第一个SQL数据库,以SQLite为基础,现在向所有人开放α测试,用于存储和查询数据。我们的模式如下:

随着功能不断增多,未来模式可能会发生改变。但没关系,D1支持迁移,当您需要更新数据库模式时,不会丢失数据。使用每个新版Wildebeest时,如果需要改变数据库模式,我们可以创建一个新的迁移文件。

D1支持构建强大的客户端API,帮助开发者操作和查询Worker脚本的数据。在我们的例子中就是Pages Functions。

下面举一个简单的例子,来说明当您在Fediverse上开始关注某人时,整个过程是如何与D1交互的,我们如何与D1交互。

Cloudflare的文化倡导内部测试,在自己的产品基础上构建,这意味着我们有时会比用户先发现产品的不足。使用D1确实给我们带来了一些挑战,D1以SQLite为基础,用于存储我们的数据。下面来看两个例子。

ActivityPub使用UUID来识别对象,并在URI中广泛引用。这些对象需要存储在数据库中。PostgreSQL等其他数据库则提供内置函数来产生唯一标识符。SQLite和D1目前没有这个功能,但已列入我们的计划。

别担心,Workers运行时支持Web Crypto,所以我们使用crypto.randomUUID()来获取唯一标识符。请参阅/backend/src/activitypub/actors/inbox.ts:

如此一来,问题就得以解决了。

另一个例子是,我们需要存储具有亚秒级分辨率的日期。同样,PostgreSQL等数据库也有该功能。

但SQLite的不足之处在于:

我们通过一个小型hack程序,使用strftime()解决了这个问题:

请参阅我们的初始SQL模式,查找cdate默认值。

Images

Mastodon的内容有大量富媒体。我们不需要重复整个过程,重建图像管道;Cloudflare Images提供API,从我们的全球CDN上传、转换和提供优化的图像,完全符合Wildebeest的要求。

发布内容图像、档案头像或标头等,都是使用图像API。

也可从仪表板访问Cloudflare Images。可以用它来快速浏览或管理您的目录。

队列

ActivityPub协议是为聊天设计的。根据社交图谱的大小,可能会有很多来回传递的HTTP流量。我们不能在每次有人发帖时,都让客户端等待数百条Fediverse消息的传送,造成拥堵。

我们需要寻找一种方法,既支持异步工作,又启动后台作业,将数据处理从主应用程序中分离出来,以保持客户端的敏捷性。官方的Mastodon服务器有一个类似策略,使用Sidekiq负责后台处理。

幸运的是,我们也不需要担心这些复杂的问题。Cloudflare Queues让开发人员能够安心无虞地发送和接收消息,为Workers请求分担一些工作,从而有效提供异步批量作业的能力。

简而言之,您有一个队列主题标识符——本质上是一个自动扩展的缓冲列表;然后您有一个或多个生产者生产结构化的消息(在我们的例子中就是JSON对象),并把它们放入队列(模式由您定义);最后您有一个或多个消费者订阅该队列,接收消息并按自己的速度处理消息。

在我们的案例中,每当任何传入的API调用需要时间长、成本高的操作时,主应用程序就会产生队列作业。例如,有人发布帖子、sorry帖或嘟文时,我们需要将其传送到粉丝的收件箱,可能会引发许多对远程服务器的请求。这时,我们为此排列作业,将API释放出来确保继续响应:

同样,远程服务器向我们的实例收件箱传送消息时,我们也不希望停止主API。Wildebeest在收件箱接收消息时,创建异步作业的方法如下:

最后一环是我们的队列消费者,它们在一个独立的Worker中运行,独立于Pages项目。消费者监听新的消息,并按自己的节奏依次处理,将其他人从拥堵中解救出来。繁忙时,队列会增加缓冲区。尽管如此,一切仍在运行,作业最终会全部分派,将主要的API释放出来处理关键的事情:尽可能快速响应远程服务器和客户端。

如果您想亲自体验Queues,可以试试这个简单的例子:使用Queues在R2中存储数据。

相关推荐: 约会应用的收入和使用量持续飙升:我们能用金钱能买到爱情吗?

对于全球不断增长的约会应用而言,2023年将会是最成功的一年,因为追寻爱情的用户们在这些应用上的年使用时长已接近7亿个小时。以下是该类别应用在情人节的重要统计数据。 全球移动用户不仅认真接受并使用约会应用,而且还表现出为寻求这种人际关系付费的意愿。在回顾dat…

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

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