无服务器Web套接字服务器?

时间:2017-03-15 06:51:52

标签: azure amazon-web-services websocket serverless

是否有任何无服务器技术可以构建无服务器的websocket服务器?

我知道长时间运行连接的本质是它们是有状态的,但如果唯一的状态是传输层的连接本身,那么似乎可能有一个无服务器的产品将其抽象出去,所以你只处理应用层。是否有云提供商(AWS,Azure等)允许这样做?我无法看到AWS Lambda或Azure Functions实现此目的的方法。

有人有任何想法吗?只是检查。

由于

6 个答案:

答案 0 :(得分:3)

随着WebSocket对AWS API Gateway的支持的发布,您可以创建无服务器的WebSocket API。

WebSocket API由一个或多个路由组成。要确定特定入站请求应使用的路由,请提供路由选择表达式。根据入站请求对表达式进行求值,以生成与您的路线的routeKey值之一相对应的值。 API网关将请求路由到相应的lambda函数。
来自AWS博客example
enter image description here

该应用程序由API网关中的WebSocket API组成,用于处理客户端和服务器之间的连接(1)。当客户端从API连接(2)或从API断开连接(5)时,两个AWS Lambda函数会做出反应。客户端将消息发送到服务器时,将调用sendMessage函数(3)。服务器使用新的API网关管理API将消息发送到所有连接的客户端(4)。要跟踪每个已连接的客户端,请使用DynamoDB表保留连接标识符(也可以使用它存储有关连接的其他状态信息)。

您可以扩展它,以使用DynamoDB Streams

将有关数据更改的消息发送给客户端。

答案 1 :(得分:1)

目前AWS Lambda和Azure Functions不支持此功能。如果您计划在AWS中使用websockets设置可伸缩环境,则可以使用Application Load Balancer并在ECS集群或EC2实例前使用支持Websocket的服务器(如NodeJS)。

另一种解决方案是使用完全托管的服务,例如架构中的Google Firebase ServicePubnub来处理实时部分。

答案 2 :(得分:1)

如果唯一的状态是传输层的连接本身

事实并非如此。 Web套接字连接exchange keep-alives作为第7层有效负载。其他人可能会争辩说,它更准确地描述为第6层和第7层之间的子层......但无论如何,它都在传输层之上。

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

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

也许也是相关的:HAProxy是一种常用的带有Web套接字支持的负载均衡器,它为每个当前的Web套接字连接维护与单个后端服务器的持久连接。如果该后端服务器脱机,则平衡器中没有为现有连接选择另一个后端的规定。客户需要重新连接。

答案 3 :(得分:1)

AWS IoT提供MQTT端点,它在端口443上支持MQTT + WebSocket。这可能是您在AWS上作为托管服务最接近的东西。 点击此链接:AWS IoT Protocols 您可以定义在AWS IoT上触发Lambdas的规则,或者将它们传递给Kinesis并通过Lambdas处理流。

答案 4 :(得分:1)

Fanout可以做到这一点。它作为代理,可以将WebSocket客户端活动转换为一系列HTTP请求。这允许像Lambda这样的FaaS后端来管理原始WebSockets。只有在有活动要做出反应时才会调用该函数。

文档:https://fanout.io/docs/devguide.html#custom-websocket-api

WebSocket-over-HTTP协议:http://pushpin.org/docs/protocols/websocket-over-http/

Python帮助程序库:https://github.com/fanout/python-faas-grip

答案 5 :(得分:0)

AWS Lambda / Azure函数/ GCP函数不支持Web套接字协议。因此,为此目的使用第三方服务是正常的。 除了上面的评论之外,我还可以建议Ably:https://www.ably.io/。 它提供api /库来轻松处理网络套接字。