无服务器 WebSocket 服务器?

12

有没有无服务器技术可以构建无服务器WebSocket服务器?

我知道长时间运行连接的本质是有状态的,但如果唯一的状态是传输层上的连接本身,那么似乎可以有一个无服务器产品来抽象这一点,这样您只需处理应用程序层。是否有云提供商(如AWS、Azure等)允许这样做?我看不出AWS Lambda或Azure函数可以实现这一点。

大家有什么想法吗?只是想确认一下。

谢谢

6个回答

7
随着AWS API Gateway对WebSocket的支持,您可以创建一个无服务器的WebSocket API。
WebSocket API由一个或多个路由组成。为了确定特定的入站请求应使用哪个路由,您需要提供一个路由选择表达式。该表达式针对入站请求进行评估,以产生与您的某个路由的routeKey值相对应的值。API网关将请求路由到相应的lambda函数。
来自AWS博客示例
enter image description here 该应用程序由处理客户端和服务器之间连接的API网关中的WebSocket API(1)组成。当客户端连接(2)或断开连接(5)API时,两个AWS Lambda函数会作出反应。当客户端向服务器发送消息时,调用sendMessage函数(3)。服务器使用新的API Gateway Management API将消息发送给所有连接的客户端(4)。要跟踪每个连接的客户端,请使用DynamoDB表来保留连接标识符(还可以使用它来存储有关连接的其他状态信息)。
您可以通过DynamoDB Streams将此扩展以在数据更改时向客户端发送消息。

1
AWS IoT提供MQTT端点,并支持在443端口上使用MQTT + WebSocket。这可能是您可以在AWS上获得的最接近的托管服务。 请查看此链接: AWS IoT协议 您可以定义规则,在AWS IoT上触发Lambdas,或将它们传递给Kinesis,并通过Lambdas处理流。

1

目前,AWS Lambda和Azure Functions不支持此功能。如果您计划在AWS中设置可扩展的环境并使用Websockets,则可以使用应用程序负载均衡器,并在ECS集群或支持Websocket的EC2实例前面使用像NodeJS这样的服务器。

另一种解决方案是选择完全托管的服务,例如Google Firebase ServicePubnub,以处理实时部分。


谢谢@ashan。我不知道有完全托管的那些。 - ChrisBellew

1

如果仅在传输层存在连接状态

事实并非如此。Web套接字连接交换保持活动作为第7层负载。其他人可能会认为它更准确地描述为介于第6层和第7层之间的子层...但无论如何,它都远高于传输层。

许多应用程序以其他方式使用Web套接字,这些方式也不是无状态的。一旦连接,然后进行身份验证,就没有必要不断重新进行身份验证,因为现在在套接字上的客户端将是15分钟后相同的客户端,并且这是在无服务器环境中无法避免的开销 - 每个WebSocket上的操作都需要重新进行身份验证。例如,对于常量数据流,服务器可能会跟踪已发送的内容或客户端感兴趣的特定子集。

如果您不维护(或不需要)与服务器的持久连接,则可以问“为什么使用Web套接字?”

也许还有相关的内容:HAProxy是一个常用的负载均衡器,支持Web Socket,并为每个当前Web Socket连接维护与单个后端服务器的持久连接。如果该后端服务器离线,负载均衡器没有选择其他后端服务器来处理现有连接的规定。客户端将需要重新连接。

1

0
AWS Lambda / Azure Functions / GCP Functions 不支持 WebSocket 协议。因此,使用第三方服务来实现这一目的是很正常的。 除了上面的评论之外,我可以提供 Ably:https://www.ably.io/。 它提供了处理 WebSocket 的 API/库,让您无需费力即可完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接