Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 针对特定场景提供缓存体系结构建议 设置:_C#_.net_Oracle_Caching_Architecture - Fatal编程技术网

C# 针对特定场景提供缓存体系结构建议 设置:

C# 针对特定场景提供缓存体系结构建议 设置:,c#,.net,oracle,caching,architecture,C#,.net,Oracle,Caching,Architecture,我们有一个.Net应用程序,它分布在6个本地服务器上,每个服务器都有一个本地数据库(ORACLE)、一个主服务器和一台负载平衡机。请求到达负载平衡器,负载平衡器将传入的请求重定向到6个本地服务器之一。在特定的时间间隔内,数据在主服务器中收集并重新分发到6台本地服务器,以便能够使用完整的数据做出决策 每个本地服务器都有一个缓存组件,该组件根据不同的参数(位置、传入参数等)缓存传入请求。对于每个请求,本地服务器决定是转到数据库(ORACLE)还是从缓存获取响应。但是,在这两种情况下,本地服务器都必须

我们有一个.Net应用程序,它分布在6个本地服务器上,每个服务器都有一个本地数据库(ORACLE)、一个主服务器和一台负载平衡机。请求到达负载平衡器,负载平衡器将传入的请求重定向到6个本地服务器之一。在特定的时间间隔内,数据在主服务器中收集并重新分发到6台本地服务器,以便能够使用完整的数据做出决策

每个本地服务器都有一个缓存组件,该组件根据不同的参数(位置、传入参数等)缓存传入请求。对于每个请求,本地服务器决定是转到数据库(ORACLE)还是从缓存获取响应。但是,在这两种情况下,本地服务器都必须转到数据库,才能对每个请求执行1次插入和1次更新

问题: 在高峰日,每个本地服务器每秒接收2000个请求,系统开始减速(CPU:90%)。我正在尝试在将另一台本地服务器添加到混合服务器之前增加容量。在运行了一些基准测试之后,瓶颈一直是,似乎是每个数据库请求不可避免地要插入和更新一次

尝试过的方法 为了降低频率,我创建了一个位于DB和.NET应用程序之间的Windows服务。它包含一个管道服务器,从主.NET应用程序接收每个插入和更新,并将它们保存在哈希表中。然后,新服务在特定的时间间隔进入数据库一次,以进行批量插入和更新。关键是要减少访问数据库的频率。虽然这有一个积极的影响,但它并没有像我预期的那样对系统负载有多大的好处。随着每秒请求数的增加,大部分cpu负载来自oracle.exe

我试图尽可能避免访问数据库,而避免DB的唯一方法似乎是增加缓存命中率,而不是我尝试的上述解决方案。我的缓存命中率目前约为81%。因为每个本地机器都有自己的缓存,所以我实际上丢失了很多可缓存的请求。当两个相似的请求重定向到不同的服务器时,第二个请求无法从第一个请求的缓存结果中获益

我在系统架构方面没有太多的经验,所以我非常感谢对这个问题的任何帮助。欢迎对不同的缓存体系结构或设置或任何工具提出任何建议


提前谢谢你们,希望我能把问题说清楚。

每台服务器每秒2000个请求,大约24000 RPM到数据库。这对DB来说是一个巨大的负载。 尝试优化、缩放或群集化数据库


可能是NoSQL DB(Redis\Raven\Mongo),因为中间件将适合您。本地服务器将读取\写入分片NoSQL DB,聚合数据将与Oracle非高峰时间同步。

对我来说,这看起来像是timesten解决方案的应用程序。在这种情况下,您可以消除本地数据库,只返回一个数据库。在您现在拥有本地oracle数据库的地方,您可以实现缓存网格。这很可能是一个AWT(异步、直写)缓存。看见 这不是一个便宜的选择,但是否值得调查。 您可以继续专注于业务逻辑,而不必担心速度。当然,只有在应用程序代码已经过调优并且sql具有良好的性能和可伸缩性的情况下,这才是有效的。必须准备好SQL(使用绑定变量)以获得最佳性能。 应用程序连接到缓存,而不再连接到数据库。在缓存组中创建要缓存的缓存表。SQL中的所有表都应该缓存,否则,完整的SQL将传递到Oracle数据库。在网格中,缓存融合机制已经就位,因此您不必担心网格中的数据位于何处。 在当前版本中,包含了对.net的支持。
数据是一致的,并异步更新到Oracle数据库。如果所需的数据在缓存中,并且您关闭了Oracle数据库,则应用程序可以继续运行。一旦数据库再次返回,同步就会再次恢复。非常强大

我知道这个问题现在已经过时了,但我想让大家知道我们是如何解决问题的

在尝试了许多优化之后,我们所需要的只是6台本地机器的固态驱动器。安装后,CPU立即下降到30%。这是我第一次看到任何类型的硬件更新对性能的贡献如此之大

如果您有高负载设置,在进行任何软件或体系结构更改之前,请尝试升级到SSD


谢谢大家的回答。

实际上,每台服务器都有自己的数据库,因此,如果没有我在“尝试方法”一节中提到的中间件,每台服务器更像是4000 RPM。我对问题进行了编辑,使这些部分更加清楚。NoSQL可能是一个很好的解决方案,但问题是我们不能等待太多的时间来同步数据,因为实时统计数据用于业务层。根据应用程序的需要,同步数据的时间间隔最多为2秒。实时统计+高负载=需要扩展数据库。是的,我们可能需要在混合中再添加一台服务器。我只是想了解,对于这样的应用程序,我们是否有最优化的结构。Facebook的性能大约是最大性能的一半,Twitter可能比它慢10倍(因为Ruby)。但谁在乎呢?它工作,它赚钱。优化整个体系结构可能会产生错误和限制。你发现了瓶颈——数据库,克服这个瓶颈。这看起来是一个巨大的实现变化,但很值得研究。因此,如果您必须水平扩展,您只需将新缓存添加到网格中?