gpt4 book ai didi

database - Webapp服务器数据存储: Memory vs database

转载 作者:行者123 更新时间:2023-12-01 22:08:02 25 4
gpt4 key购买 nike

我们正在使用MySQL数据库在Go中创建一个Web应用程序。我们的用户一次只能拥有一个活跃的客户端。就像Spotify一样,您一次只能在一台设备上听音乐。为此,我制作了一个映射,将用户ID和作为其值的对其 Activity Websocket连接的引用作为键。根据客户端必须在请求 header 中发送的websocket ID,我们可以确定该请求来自其 Activity session 的天气。

我的问题是在全局空间中存储数据(在这种情况下是带有用户ID和Websocket的 map )是一种好的做法,还是将其存储在数据库中更好?

我们预计不会同时吸引超过10000个活跃客户。平均可能在1000左右。

最佳答案

如果仅运行websocket服务器的一个实例,则将其存储在内存中就足够了。因为如果由于某种原因它关闭/重新启动,那么所有连接将丢失,所有客户端将不得不再次创建它们(因此,要使用该服务的所有客户端将再次填充连接列表) 。

但是,如果计划水平扩展它,以便在负载均衡器后面有多个websocket服务,则可能需要将连接存储在某种数据库中。并不是因为它一定需要更持久,而是因为您需要能够针对所有服务连接检查请求。

也可以有一个单独的服务来处理传入的请求,并询问所有websocket服务,如果其中任何一个具有请求中指定的连接。如果您添加了发布/订阅队列,并且每个websocket服务都为其所有websocket ID订阅了 channel ,并且接收请求的服务随后发布了websocket ID,则可以完成此操作,然后websocket服务可以在单独的 channel 上发回回复如果他们有联系。如果没有人响应,您必须决定如何处理(没有websocket服务具有websocket ID)。该 channel 不存在,或者您希望在特定时间内得到答案。或者,您可以发布有关一般主题的问题,并期望所有websocket服务都能答复(是或否)。

至于您是否需要扩展它,我猜主要取决于您在其上运行服务的基础服务器。如果我对它的理解正确,那么除了跟踪其连接之外,websocket服务基本上不会做任何事情(您应该添加一些乒乓球来发现连接是否丢失)。那么,您的限制应该主要是系统一次可以处理多少个文件描述符。如果该限制比预期的最大用户数大得多,那么仅运行一台服务器并将所有内容存储在内存中可能是一个好的解决方案!

最后,如果您要为所有用户打开一个websocket,为什么不通过该websocket连接进行所有“其他”通信,而不是让他们使用其websocket ID发送HTTP请求?也许HTTP更适合您的用例,但可能需要考虑一下:)

关于database - Webapp服务器数据存储: Memory vs database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59892812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com