Hasura Cloud:为您的数据库和服务管理GraphQL

2020-06-23 02:46:20

这是我们自今年1月以来一直在努力的事情。我们使用核心的Hasura GraphQL引擎作为基础,确保我们能够提供Hasura作为云产品,其中您不需要考虑实例数量、内核、内存、并发用户数、高可用性、实时监控、缓存、跟踪、速率限制和其他基础设施方面的问题,而不是您真正想要花费时间的事情。

对于那些刚接触Hasura的人来说,Hasura GraphQL引擎是一项开源服务,它使用元数据引擎连接到新的或现有的数据源(如Postgres、REST API、GraphQL API等),并提供内部或外部应用程序可以连接到的托管且安全的GraphQL端点。

我们想让API开发者看不到GraphQL,并给API消费者一个他们喜欢的GraphQL API。对我们来说,合乎逻辑的下一步是将Hasura GraphQL引擎作为托管云服务提供。

Hasura的每个实例都是一个高度多线程的服务器,它利用实例中的共享内存在运行时积极优化GraphQL查询的处理。如果您自己运行Hasura,您可以先垂直缩放几个Hasura实例,然后再水平缩放。您应该纵向扩展或横向扩展的CPU或内存阈值是多少?井…。这要看情况。Hasura的足迹对于不同类型的工作负载是不同的。

如果你在Hasura Cloud上运行,你不需要在意!Hasura Cloud不会要求您考虑实例数量、内核、内存、阈值等。将您的数据库和其他服务连接起来,它就能正常工作。

您可以不断增加并发用户数和API调用数,Hasura Cloud将会弄清楚如何确保您的GraphQL API持续提供。🤓。

最终,API性能将成为数据库的瓶颈。Hasura Cloud附带监控和跟踪功能,可帮助您了解数据库查询性能,并让您深入了解要做什么。大多数DBaaS供应商使垂直扩展Postgres或将已读副本添加到主Postgres服务器变得非常容易。

顺便说一句,如果您的上游服务也是以无状态方式编写的,特别是当您使用具有无服务器功能或自动伸缩容器的操作时,那么云供应商也会自动扩展这些服务。🤘

Hasura GraphQL引擎已经提供了查询缓存,其中缓存了完全限定的GraphQL AST的内部表示,因此不需要重新计算它的计划。例如,当一个带有变量和会话变量的GraphQL查询进入时,生成的SQL已经准备好作为语句,并且精确的最终用户基于会话的变量和动态API变量(查询变量)被放大到数据库。这使得Hasura的查询非常快。

Hasura cloud更进一步,增加了对数据缓存的支持。我们已经迈出了第一步,还有很多事情要做,但下面是Hasura Cloud对缓存的看法,这是我们API开发人员通常在我们的应用服务器中构建的东西。

应用程序级缓存有很多目的,但最常见的要求通常是减少底层数据源的负载。

如果API调用不依赖于用户的属性,那么可以直接说所有API调用都将获取相同的数据。可以从高速缓存中检索高速缓存的数据并将其发送给API使用者。

如果API调用依赖于用户的属性,那么我们需要知道是否因为用户的身份,他们最终会获取其他用户已经缓存的相同数据。假设同一地区的每个人都在他们的应用程序上获取相同的餐厅列表。这是一个动态规则,因为用户可以更改他们的当前区域,因此获取哪些缓存实体取决于此时谁在进行API调用。

在计算机科学中有两个难题:高速缓存失效、命名事物和Off-by-1错误。

-Leon Bamrick(@SecretGeek)2010年1月1日。

当用户进行执行写入的API调用时,很难破坏同一个API服务器或API服务器的其他实例正在使用的缓存。

这是物化视图动态更新问题的一个版本,但是在可能从多个数据源获取的应用程序级别。这通常就是为什么大多数使用Redis之类的应用服务器开发人员通常使用#1(知道要缓存什么)中的信息来设置TTL,并处理UI端的临时过时问题的原因。

因为Hasura有足够的跨数据源数据模型的信息,而应用程序级的授权规则有足够的信息通过解决上述所有问题来提供端到端的应用程序缓存。

今天,我们推出了对缓存共享数据的经过身份验证的GraphQL API调用的支持(问题1)。今天我们如何处理缓存失效?我们使用TTL配置,以便在一定时间间隔内刷新状态数据。

好消息是,由于API写入和工作流通过Hasura(GraphQL突变),Hasura最终也可以处理自动缓存无效!

除了监控来自GraphQL API调用及其响应的成功错误(和部分错误)之外,Hasura Cloud还添加了对监控WebSocket连接和订阅的强大支持!

生产中会发生奇怪的事情,很难知道问题是从哪里来的。在生产中端到端地跟踪请求和响应,并通过系统中的各种组件进行跟踪是至关重要的。

Hasura充当GraphQL API使用者、数据模型和通过HTTP(GraphQL远程模式或REST API操作或事件触发器)引入的自定义业务逻辑或外部服务之间的支点和协调点。

Hasura Cloud增加了与OpenTracing的深度集成,因此它可以创建跟踪,或尊重传入的跟踪范围。Haura还将跟踪ID和SPAN-ID转发到服务,以便可以在整个系统中轻松收集分布式跟踪。例如,这是从Hasura Forwarding to an Action收集的跟踪,它与数据库交互,然后当Hasura端到端可视化时,数据库的响应会得到丰富。

今天,Hasura Cloud支持将Datadog作为发送跟踪的目标,随着时间的推移,我们将迅速增加更多支持OpenTracing的供应商。

当您在生产环境中运行GraphQL API时,可能需要添加一些速率限制规则。尤其是如果您的API是面向API的开发人员,而不仅仅是由应用程序使用。通过速率限制,您可以确保您的服务器和数据源不会受到恶意用户的突然攻击,还可以确保您的客户或租户在合理的限制内使用您的API。

根据您希望速率限制的用途,您需要在各种并发API请求之间保持某种状态,以“计算”用户的限制。

Hasura Cloud为未经认证的用户提供速率限制(基于IP)或通过终端用户会话变量参数化。速率限制规则可以根据上述参数设置每分钟最大请求数,也可以设置查询深度限制。随着时间的推移,我们还将添加对基于动态查询成本的限制的支持!

Hasura Cloud捕获查询(可选择剥离会话和查询变量,因为它们可能是敏感的),并将其提供给您用于两个主要用途:

您可以导出Hasura在给定时间窗口捕获的一组GraphQL查询和突变,然后将其用于各种事情。

回归测试:当您进行更改时,您可以在Hasura控制台或您最喜欢的测试运行器中针对您的试运行环境运行测试!这样,您就可以知道您对Hasura所做的任何更改是否会影响您在生产中看到的GraphQL查询。

允许列表管理:您还可以使用捕获的查询集创建或更新允许列表。例如,您在Haura云上的临时项目可以从您的应用程序测试套件捕获查询,并使用它来帮助您构建允许列表。

Hasura连接到您拥有的系统上运行的数据库和服务。例如,您可以连接到在VM上运行的Heroku Postgres或RDS、云SQL或您自己的Postgres。

虽然Hasura和您的服务之间的所有通信都可以加密TLS/HTTPS,但无论如何,确保您的数据库和服务只接受来自Hasura的连接可能会进一步受益。

我们还开始了获得SOC2、ISO 27001和HIPAAReady认证的过程,这样您就可以更轻松地开始在企业环境中使用Hasura Cloud。如果您还想了解更多,请与我们联系!

Hasura是一个开源引擎,在新的或现有的Postgres数据库上为您提供实时的GraphQL API,内置支持缝合自定义GraphQL API并在数据库更改时触发WebHook。