4

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

我们早就应该开始记录所有用户操作(文章查看、我们网站上的搜索等),并且我们正在尝试确定正确的架构来做到这一点。

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

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

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

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

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

4

2 回答 2

0

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

一个建议是使用AOP

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

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

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

于 2012-01-06T14:14:02.103 回答
0

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

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

于 2012-01-06T15:06:07.547 回答