是否有任何无服务器技术可以构建无服务器的websocket服务器?
我知道长时间运行连接的本质是它们是有状态的,但如果唯一的状态是传输层的连接本身,那么似乎可能有一个无服务器的产品将其抽象出去,所以你只处理应用层。是否有云提供商(AWS,Azure等)允许这样做?我无法看到AWS Lambda或Azure Functions实现此目的的方法。
有人有任何想法吗?只是检查。
由于
答案 0 :(得分:3)
随着WebSocket对AWS API Gateway的支持的发布,您可以创建无服务器的WebSocket API。
WebSocket API由一个或多个路由组成。要确定特定入站请求应使用的路由,请提供路由选择表达式。根据入站请求对表达式进行求值,以生成与您的路线的routeKey值之一相对应的值。 API网关将请求路由到相应的lambda函数。
来自AWS博客example,
该应用程序由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 Service或Pubnub来处理实时部分。
答案 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 /库来轻松处理网络套接字。