asp.net-mvc 网站扩容时,优先考虑的重点是什么?
When scaling asp.net-mvc website, what are the top things to focus on in terms of priority?
我问了这个关于网站可扩展性的服务器故障的问题,但这更侧重于硬件配置、增加内存等。所以我想我会在这里问这个问题,因为我的问题有更多的开发方面.
根据这个问题,我有一个完美的工作 asp.net-mvc 站点,带有 SQL 服务器后端并使用 nhibernate 和 syscache 二级缓存,我有一个增加用户群的请求大约 1000 到 7000,我想弄清楚我应该把我的开发精力集中在哪些现在工作得很好但会引起大规模问题的事情上。我一直在阅读大量书籍,到目前为止,从编码的角度来看,我感兴趣的是;
- Asyncronous Controllers
- Output caching(对我来说不是很重要,因为我的大部分页面都是动态的并且特定于用户权限
- 其他?
我的 SQL 服务器今天是 4GB,就数据而言,我预计 table 中的一些服务器的大小会线性增长(比如一个人 table随着用户的增加,从 1000 行增长到 7000 行),但大多数其他 tables(参考数据等)应该只有边际增长(像 table 这样的位置可能会翻倍)
备份
你真的需要一个可靠的数据备份系统。随着严重错误的机会随着用户数量的增加而增加,一个好的备份系统非常重要。您也可能会掉线并丢失数据。
离线数据存储
数据需要一个家。创建一个强大的数据存储系统非常重要。这是当您出于任何原因离线时使用的。
结构测试
压力测试将帮助您了解要解决的问题。用 10,000 个随机项目填充数据库并测试所有功能。尝试搜索特定的 ID 号码。
确保服务器的带宽能够处理它。增加用户群将增加服务器的负载。用户越多一次越多。
随着请求的数据量的增加,死锁的可能性也会增加。您可能想阅读 this 篇文章
您描述的架构不可扩展。但是根据您提供的数字,也许可扩展性对您来说根本不是必需的?在设计可扩展性之前要务实。除非你需要,否则不要参与其中。
无论如何,如果你想坚持下去,你需要按如下方式缩放。
首先区分一下commands and queries。命令修改数据,查询检索数据。
对于命令,您可以使用消息代理(例如 Rabbit MQ) or a service bus (e.g. NServiceBus). Idea is that web server can quickly place a command on the queue, and return the response to the user. Scalability is achieved by scaling out the number of command handlers without touching the web server. Obviously, if you want to inform the user, you need to use some technology such as SignalR。
对于查询,您需要了解它们不像命令那样擅长缩放。所以,你需要在这些方面发挥创意。
- 缓存数据。这伴随着对陈旧数据以及数据刷新策略的考虑。
- 分发数据 (sharding),当您有许多数据库服务器时,每个数据库服务器只保存数据的子集。 Web 服务器向服务器发出并行请求,每个服务器查询子集(它很小而且很快)和 returns 返回,然后 Web 服务器将所有数据块放在一起供用户使用。今天的大多数 NoSQL 数据库都内置了分片和分布式查询。
- 重新设计用户流程以将查询视为命令。例如接受用户的请求,让用户继续浏览。在后台收集所有必需的数据(通常使用与命令相同的技术),并在完成后通知用户。当用户转到结果页面时,检索预生成的数据(通常从比检索更快的本地数据库)。
- Async and await keywords in C#。不仅对于控制器,而且对于您的控制器调用的其他方法,只要 they/you 会在等待完成时阻塞线程。使用 async 和 await 将释放请求的线程,以便其他并行请求可以同时使用这些线程。请记住,这不会缩短用户的实际请求,它只会释放 Web 服务器的资源以供最佳使用。
我会分多个步骤解决这个问题以获得最佳结果。
应用层
通常在我的项目中,一些最大的性能缺陷来自每次页面加载的多个数据库查询。尝试加载页面并查看数据库查询日志。如果有额外的查询,请尝试合并请求以减轻数据库上的负载。
此外,请确保您的所有样式表和 javascript 资产都在您的生产环境中编译成缩小的单个文件。这将减少您的网络服务器上的负载。
后端级别
查看您的数据库日志并查看哪些事务导致的延迟最多或触发完整 table 扫描。为这些有问题的区域添加良好的索引,让您的应用程序性能腾飞。
测试
在测试环境中 (!!!) 使用数据库条目伪造工具,例如 Faker(它是 Ruby,但您明白了)。测试比平常大得多的 table 大小的常见事务,性能瓶颈将开始更加突出。
我问了这个关于网站可扩展性的服务器故障的问题,但这更侧重于硬件配置、增加内存等。所以我想我会在这里问这个问题,因为我的问题有更多的开发方面.
根据这个问题,我有一个完美的工作 asp.net-mvc 站点,带有 SQL 服务器后端并使用 nhibernate 和 syscache 二级缓存,我有一个增加用户群的请求大约 1000 到 7000,我想弄清楚我应该把我的开发精力集中在哪些现在工作得很好但会引起大规模问题的事情上。我一直在阅读大量书籍,到目前为止,从编码的角度来看,我感兴趣的是;
- Asyncronous Controllers
- Output caching(对我来说不是很重要,因为我的大部分页面都是动态的并且特定于用户权限
- 其他?
我的 SQL 服务器今天是 4GB,就数据而言,我预计 table 中的一些服务器的大小会线性增长(比如一个人 table随着用户的增加,从 1000 行增长到 7000 行),但大多数其他 tables(参考数据等)应该只有边际增长(像 table 这样的位置可能会翻倍)
备份
你真的需要一个可靠的数据备份系统。随着严重错误的机会随着用户数量的增加而增加,一个好的备份系统非常重要。您也可能会掉线并丢失数据。
离线数据存储
数据需要一个家。创建一个强大的数据存储系统非常重要。这是当您出于任何原因离线时使用的。
结构测试
压力测试将帮助您了解要解决的问题。用 10,000 个随机项目填充数据库并测试所有功能。尝试搜索特定的 ID 号码。
确保服务器的带宽能够处理它。增加用户群将增加服务器的负载。用户越多一次越多。
随着请求的数据量的增加,死锁的可能性也会增加。您可能想阅读 this 篇文章
您描述的架构不可扩展。但是根据您提供的数字,也许可扩展性对您来说根本不是必需的?在设计可扩展性之前要务实。除非你需要,否则不要参与其中。
无论如何,如果你想坚持下去,你需要按如下方式缩放。
首先区分一下commands and queries。命令修改数据,查询检索数据。
对于命令,您可以使用消息代理(例如 Rabbit MQ) or a service bus (e.g. NServiceBus). Idea is that web server can quickly place a command on the queue, and return the response to the user. Scalability is achieved by scaling out the number of command handlers without touching the web server. Obviously, if you want to inform the user, you need to use some technology such as SignalR。
对于查询,您需要了解它们不像命令那样擅长缩放。所以,你需要在这些方面发挥创意。
- 缓存数据。这伴随着对陈旧数据以及数据刷新策略的考虑。
- 分发数据 (sharding),当您有许多数据库服务器时,每个数据库服务器只保存数据的子集。 Web 服务器向服务器发出并行请求,每个服务器查询子集(它很小而且很快)和 returns 返回,然后 Web 服务器将所有数据块放在一起供用户使用。今天的大多数 NoSQL 数据库都内置了分片和分布式查询。
- 重新设计用户流程以将查询视为命令。例如接受用户的请求,让用户继续浏览。在后台收集所有必需的数据(通常使用与命令相同的技术),并在完成后通知用户。当用户转到结果页面时,检索预生成的数据(通常从比检索更快的本地数据库)。
- Async and await keywords in C#。不仅对于控制器,而且对于您的控制器调用的其他方法,只要 they/you 会在等待完成时阻塞线程。使用 async 和 await 将释放请求的线程,以便其他并行请求可以同时使用这些线程。请记住,这不会缩短用户的实际请求,它只会释放 Web 服务器的资源以供最佳使用。
我会分多个步骤解决这个问题以获得最佳结果。
应用层
通常在我的项目中,一些最大的性能缺陷来自每次页面加载的多个数据库查询。尝试加载页面并查看数据库查询日志。如果有额外的查询,请尝试合并请求以减轻数据库上的负载。
此外,请确保您的所有样式表和 javascript 资产都在您的生产环境中编译成缩小的单个文件。这将减少您的网络服务器上的负载。
后端级别
查看您的数据库日志并查看哪些事务导致的延迟最多或触发完整 table 扫描。为这些有问题的区域添加良好的索引,让您的应用程序性能腾飞。
测试
在测试环境中 (!!!) 使用数据库条目伪造工具,例如 Faker(它是 Ruby,但您明白了)。测试比平常大得多的 table 大小的常见事务,性能瓶颈将开始更加突出。