【问题标题】:Live Data Web Application Design实时数据 Web 应用程序设计
【发布时间】:2011-05-05 04:45:15
【问题描述】:

我即将开始设计具有以下特点的个人项目的架构:

  1. 本质上是一个“游戏”,包含基于一项运动的多个并发用户。
  2. 定期模拟这项运动的比赛,并将结果存储在数据库中。
  3. 用户可以“实时”查看模拟比赛的详细信息,并在比赛发生后查看结果。

我开发了一个类似的 Web 应用程序,其范围与该项目的前一个迭代相比要小得多。然而,在这种情况下,我选择使用 SQLite 作为我的数据库提供程序,因为我还有一个可重新分发的桌面应用程序,可用于手动模拟匹配(实际上它作为 Web 应用程序之外的独立模拟器运行)。我的约束现在已经转变为仅是一个 Web 应用程序,因此我不必担心这种额外的复杂性。

我之前实现的主要问题是处理并发请求。我犯了一个错误,即使用一个数据库(由磁盘上的单个文件表示)来支持模拟方面(在服务器上的单独进程中运行)和 Web 应用程序。因此,当用户在进行实时模拟的同时访问网站时,会出现各种数据库访问问题,因为它被一个进程锁定。我通过在数据库操作上实现跨进程互斥来解决此问题,但这大大降低了网站的性能。

我将使用的工具是:

  1. 用于 Web 应用程序的 ASP.NET。
  2. 用于数据库的 SQL Server 2008 R2...可能带有用于对象关系映射的 NHibernate 层。

我的问题是,我该如何设计才能实现最佳效率以及并发访问?显然,从文件转移到实际的数据库服务器会有好处,但我是否需要两台冗余服务器——一台用于模拟进程,一台用于 Web 服务器进程?

任何建议将不胜感激!

谢谢。

【问题讨论】:

    标签: asp.net sql-server-2008 database-design web-applications concurrency


    【解决方案1】:

    在同一个数据库上做这两件事应该没问题。并发访问是现代数据库引擎的设计目的。并发读取通常完全没有问题;并发写入锁定尽可能少的数据量(一个表,甚至只是一些行),而不是整个数据库。

    不过,您应该记住以下几点:

    • 明智地使用事务。一方面,事务是确保数据库始终一致的重要工具——简而言之,事务要么完全发生,要么根本不发生。另一方面,两个并发事务可能会导致死锁,而且这些漏洞极难调试。
    • 规范化并使用约束来保护您的数据完整性。强制执行外键可以节省时间,尽管这通常会导致更繁琐的管理。
    • 尽量减少数据访问所花费的时间:不要在不需要时保留连接,确保没有泄漏任何连接,不要获取你知道不需要的数据,在 SQL 中而不是在代码中进行尽可能多的与数据相关的处理(尤其是可以使用联接、子查询、分组、视图等解决的事情)

    【讨论】:

    • 感谢您的回答和提示。你有使用 NHibernate 的经验吗?由于我 90% 以上的数据可能会通过对象映射存储,我是否需要明确担心这些事情?
    • 我对 NHibernate 没有太多经验,但据我所知,如果你的 NHibernate 会话保持短暂,你应该没问题。归一化点与 ORM 无关,所以无论如何你都应该这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多