很难为我的问题找到解决方案/答案。
我有一个后端服务器,它正在生成存储在mongo db数据库中的数据(信息)。
另一台服务器(运行netty)应该为连接的客户端(10k客户端)提供服务。
我应该在哪里放置数据库查询,因为并非所有客户都对相同的信息感兴趣?
我提出了以下想法:
我看到的第一个问题是我只有一个线程可以为所有客户服务。 其次,即使感兴趣的客户端没有连接,我也会从数据库中检索出很多信息并使其适合应用程序。我认为这可能会导致性能问题。
我很想知道哪种概念在可扩展性和性能方面会更好。
我确信这是一个常见的用例。但我无法找到解决方案。
非常感谢提前
答案 0 :(得分:0)
我认为您不想使用通道线程,因为对于10K客户端,并且假设有4个CPU,默认情况下每个线程将有1250个客户端,并且您将无法将数据写入绑定到的所有客户端当你查询mongo-db时给定一个线程。
我使用单独的线程池。对于每个通道,只需对任务进行排队以检索该通道的数据。当查询返回时,您可以将用户事件发布到通道以在I / O线程中执行写入(可能将'info'作为用户事件字段之一发布)。这样,您可以调整线程池的大小,同时考虑服务器容量和mongo-db的最大连接数等事项。
如果频道是持久的,并且您在频道连接时定期轮询数据,则相同的模型可以正常工作。只需使用ScheduledExecutorService而不是普通的执行程序,并安排重复任务。
在查询运行时,您必须处理关闭的频道。如果这种情况相对不频繁发生,那么当您尝试在执行程序中对用户事件进行排队时,我很想捕获Netty抛出的异常,而不是在发布事件之前尝试检查通道是否已打开。