影子请求:OkCupid的第一个GraphQL发布的故障排除188bet金宝搏官网

当我们在一个全新的堆栈中构建GraphQL API时,我们希望看到它在实际生产负载下如何与之前的REST API相比较,并且我们希望这样做不会对用户体验产生负面影响。

为此,我们释放了调用的对象影子请求.在我们的目标页面上,用户像往常一样从REST API加载页面数据并显示页面。然后,用户从GraphQL加载相同的数据,测量调用的时间,并丢弃数据。

我们并没有想到这个想法,但它却改变了我们的游戏规则:我们发现GraphQL API的第一个版本就是这样的两倍的时间- REST API的1200ms和600ms。如果我们将这个版本展示给真正的用户,他们将会有非常糟糕的体验。

要了解这个测试如何适应我们在OkCupid上发布GraphQL API的整个过程,请参阅我之前的内容188bet金宝搏官网关于过渡的帖子.但在这里,我将讨论我们在Docker和Node环境中发现的改进,GraphQL解析器如何处理实体列表和CORS请求。所以,让我们来看看!

Docker和Node低挂果实

我们意识到的第一件事是我不小心发布了一个带有NODE_ENV设置为发展.您总是听到不要这样做,因为开发模式会在包中启用更多的日志记录和更慢的代码路径。但现在我有经验证据可以证明为什么不是:改变NODE_ENV生产平均每个请求节省34毫秒。

在这个初始部署中,我们还使用了一个未优化的Docker基础映像。从节点node-stretch-slim图像大小减少600mb (850mb至250mb);虽然这并没有加快应用程序的响应时间,但通过加快构建和部署流程,它确实加快了我们的开发周期。

这不是最大的胜利,但这是两个最容易的胜利!

幼稚的GraphQL解析器可能很迟钝

如果您有一个返回实体列表(在本例中是OkCupid用户)的字段,那么您可能会得到每个用户的信息,比如他们的姓名或年龄。188bet金宝搏官网

我们要为这个部署转换为GraphQL的页面是OkCupid消息页面。188bet金宝搏官网在创建模式时,我们定义了谈话具有来自上次发送的消息的文本片段,以及用户实体代表与您交谈的人。然后我们在顶层添加了一个字段用户实体获取该用户的会话。以下是模式和解析器的相关部分:

简化版的谈话模式

这工作;我们部署并庆祝!但当我们查看请求的堆栈跟踪时,我们看到的是这样的:

那个瀑布绝对不是我们要找的。但是考虑一下,这是有意义的:我们只是告诉解析器如何获取单个用户的信息,所以它会做它所知道的所有事情,并向后端发出20个级联请求。

但是,我们可以做得更好。我们碰巧已经有一种方法可以同时从后端获取关于多个用户的信息,所以解决方案是用一个包更新解析器,以批处理相同实体类型的多个请求。很多人使用DataLoader,但在这个例子中,我发现GraphQL解决批量更符合人体工程学。这是我们更新后的解析器:

注意更新的数据源调用-getuser而不是getUser

所以在这里,我们传递给包一个看起来像普通解析器的函数,但不是获取作为第一个参数,包提供父母(我们的对话列表)。然后取出用户id并调用批处理API端点,getuser.这一改变将通话时间缩短了近275毫秒,时间线看起来相当流畅:

在这种特殊情况下,追逐瀑布是明智的

子域+ CORS对我们不起作用

这两个变化让我们达到了大部分目标,但是我们的GraphQL API仍然比REST API慢300ms。由于我们已经尽可能地削减了服务器端的内容,所以我们开始从客户端的角度进行研究。

在项目的早期,我们决定从graphql.188bet金宝搏官网okcupid.com,并看到用户请求来自www.188bet金宝搏官网okcupid.com在飞行前触发了CORS这很正常,但他们的时间就像是永恒:300毫秒(这个时间听起来耳熟吗?)我们和我们的行动团队从多个角度进行了调查(是cloudflare吗?我们的负载均衡器HAProxy?),但没有提出任何合理的线索。所以我们决定试着从www.188bet金宝搏官网okcupid.com/graphql, 300毫秒消失了。什么把戏!

嘿,这工作

在对我们的设置发布了这一系列更改之后,我们达到了与旧REST API相同的水平。我们发现并修复了Node环境、GraphQL解析器和CORS的问题,所有这些都没有影响站点性能。然后我们发布了一个实验,比较了从GraphQL和REST API加载数据的真实用户。

如果您正在考虑向您的堆栈中添加新技术,希望您会考虑一个影子请求来验证它。如果这个堆栈碰巧创建了一个GraphQL API,希望您可以避免我们遇到的一些陷阱。好运!

多亏了雷蒙德孙OkCupid网188bet金宝搏官网络团队阅读本文草稿。

188bet金宝搏官网OkCupid科技博客

阅读来自OkCupid工程团队的故事,每天连188bet金宝搏官网接着数百万人

迈克尔·p·Geraci

写的

OkCupid的网络工程师188bet金宝搏官网

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责每天为数百万人配对。在OkCupid科技博客上阅读他们的故事188bet金宝搏官网

迈克尔·p·Geraci

写的

OkCupid的网络工程师188bet金宝搏官网

188bet金宝搏官网OkCupid科技博客

188bet金宝搏官网OkCupid的工程团队负责每天为数百万人配对。在OkCupid科技博客上阅读他们的故事188bet金宝搏官网