繁体   English   中英

非常简单的企业应用程序架构 - 使其扩展

[英]Very simple Enterprise Application Architecture - making it scale

我正在为我的一个Intranet企业应用程序使用一个非常简单的架构。

客户:

  • 1个代理在每台计算机上运行发送系统配置数据(一次),报告(每2到5分钟)=>从客户端流向服务器的数据大小是几百个字节,很少接触到一个KB。

服务器:

  • 1个Web应用程序(管理客户端的前端,查看报告)
  • 一个Web服务,用于接收所有传入的数据(它只是转储到表中)
  • 每隔几秒读取转储并执行相关查询的系统服务 - 插入,更新用于报告的实际表(此步骤可能与ETL进行比较)

由于数千个客户端同时向服务器发送数据,服务器只是将这些传入数据转储到临时表中(每个客户端发送数据一个插入)。 在后台运行的系统服务不断刷新此临时表 - 在某种意义上 - 每隔10秒,它从转储表中读取前100行,将此数据组织到用于报告的相关表中,并从转储中删除这100行等等。

到目前为止,我已经在2000台计算机的网络中运行我的应用程序,它似乎运行良好。 现在我需要扩展它以支持25,000个客户端的网络。 我将以每秒25,000个请求运行模拟测试,并检查架构是否保持良好状态。

服务器是基于.NET的。 ASP .NET Web应用程序 - 用于转储数据的前端Web服务。 基于.NET的系统服务来执行ETL。 SQL Server 2005/2008作为数据库服务器。

希望从stackoverflow社区获得一些建设性的批评和指导,以改善这种架构。 您认为使用单个服务器与25,000个客户端合作的方式是否足够好? 您认为最有可能随着并发活动的增加而崩溃的组件是什么? 它存在根本缺陷吗? 欢迎各种指导。 谢谢。

均匀分布,“最坏情况”你的速度为12500转/分钟,即每秒209转。

你应该做的最好的是前端负载平衡。

如果你有4台机器,那么每台机器每秒可以降低52转。 每台机器在本地存储它们的trans数据,然后分批批量插入到后端最终数据库中。 这样可以使主数据库的传输量保持较低。 插入1行和50行(取决于行大小)之间的区别非常小。 在某些时候它取决于网络开销等“相同”。

因此,如果我们向下舍入到50(为了便于数学运算),前端机器每5秒将250行插入到后端数据库中。 这不是一个低的音量(再次取决于行的大小)。

你提到在后端每个进程轮询100个recs。 无论您在这里使用什么号码,加上处理时间,都需要小于您的总流量和所需的完成时间。

具体来说,后端处理在短期内比前端插入速度慢,只要从长远来看,你的后端赶上了。 例如,您的大部分流量可能是从上午8点到下午5点,但所有说完成后,您的后端处理将在晚上9点之前完成。

否则,后端永远不会赶上,你总是落后,积压就越来越大。 所以你需要确保你也能正确处理。

如果您的报告查询很昂贵,最好也可以卸载它们。 让前端计算机将原始数据发送到单个中间层计算机,然后让第3台计算机将大量(可能是每天)批量导出到本地报告数据库中以进行数据库查询。

另外,考虑故障和可用性方案(即如果您丢失了一台负载平衡的前端机器,您是否仍能跟上流量等)。 这里有很多失败的空间。

最后,通常情况下,更新往往比删除更便宜,因此如果您可以删除停机时间而不是主流处理,那么如果需要,您可能会在那里找到一些性能。

在最坏的情况下,这意味着您的系统需要每分钟流失5000-13000个请求。 您需要以60-70%的系统利用率(比如当前的2000个客户端)计算系统的粗略吞吐量 - 如果Web服务每个请求大约需要50毫秒,那么这意味着它可以支持每分钟最多1200个请求。 可以对.NET服务进行类似的计算。 随着负载的增加,吞吐量可能会降低,因此实际数量会减少。 根据此类计算,您需要决定是否必须扩展系统。 您可以在多台服务器上运行您的服务,负载将被分割。 如果db server成为瓶颈,则可以以群集方式使用它。 您需要检查的是,您的.NET服务实现是否允许并行性(IMO,Web服务将更少状态并且应该扩展无问题) - 例如,您是否需要按照收到的顺序插入记录等等

运行模拟,看看它是如何支撑的。 可能是瓶颈的是网络和可能的磁盘i / o。 在这种情况下,我可以提出一些建议。

第一关,我希望你使用UDP而不是TCP?

尝试让服务侦听多个NIC。 使多个应用程序实例运行并访问该表。 我不知道你正在使用什么数据库但是sqlite对于这种类型的应用程序来说是完美的...它有一些功能可能有助于提高性能而不会经常触摸磁盘。

服务器中有很多内存。

假设所有这些都完成了,如果它仍然没有执行那么

下一步是拥有一系列中间服务器,每个服务器收集数千个客户端的结果,然后通过更高速的链接将它们转发到主服务器进行处理。 您甚至可以将它们批量发送到主服务器,并通过该链接压缩数据。 或者只是SCP将它们转移到它上面并批量导入结果。

无论如何,只是我的想法。 我正在研究类似的东西,但我的数据量将在几个不同的高端服务器上连续几乎连续1 - 2Gbit链接。所以中间服务器就是我们正在做的事情,

每秒25k请求需要扩展(即使每分钟25k,每秒25k实际上是一个巨大的负载,你需要很多服务器来处理它)。 您必须拥有WWW服务服务器的园区,每个服务器都将请求转储到本地存储(队列)中。 您不能让WWW服务器直接在后端进行通话,它会因争用而死亡(由于客户端请求尝试在数据库中的同一位置插入/更新而导致锁定排除)。 WWW服务只是在本地转储请求,然后返回HTTP响应并继续。 从中间层WWW服务器,这些请求必须聚合并加载到中央服务器。 这种加载必须可靠,易于配置,而且速度非常快。 不要因为'我只是自己用重试逻辑写一个复制实用程序'的陷阱而陷入困境,那条道路铺满了尸体。 这个本地存储的一个很好的候选者是SQL Server Express实例,聚合和加载的一个很好的候选者是Service Broker。 我知道这种架构有效,因为我已经完成了使用它的项目,请参阅High Volume Contiguos实时审计和ETL 我知道使用这种架构来扩展它的项目( 真的很高,请参阅March Madness on Demand实时分析与SQL Server 2008 R2 StreamInsight关于如何收集Silverlight媒体流运行时智能(两个链接上的重点是不同的)技术,但sinc eI碰巧知道该项目很好我知道他们如何从WWW网络服务收集数据到他们的后端)。

通过我的计算,在最坏的情况下,你每120秒有25000个插入。 每隔10秒就会读取100行,这意味着在120秒内您已经读取了1200行。 这意味着您的临时表将不断累积数据。

扩展系统需要做的是考虑如何向系统添加组件以处理负载。

设计Web服务以便能够触发对负责将数据插入临时表的“从属”的请求。 临时表名称列表需要保存在一些常见的命名服务中(就像另一个名称表一样简单也可以)。

以类似的方式设计系统ETL服务,以选择临时表,读取其所有行,完成其工作并将临时表标记为已处理并返回休眠状态。

这样,您可以为插入和ETL添加其他进程。

最后,您的报告存储库将以惊人的速度增长。 希望那里的数据可以每周或每月清理一次?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM