我正在为我的一个内部网企业应用程序使用一个非常简单的架构。
客户:
服务器:
当数千个客户端同时向服务器发送数据时,服务器只是将此传入数据转储到临时表中(每个客户端发送数据一个插入)。在后台运行的系统服务不断刷新此临时表 - 在某种意义上 - 每隔10秒,它从转储表中读取前100行,将此数据组织到用于报告的相关表中,并从转储中删除这100行等等。
到目前为止,我已经在2000台计算机的网络中运行我的应用程序,它似乎运行良好。现在我需要扩展它以支持25,000个客户端的网络。我将以每秒25,000个请求运行模拟测试,并检查架构是否保持良好状态。
服务器基于.NET。 ASP .NET Web应用程序 - 用于转储数据的前端Web服务。基于.NET的系统服务来执行ETL。 SQL Server 2005/2008作为数据库服务器。
希望从stackoverflow社区获得一些建设性的批评和指导,以改善这种架构。您认为使用单个服务器与25,000个客户端合作的方式是否足够好?您认为最有可能随着并发活动的增加而崩溃的组件是什么?它存在根本缺陷吗?欢迎各种指导。感谢。
答案 0 :(得分:3)
均匀分布,“最坏情况”你的速度为12500转/分钟,即每秒209转。
你最应该做的是对前端进行负载平衡。
如果你有4台机器,那么每台机器每秒可以降低52转。每台机器在本地存储它们的trans数据,然后分批批量插入到后端最终数据库中。这样可以使主数据库的传输量保持较低。插入1行和50行(取决于行大小)之间的区别非常小。在某些时候它取决于网络开销等“相同”。
因此,如果我们向下舍入到50(为了便于数学运算),前端机器每5秒将250行插入到后端数据库中。这不是一个低的音量(再次取决于行的大小)。
你提到在后端每个进程轮询100个recs。无论您在这里使用什么号码,加上处理时间,都需要小于您的总流量和所需的完成时间。
具体来说,后端处理在短期内比前端插入速度慢,只要从长远来看,你的后端就会赶上。例如,您的大部分流量可能是从上午8点到下午5点,但所有说完成后,您的后端处理将在晚上9点之前完成。
否则,后端永远不会赶上,你总是落后,积压的事情也越来越大。所以你需要确保你也能正确处理它。
如果您的报告查询费用昂贵,最好也可以卸载这些查询。让前端计算机将原始数据发送到单个中间层计算机,然后让第3台计算机将大量(可能是每天)批量导出到本地报告数据库中以进行数据库查询。
此外,请考虑故障和可用性方案(即如果您丢失了一台负载均衡的前端计算机,您是否仍能跟上流量等)。这里有很多失败的空间。
最后,通常情况下,更新往往比删除更便宜,因此如果您可以删除停机时间而不是主流处理,那么您可能会在需要时找到一些性能。
答案 1 :(得分:1)
在最坏的情况下,这意味着您的系统需要每分钟流失5000-13000个请求。您需要以60-70%的系统利用率(比如当前的2000个客户端)计算系统的粗略吞吐量 - 如果Web服务每个请求大约需要50毫秒,那么这意味着它可以支持每分钟最多1200个请求。可以对.NET服务进行类似的计算。随着负载的增加,吞吐量可能会降低,因此实际数量会减少。 根据此类计算,您需要决定是否必须扩展系统。您可以在多台服务器上运行您的服务,负载将被分割。如果db server成为瓶颈,则可以以群集方式使用它。您需要检查的是,您的.NET服务实现是否允许并行性(IMO,Web服务将更少状态并且应该扩展无问题) - 例如,您是否需要按照收到的顺序插入记录等。
答案 2 :(得分:1)
运行模拟,看看它是如何实现的。可能是瓶颈的是网络和可能的磁盘i / o。在这种情况下,我可以提出一些建议。
第一关,我希望你使用UDP而不是TCP ??
尝试让服务侦听多个NIC。使多个应用程序实例运行并访问该表。我不知道你正在使用什么数据库但是sqlite对于这种类型的应用程序来说是完美的...它有一些功能可能有助于提高性能而不会经常触摸磁盘。
服务器中有很多内存。
假设所有这些都完成了,如果它仍然没有执行那么
下一步将是拥有一系列中间服务器,每个服务器收集数千个客户端的结果,然后通过更高速的链接将它们转发到主服务器进行处理。您甚至可以将它们批量发送到主服务器,并通过该链接压缩数据。或者只是SCP将它们转移到它上面并批量导入结果。
无论如何,只是我的想法。我正在研究类似的东西,但是我的数据量将在几个不同的高端服务器上连续几乎连续1 - 2Gbit链接。所以中间服务器就是我们正在做的,
答案 3 :(得分:1)
每秒25k请求需要扩展(即使每分钟25k,每秒25k实际上是巨大的负载,你需要很多服务器来处理它)。您必须拥有WWW服务服务器的园区,每个服务器都将请求转储到本地存储(队列)中。您不能让WWW服务器直接在后端进行通话,它会因争用而死亡(由于客户端请求尝试在数据库中的同一位置插入/更新而导致锁定排除)。 WWW服务只是在本地转储请求,然后返回HTTP响应并继续。从中间层WWW服务器,这些请求必须聚合并加载到中央服务器。这种加载必须可靠,易于配置,而且速度非常快。不要因为'我只是自己用重试逻辑写一个复制实用程序'的陷阱而陷入困境,那条道路铺满了尸体。这个本地存储的一个很好的候选者是SQL Server Express实例,聚合和加载的一个很好的候选者是Service Broker。我知道这种架构有效,因为我已经完成了使用它的项目,请参阅High Volume Contiguos Real Time Audit and ETL。我知道使用这种架构来扩展它的项目(真的高,请参阅March Madness on Demand或Real Time Analytics with SQL Server 2008 R2 StreamInsight关于如何收集Silverlight媒体流运行时智能(强调两者链接是关于不同的技术,但sinc eI碰巧知道该项目很好我知道他们如何从WWW网络服务收集数据到他们的后端。)
答案 4 :(得分:0)
根据我的计算结果,在最坏的情况下,每120秒就有25000次插入。每隔10秒就会读取100行,这意味着在120秒内您已经读取了1200行。这意味着你的临时表将不断累积数据。
扩展系统需要做的是考虑如何向系统添加组件以处理负载。
将Web服务设计为能够触发对负责将数据插入临时表的“从属”的请求。临时表名称列表需要保存在一些常见的命名服务中(就像另一个名称表一样简单)。
以类似的方式设计系统ETL服务,以选择临时表,读取其所有行,完成其工作并将临时表标记为已处理并返回休眠状态。
这样,您可以为插入和ETL添加其他进程。
最后,您的报告存储库将以惊人的速度增长。希望那里的数据可以每周或每月清理一次?