Netty,Server使用来自mongodb的数据连接客户端

时间:2014-01-19 00:09:59

标签: mongodb netty

很难为我的问题找到解决方案/答案。

我有一个后端服务器,它正在生成存储在mongo db数据库中的数据(信息)。

另一台服务器(运行netty)应该为连接的客户端(10k客户端)提供服务。

我应该在哪里放置数据库查询,因为并非所有客户都对相同的信息感兴趣?

我提出了以下想法:

  • #1在托管netty服务器的应用程序中有一个单独的线程,执行数据库查询并循环所有连接的客户端并发送(channel.writeAndFlush(info))信息(如果客户端对它感兴趣)

我看到的第一个问题是我只有一个线程可以为所有客户服务。 其次,即使感兴趣的客户端没有连接,我也会从数据库中检索出很多信息并使其适合应用程序。我认为这可能会导致性能问题。

  • #2在通道线程中执行更详细的查询(也许是idlestatehandler?) 并将所有收到的数据发回客户端

我很想知道哪种概念在可扩展性和性能方面会更好。

我确信这是一个常见的用例。但我无法找到解决方案。

非常感谢提前

1 个答案:

答案 0 :(得分:0)

我认为您不想使用通道线程,因为对于10K客户端,并且假设有4个CPU,默认情况下每个线程将有1250个客户端,并且您将无法将数据写入绑定到的所有客户端当你查询mongo-db时给定一个线程。

我使用单独的线程池。对于每个通道,只需对任务进行排队以检索该通道的数据。当查询返回时,您可以将用户事件发布到通道以在I / O线程中执行写入(可能将'info'作为用户事件字段之一发布)。这样,您可以调整线程池的大小,同时考虑服务器容量和mongo-db的最大连接数等事项。

如果频道是持久的,并且您在频道连接时定期轮询数据,则相同的模型可以正常工作。只需使用ScheduledExecutorService而不是普通的执行程序,并安排重复任务。

在查询运行时,您必须处理关闭的频道。如果这种情况相对不频繁发生,那么当您尝试在执行程序中对用户事件进行排队时,我很想捕获Netty抛出的异常,而不是在发布事件之前尝试检查通道是否已打开。

相关问题