【问题标题】:Logging large volumes of actions in a production MVC/SQL application在生产 MVC/SQL 应用程序中记录大量操作
【发布时间】:2011-12-31 00:42:02
【问题描述】:

我们是 ASP.NET MVC 框架和 SQL Server 的快乐用户,目前使用的是 LINQ-to-SQL。它通过面向消费者的应用程序很好地满足了我们的需求,该应用程序每月约有 140 万用户和 2+ 百万活跃唯一用户。

我们早就应该开始记录所有用户操作(文章的查看、我们网站上的搜索等),我们正在努力寻找合适的架构来做到这一点。 p>

我们希望归档系统成为自己的实体,而不是存储生产文章和搜索引擎的主要 SQL 集群的一部分。我们希望它成为自己的 SQL 集群,一开始只有一个盒子。

为了简化问题,假设我们只想记录这数百万用户在当月进入我们网站的搜索字词,并且我们希望以尽可能少的周期密集型方式进行。

我的问题: (1) 是否有异步方式将搜索词转储到远程框中? LINQ 是否支持异步?

(2) 您是否建议在 RAM 缓存中构建一个包含 1,000 个(userId、searchTerm、日期)日志项的缓存,然后每隔一段时间将这些日志项刷新到数据库中?我认为这种方法会减少打开/关闭连接。

或者我认为这完全错误?我们希望在易于实施和稳健性之间取得平衡。

【问题讨论】:

标签: asp.net-mvc sql-server-2008 model-view-controller bigdata


【解决方案1】:

1)当然可以,有不同的解决方案来实现它。 Linq 不是您需要的工具。 2)这样做不应该有任何重大改进,只有在执行搜索时才会触发“记录”。你最终会接到两个电话而不是一个,这没什么大不了的。

建议使用AOP

您可以使用Postsharp 创建一个干净且独立的记录层(不过还有其他选择)。只有当您需要跟踪传递给操作的内容时,您才会使用所需的日志记录属性来装饰您的操作。 这种方法的主要优点是:

  • 日志记录逻辑不驻留在您的代码中(您不需要更改您的方法代码),而是在您的方法之前/之后执行。
  • 将 Aspect 与目标方法完全分离。
  • 您可以轻松打开/关闭各个方面

AOP 是一种常见的做法,特别是当涉及到可以添加到多个方法的行为时,例如日志记录、身份验证等。是的,它可以以异步方式使用。

【讨论】:

    【解决方案2】:

    1)我建议您创建一个HttpModule 来“捕获”用户使用的所有搜索词。您将如何以及在何处转储这些信息(您说您将使用 SQL 框)这是另一个超出模块范围的问题,它应该只捕获搜索项。 然后,您可以创建一个包含登录的组件,以使用异步调用(甚至是像 Log4Net 这样的第三方组件)来存储这些信息

    2) 如果你想创建一种批量插入缓存你需要存储的所有信息并在某个时候将它们转储到 SQL 上,我会使用MSMQ 或任何其他支持Reliability 的技术:我想你希望在系统崩溃等情况下丢失所有这些信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多