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