这比实际的代码本身更多是编程策略和方向问题。
我正在用C-Sharp编程。
我有一个可以远程启动网络上许多不同客户端上的进程的应用程序,理论上最多可以有1000个客户端。
然后,它通过读取每个客户端上的日志文件来监视远程进程的状态。
我目前正在通过运行一个在列表中的所有客户端中循环运行的线程并读取日志文件来执行此操作。它可以在10或20台计算机上正常运行,但1000台将无法使用。
此方法存在几个问题:
首先,如果线程在再次调用之前没有完成读取所有客户端状态,则可能无法读取和更新列表末尾的客户端状态。
第二,如果列表中的任何客户端在此期间脱机,则更新将挂起,直到该客户端再次恢复在线。
所以我需要一种不同的方法,并且已经想出了几种解决方法。
为每个客户端创建一个单独的线程,以读取其日志文件并更新其进度。
a。但是,我不确定是否可以在计算机上运行1000个线程。
在尝试读取文件之前,首先测试每台计算机的连接,如果它无法连接,则对于该迭代将其忽略,然后移至列表中的下一个客户端。
a。仍然存在下一个调用之前无法通过列表的问题,并导致更多延迟,并且它首先尝试通过端口测试连接。如果有1000个客户,这将是显而易见的。
是否让每个客户端在有更新时将数据发送到运行该应用程序的计算机。
a。这可能会与1000台试图重复发送数据的计算机产生大量混乱。
因此,我试图确定是否有另一种我尚未考虑过的更有效,更可靠的方法,或者哪种方法最好。
现在,我倾向于让客户端向应用程序发送更新,而不是让应用程序提取数据。
寻找想法,关注点,想法和建议。
答案 0 :(得分:1)
我认为您这样做的方式(监视)是错误的。与其将所有日志保存在一个文本文件中,不如将它们保存在一个可以是任何类型的中央数据存储库中。考虑到您正在监视这些系统的性能这一事实,您的设计及其背后的机制一定不能对目标系统的性能产生负面影响,并且在这种设计中,磁盘和CPU在某些情况下会涉及很多东西,本身可能会导致性能问题。
我建议您使用像Redis这样的快速内存数据库来创建日志存储服务器,并将记录的数据直接发送到该服务器。请记住,该数据库必须在其他虚拟机上运行。然后,一旦达到特定数量的索引或经过特定的时间间隔,您就可以调整Redis以将接收到的数据存储在物理磁盘上。内存中的功能非常有用,因为您可能需要在这样的监视应用程序中查询很多信息。另一方面,Redis的性能是如此之高,以至于它可以有效地处理数百万个索引。
为您准备的蓝图是:
1-将所有日志数据集中在一个存储库中。
2-配置客户端以将监视的信息发送到集中式存储库。
3-必要时,由主服务器(监视系统)从集中存储库中读取数据。
由于我只是在分享自己的经验,因此我不打算在此处宣传特定工具。为此,您可以使用更多工具,例如ElasticSearch
。