在云运行时构建一台大型聊天服务器

2021-03-11 00:54:34

在此博客中,我将向您展示如何使用WebSockets支持构建一个无服务器容器的舰队,构成一个可以扩展大量ConcurrentConnections(25万客户端)的聊天室服务器。

云运行运行并缩放任何集装箱服务应用程序。基于Theload(已连接客户端),它将添加更多容器实例或关闭灌输。因此,我们的聊天服务器必须无状态。

对于聊天室服务工作,所有用户都必须看到相同的消息列表,即使它们可能连接到覆盖的不同的容器实例,在云运行的负载平衡后面。

要同步Acloud运行服务后面的集装箱实例的动态舰队之间的数据,我们将仅使用Redis PubsubProtocol,因为它将NewMessages在持久TCP连接上传递给任何连接的客户端。在像云运行这样的动态环境中,这是完美的解决方案。

与大多数无服务器平台不同,云运行可以从SingleContainer实例中运行多个客户端。目前,250Client可以连接到单个容器实例(只要它可以处理负载)

默认情况下,任何云运行服务可以扩展到1,000个实例。 (但是,通过佩戴支援票证,您可以获得这个数字提升。)这意味着我们可以同时支持25万客户而无需担心犯下犯罪和缩放!

在此架构中,云运行可帮助我们在250个客户端连接到特定容器实例的250客户端(并且它将提供更多实例作为NewConnections到达)。在后端,每个容器只能为Redis建立1个连接,因此只要我们的redis实例能够处理连接到它的容器实例的Oneumber,它应该工作。这不是云内存中的表现,因为它支持超过65,000远程。

您还可以通过部署到多个区域anddistribute在多个云运行服务之间的负载之前更均匀地在实例限制之前更均匀地分发您的聊天后端。

在云内存中创建redis实例。确保选择您将使用的vpc网络。创建后,请注意其IP地址。

创建VPC连接器。这将让我们的云运行服务通过VPC Network连接到Redis。它创建了它,请注意其名称。

通过在其中在其中运行以下命令,将应用程序部署到云运行,从而在其中root运行以下命令:

GCLoud Beta运行部署ChatService --Source =。 \ - vpc-connector = [vpc_connector_name] \ --set-env-vars redis_url = redis:// [redis_ip]:6379 \ --max实例= 1000 \ --concurrency = 250 \ - timeout = 3600 \ - allow-uneuthenticated

部署此后,您将获得用户扫描到的自动缩放端点。

示例代码向您展示如何构建无状态WebSocketS后端,使用Redis Pubsub协议之间同步数据。

在这个例子中我们遗漏了几件事。例如:

云运行请求当前在60分钟内加上。超时后,yourclies(在这种情况下,浏览器)应自动重新连接到失败的ServerInstead。

在此体系结构中,任何加入Fleetwill的容器实例都会开始只获取新消息。如果您想在新服务器启动时实现先前的消息,则需要使用persistenttorage,如数据库。

无要的设计由设计比预先配置的VM-Compute.cloud运行更昂贵。不必预测负载,自动阶段,而不是管理基础架构的成本。

如果您将使用128MB RAM和1 VCPU部署此应用程序,则价格(0.00002400 +(0.00000250 / 8))* 60 * 60 =每小时每小时0.0875。 1 Thingmeans如果您有1000个实例积极运行和服务250k客户,那么它将花费87美元/小时,这是62.6K /月。

这是一种陡峭的价格,它可能更适合不需要多功能运行的负载,或者对于短期缩放需求,或者是一个意识到的宣传赛/营销活动。

从长远来看,随着您的负载变得更加可预测,它使MoreSense移动到基于VM的计算(例如GCE或GKE),因为多个中型用户可以处理相同的负载,可能50倍便宜。

如果您想了解更多有关WebSockets OnCloud运行的信息,请访问更多资源: 在网络出口成本中,我忽略了那些作为聊天消息的人通常是短缺和基于文本的。 同样忽略了每个请求成本,因为它没有多少贡献。 ↩︎ 我是Google的软件工程师,在Kubernetes,GKE和Cloud Run上工作。 我专注于改善开发人员体验并以简单的话语解释复杂的功能。 我创建了像Krew和Kubectx这样的开发人员工具。 你可以在推特上关注我。 关于我其他文章