解决DNS问题|WunderGraph云使用NATS JetStream

2023-02-12 17:14:51 浏览数 (2)

作者:Dustin Deus

WunderGraph

在 WunderGraph,我们正在为开发人员构建一个无基础设施的云,这意味着我们将开发人员从处理基础设施中解放出来。我们认为开发人员不需要精通部署和维护基础设施来构建全球 SaaS。

WunderGraph 就是为了让我们的生活变得更简单(我们使用 WunderGraph 来构建WunderGraph 云[1])。它允许你将不同类型的数据源(如 REST、GraphQL 和数据库)集成到一个统一的表示(虚拟图)中,从而使使用 API 依赖项的工作成为一种愉快的体验。

由于这种架构,我们可以为不同的平台和编程语言,自动生成优化的客户端,并且像身份验证、授权和缓存这样的核心功能都是现成的。因此,专注于编写你的业务逻辑,而不是管道设施。

以可伸缩和可靠的方式部署网关,并提供工具来操作它是一项复杂的任务。我们希望让客户,尽可能轻松地完成这项任务。因此,我们正在构建 WunderGraph 云。这是一项托管服务,可让你在几分钟内在全球范围内部署、构建和管理完全可定制的无服务器网关。在这方面,无服务器意味着当你不使用服务时,你不需要付费。WunderGraph 针对冷启动和高性能进行了优化,允许你支付无服务器价格,同时获得完整的服务器体验。

DNS 问题

图 1:之前

如果你需要独立解决这个问题,那么在全球部署 WunderNodes 听起来是一个具有挑战性的问题。幸运的是,我们依靠合适的基础设施合作伙伴,通过几个 HTTP 调用就可以实现这一点。从高层次的角度来看,WunderNode 是一个隔离网络中的虚拟机,它被小心地暴露在互联网上。最初,我们使用 Cloudflare Workers 将用户请求路由到正确的公共 IPv4 地址。所有数据都存储在最终一致的 Cloudflare KV 存储中。使用这种方法,我们经常会遇到 DNS 传播问题,因为每个新的 Ipv4 地址都必须在全球范围内进行分配和分发。此外,IPv4 地址的短缺让我们重新思考我们的架构。

解决方案:JetStream 作为全球分布式键/值存储

引入 Heimdall。Heimdall 是我们部署到所有接入点(point-of-presence,POP)的定制边缘代理。它负责管理主机->IP 路由,并作为我们分析仓库的事实来源。我们也不再依赖公共 IPv4 地址。相反,我们在BGP Anycast[2]网络中使用私有 IPv6 地址。每个应用程序都与其他应用程序隔离,只有 Heimdall 暴露在互联网上。这使我们能够将网络扩展到无限数量的应用,而不会遇到任何 IP 地址限制。

图 2:使用 NATS JetStream 后

当在 WunderGraph 云上提供新的应用程序时,我们需要一种可靠的方法来存储主机->IP 映射,并将更改传播到所有全局 Heimdall 实例。在尝试了不同的解决方案后,我们使用NATS JetStream[3]作为我们的分布式键/值存储。

它非常适合我们的用例。键/值存储是一致的、高度可用的和水平可伸缩的。此外,JetStream 允许我们观察变化,因此 Heimdall 实例可以得到有关变化的通知,并更新其路由表。重启后,它会将 JetStream 的最新状态加载到内存中。实际上,我们在不到一秒钟的时间内将更新发布到全球各地。

除了功能性,我们还喜欢 NATS 生态系统的质量。Golang 客户端维护积极,界面设计精良[4]

因此,JetStream 也非常适合我们架构的其余部分。我们希望 JetStream 不仅仅用于存储路由表。NATS & JetStream 将是我们计划提供的其它几项服务的支柱。

未来,WunderGraph 云将为你提供类型安全的 API,以支持以下用例:

  • 跨请求的持久数据的键/值存储。
  • WunderGraph 函数之间的发布/订阅功能。
  • 可靠实施工作流的类似时间的体验。
  • 还有更多……

总之,我们对 JetStream 及其可能性感到非常兴奋。作为早期采用者,我们很高兴与社区分享我们的经验和知识。如果你有兴趣帮助我们解决未来的一些挑战,请随时联系我们。我们在招人[5]

关于作者

Dustin Deus 是 WunderGraph 的联合创始人兼技术主管。他对 web、分布式系统和基础设施充满热情。他也是一个开源爱好者,喜欢与社区分享他的知识。你可以在Twitter[6]或者GitHub[7]上找到他。

参考资料

[1]

WunderGraph 云: https://wundergraph.com/

[2]

BGP Anycast: https://en.wikipedia.org/wiki/Anycast

[3]

NATS JetStream: https://docs.nats.io/nats-concepts/jetstream

[4]

设计精良: https://twitter.com/dustindeus/status/1613203957857361920

[5]

招人: https://wundergraph.com/jobs

[6]

Twitter: https://twitter.com/dustindeus

[7]

GitHub: https://github.com/StarpTech

0 人点赞