4

我们很高兴ASP.NET MVC框架和SQL Server的用户,目前使用的是LINQ to SQL。它满足了我们的需求,面向消费者的应用程序每月约有140万用户和2百万活跃用户。在生产MVC/SQL应用程序中记录大量操作

我们期待已久的日志开始记录全部用户操作(文章浏览,我们网站上的搜索等),我们正在努力确定正确的架构。

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

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

我的问题: (1)是否有异步方式将搜索项转储到远程框? LINQ是否支持异步? (2)你会建议在RAM缓存中建立一个说1000(userId,searchTerm,date)日志项的缓存,然后每隔一段时间将这些缓存刷新到数据库?我认为这种方法会减少打开/关闭连接。

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

+1

此线程可能有几个好为你解决, http://stackoverflow.com/questions/752456/asynchronous-logging-to-a-database-net – 2011-12-31 22:56:08

回答

0

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

一个建议是使用AOP

您可以使用Postsharp用于记录一个干净的和独立的层(有其他选择,虽然)。只有当您需要跟踪传递给操作的内容时,您才会使用所需的日志记录属性装饰您的操作。 这种计算策略主要优点是:

  • 录入逻辑不在于你的代码中(你不需要改变你的方法的代码),但你的方法后,之前执行/。
  • 清晰地将目标与目标方法分开。
  • 您可以轻松地打开/关闭方面

AOP特别是当它涉及到的是可以添加到一个以上的方法,如日志,认证等行为的普遍做法。是的,它可以以异步方式使用。

0

1)我建议你创建一个HttpModule,以“捕捉”用户使用的所有搜索词。你将如何以及在哪里转储这些信息(你说你会使用一个SQL框),这是另一个不在模块范围内的事情,它应该抓住搜索引擎。 然后,您可以创建一个包含登录到存储使用异步调用这些信息的组件(或者甚至第三部分成分像log4net的)

2)如果你想创造一种批量插入的缓存,你需要的所有信息存储和在某些时候转储他们在SQL我会使用MSMQ或任何其他技术,支持Reliability:我想你想在系统崩溃的情况下,松散的所有这些信息等