当前位置: 首页 > 知识库问答 >
问题:

无法为GraphQL订阅建立websocket连接

苏野
2023-03-14

我正在尝试在服务器上实现基于GraphQLWebSocket的@订阅(使用NestJS@subscription)。服务器托管在AWS ECS上,位于ALB后面。我们目前通过VPC链接与ALB建立了AWS API GW连接。

我试图用我们在HTTP API GW中使用的相同的VPC链接构建一个专用的Websocket API GW。我还试图在我们的ECS上安装一个新的NLB(网络负载平衡器),并在专用的Websocket API GW中使用一个新的REST VPC链接。

客户端和服务器正在使用 graphql-ws 库通过 graphql-transport-ws 子协议进行通信,并且通信在本地主机设置上工作正常。

在本地主机上运行以下命令时,我能够建立一个web套接字连接:

wscat -c ws://localhost:3000/graphql -s graphql-transport-ws

当对WebSocket API GW URL运行相同的操作时

wscat -c wss://*****.execute-api.*****.amazonaws.com/**** -s graphql-transport-ws

我得到的是:错误:服务器未发送子协议

该错误表明子协议有问题,因此当删除子协议时,会建立一个连接,并且我会得到一个提示:

Connected (press CTRL+C to quit)
>

但是,没有迹象表明可以访问服务器,并且似乎仅使用WebSocket API GW本身建立连接。

当我绕过网关并直接连接到面向互联网的NLB时,我能够建立WebSocket连接。

共有1个答案

白弘伟
2023-03-14

我不是超级Websocket专家,但是我知道WebSocket连接将被API网关终止,并且不能用作连接传递。您可以使用AWS_PROXY集成将WebSocket事件转发到graphQL服务器后端,但它不是一个维护的直接连接——API Gateway终止并向后端集成发送事件,并且不会将集成响应返回到web socket,因为它是事件驱动的,不是面向连接的服务——因此出现了您看到的“错误:服务器没有发送子协议”。

因此,要使用API GW作为WebSocket层,您需要在某个地方构建连接管理功能,以管理APIGW的基于事件的性质,并将数据发送到APIGW连接或调整graphql服务器中的集成机制,以利用@connection功能向WebSocket消费者发送响应/通知。

  • 集成后端服务文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-routes-integrations.html
  • 向连接的客户端发送响应:https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-how-to-call-websocket-api-connections.html

API GW Websockets非常适合构建定制解决方案,但是需要花费一些精力,因为您将为事件配置设置。

对于AWS上的GraphQL API,我建议看一看AppSync,这是一个AWS托管的GraphSQL服务,它通过WebSockets本地处理GraphSQL订阅,无需任何额外代码,而且它的可扩展性非常好,可以简化基于ECS的解决方案的Graphsql托管负担。

我怀疑需要在ECS上使用现有的GraphQL构建可能还有很多其他原因,所以要理解并不总是可能转向像AppSync这样的东西。我觉得你尝试的NLB解决方案在现有的ECS后端环境中是可以的,正如你所指出的,是面向连接的(通过NLB),所以会达到你想要的结果。

 类似资料:
  • 问题内容: 我迷上了Firefox。我无法使Websocket正常工作。我使用TornadoWebsocket,并通过以下代码对其进行了初始化: 然后像这样在Javascript端初始化它: 这段代码在Chrome上运行良好,同时我自己创建了证书并在HTTPS下运行页面。但是Firefox一直在说: 我用谷歌搜索,发现了太多想法,但没有一个对我有用:( 任何帮助将不胜感激。 问题答案: 我通过Pr

  • 我在Apollo中的GraphQL订阅遇到了麻烦。我想订阅关于主题的添加“透视图”(基本上是在帖子上添加评论),我很确定我已经正确地设置了服务器。客户才是给我带来麻烦的人。(如果这个问题看起来很熟悉,我以前问过它,以为我得到了答案,但没有去)。下面是我的订阅模式: 我也正确地连接了客户端,因为在我的终端中,我看到了“WebSocket connection Selected”消息。我被难倒的部分是

  • 我有两面性。 一方面,通过使用ws(一个node.js WebSocket库)或socket.io之类的库/包,我可以直接使用WebSocket协议。在这里,我可以使用测试工具从或开始订阅和寻址,比如并接收更新。 另一方面,我通过使用诸如这样的组件来使用GraphQL订阅。似乎这样我应该使用GraphQL中嵌入的东西。用这种方式开发的项目不能通过或地址访问,或者至少我不知道。 我的问题是两者之间有

  • 我正在学习如何使用gem在Rails应用程序中实现GraphQL API。我不清楚GraphQL订阅的用例。 我不清楚GraphQL订阅和ActionCable之间的区别。 假设我有一个从GraphQL API获取数据的移动应用程序。 我是否可以直接使用ActionCable将更改发布到移动客户端?如果是,那么为什么要使用GraphQL订阅呢?

  • 我有以下js代码: 下面的服务器代码(最后一行调用它): 有时前端会忽略