c# - 以良好的性能可靠地监视大量客户端的最佳方法是什么
问题描述
这更像是一个编程策略和方向问题,而不是实际代码本身。
我正在用 C-Sharp 编程。
我有一个应用程序可以远程启动网络上许多不同客户端的进程,理论上最多可以有 1000 个客户端。
然后,它通过读取每个客户端上的日志文件来监视远程进程的状态。
我目前通过运行一个循环遍历列表中所有客户端的线程并读取日志文件来做到这一点。它适用于 10 或 20 台机器,但 1000 台可能站不住脚。
这种方法有几个问题:
首先,如果线程在再次调用之前没有完成读取所有客户端状态,则列表末尾的客户端状态可能不会被读取和更新。
其次,如果列表中的任何客户端在此期间脱机,更新将挂起,直到该客户端再次联机。
所以我需要一种不同的方法,并想出了一些可能的方法来解决这个问题。
为每个客户端生成一个单独的线程,以读取他们的日志文件并更新其进度。
一个。但是,我不确定在我的机器上运行 1000 个线程是否可以接受。
在尝试读取文件之前,首先测试每台机器的连接,如果它无法连接,则在该迭代中忽略它并转到列表中的下一个客户端。
一个。这仍然存在在下一次调用之前无法通过列表的相同问题,并导致更多延迟,它会首先尝试通过端口测试连接。如果有 1000 个客户,这将是显而易见的。
每当有更新时,让每个客户端将数据发送到运行应用程序的机器。
一个。这可能会在 1000 台机器尝试重复发送数据时产生大量的喋喋不休。
所以我试图弄清楚是否有另一种更有效和更可靠的方法,我没有考虑过,或者其中哪一种是最好的。
现在我倾向于让客户端向应用程序发送更新,而不是让应用程序提取数据。
寻找想法、担忧、想法和建议。
解决方案
在我看来,您这样做(监控)的方式是错误的。与其将所有日志保存在文本文件中,不如将它们保存在可以是任何类型的中央数据存储库中。关于您正在监视这些系统的性能这一事实,您的设计及其背后的机制不得对目标系统的性能产生负面影响,并且在这种设计中,磁盘和 CPU 在某些情况下会涉及很多,以至于可能会导致性能问题本身。
我建议您使用像 Redis 这样的快速内存数据库创建日志存储库服务器,并将记录的数据直接发送到该服务器。请记住,此数据库必须在不同的虚拟机上运行。然后,您可以调整 Redis 以在达到特定数量的索引或经过特定时间间隔后将接收到的数据存储在物理磁盘上。这里的内存中特性是有利的,因为您可能需要在这样的监控应用程序中大量查询信息。另一方面,Redis 的性能如此之高,以至于它可以高效地处理数百万个索引。
你的蓝图是:
1-将所有日志数据集中在一个存储库中。
2- 配置客户端将监控信息发送到集中存储库。
3- 需要时由主服务器(监控系统)从集中存储库中读取数据。
我不想在这里为特定工具做广告,因为我只是分享我自己的经验。您可以为此目的使用更多工具,例如ElasticSearch
.
推荐阅读
- c# - c#out参数,为什么我给我的变量赋值了,还是不能返回?
- powerbi - 如何在powerquery中用null替换文本?
- node.js - Node.js 快速请求 - 在请求错误时淡入和淡出引导模式
- mysql - MySQL - 如何在 ISO 8601 中选择现有的日期时间值
- c# - C# sharepoint 如何从特定视图中检索列表项
- c# - 如何根据数字格式将十进制和十六进制字符串解析为int
- groovy - 如何将一列整数数据“2018-08-2”转换为字符串,然后将其与groovy中的字符串元素列表进行比较
- c# - 在单个 LDAP 查询中查找 ouGroup 及其所有成员,其中 Common Name 包含给定短语
- .net-core - 无法将我的解决方案从 v2.1.0 升级到 v2.1.3
- c# - XML,编码,C# SOAP