使用内存对象时的系统架构



我使用.net核心、jquery和signalR创建了一个陌生人聊天web应用程序。目前,我正在使用字典为用户存储连接ID和消息。我正在使用内存中的对象字典,而不使用任何数据库。为了测试透视图,我已经在azure上部署了它,它对3-4个用户来说运行良好。我的问题是

1.假设我的应用程序一次有3000名用户在聊天,那么托管该应用程序的最佳解决方案是什么?我的想法是,我可以使用多个系统,并使用负载均衡器,我可以将它们重定向到不同的系统。例如,假设有1500个用户,那么每个服务器的内存对象中可以有500个用户,而这500个用户可以相互聊天。我可以看到一个限制,每个用户只能与这500个用户聊天,而不能与1500个用户聊天。这个解决方案可行吗?

2.我需要多少Ram/CPU核心/存储才能同时处理3000个用户?

3.我需要使用弹性搜索数据库而不是内存中的对象来存储消息吗。?我不需要存储消息,但弹性搜索数据库对分布式系统有帮助吗?。

4.使用负载均衡器的最佳方法是什么?以及在我的情况下,我需要多少个分布式系统?

我的应用程序支持与陌生人聊天、上传图像和视频。

我知道这可能会有所不同,我们无法准确地告诉它,但我想知道我的网络应用程序的最佳系统架构。

为了扩展它,我会寻找一个PubSub/Retime数据库。例如:Firebase实时数据库、Kafka Streams、Redis。

这样,您可能根本不需要任何自定义后端。

如果您选择自己的服务器作为pubsub的中间件,那么一切都会变得更加复杂。您必须找到一种方法来管理您的基础设施(例如使用Kubernetes(,并设置一个负载均衡器(例如HAProxy(,在服务器之间分配请求。

有像codesphere.com或heroku.com这样的提供商可以让您更轻松地完成这一过程。

除此之外,您还可以通过cloudflare.com、netlify或vercel等cdn以可扩展且简单的方式为前端提供服务。

据我所知,当前的解决方案是前端使用SignalR与后端通话,然后后端与另一个用户的前端通话?

目前主要关注的是存储,因此您需要将其提取到一个单独的位置。由于这是一种存储连接详细信息的缓存,Redis或其他缓存机制将是完美的选择。然后,只要需要一些信息,后端就会与Redis通信。

第二个问题是连接数,因为你会有更多的用户。您需要扩展后端以支持这一点。我不确定Azure是如何工作的,但我相信它确实支持它,我认为有某种设置可以扩展服务并使用某种负载平衡策略,如循环。由于我们不必记住用户连接到哪个服务,所以这应该有效。

关于消息历史记录,你提到你不存储它,用户每次重新加载应用程序时都会丢失它。如果你需要某种轻量级的消息存储,你可以考虑在网络浏览器上使用本地存储。消息可以存储在本地,您不需要在后端担心这一点。否则,如果你需要存储消息,那么我认为nosqlDB会很好,因为你只需要存储带有用户id和消息id的Blob。正如你所说,Elastic非常适合这样。

回答您的问题:

  1. 通过将存储提取到缓存来解决
  2. 很难说,您只需要监控Azure服务。然而,由于你可以使应用程序具有可扩展性,一旦达到限制,你就应该能够对其采取行动
  3. 如前所述,应用程序的行为取决于您,但如果您需要某种存储,客户端的本地存储或某种nosql数据库都适合此用途
  4. 负载平衡应该在Azure中可用,您只需要选择某种策略来平衡负载

最新更新