gpt4 book ai didi

mongodb - Netty,服务器使用来自 mongodb 的数据连接客户端

转载 作者:可可西里 更新时间:2023-11-01 09:55:47 25 4
gpt4 key购买 nike

努力为我的问题寻找解决方案/答案。

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

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

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

我想到了以下想法:

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

我看到的第一个问题是我只有一个线程应该为所有客户端服务。其次,我正在从数据库中检索大量信息并将其放入应用程序中,即使感兴趣的客户端未连接也是如此。我认为这可能会导致性能问题。

  • # 2 在 channel 线程中执行更详细的查询(可能是 idlestateshandler?)并将所有接收到的数据发送回客户端

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

我相信这是一个常见的用例。但是我找不到解决方案。

提前致谢

最佳答案

我不认为你想使用 channel 线程,因为有 10K 个客户端,假设有 4 个 CPU,默认情况下每个线程有 1250 个客户端,你将无法将数据写入绑定(bind)到的所有客户端查询 mongo-db 时的给定线程。

我会使用一个单独的线程池。对于每个 channel ,只需排队一个任务来检索该 channel 的数据。当查询返回时,您可以将用户事件发布到 channel 以在 I/O 线程中执行写入(可能将“信息”发布为用户事件字段之一)。通过这种方式,您可以调整线程池的大小,同时考虑服务器容量和与 mongo-db 的最大连接数等因素。

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

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

关于mongodb - Netty,服务器使用来自 mongodb 的数据连接客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21211567/

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