architecture - 收集审计和统计数据

标签 architecture schema design-patterns

我的问题是,大型 Web 应用程序中发生了很多事件,我时不时地想看看发生了什么(出于审计目的),或者我想聚合数据以进行统计报告。

一种解决方案是在数据库中为每种类型的事件创建一个表并将其记录在那里。例如更改密码、记录日期、用户、IP 等。这将为我提供所需的审核信息,并且能够针对表运行报告以查看此功能的使用频率。缺点是我需要为我想要捕获的每种类型的事件创建一个新表。

我理想的解决方案是拥有一个结构更灵活的表,可能是一个 XML 字段,但我对表中的 xml 字段并不着迷。

所以我的问题:是否有一个使用良好(流行)的模式可以解决我的问题?

最佳答案

您的大型 Web 应用程序有多大?

将事件记录为 XML blob 应该可以,并且某些数据库(例如 SQL Server)允许您直接查询该 XML。然而,这些查询的性能很糟糕。

在数据库中进行事件日志记录之前,您应该计算出每秒要创建多少条记录。 如果数字很大,则会给数据库带来严重负载,并可能影响整体应用程序性能。 此外,一旦积累了大量记录,查询数据将花费很长时间(并在此过程中杀死数据库性能)。聚合数据的情况更糟 - 关系数据库在聚合方面效率不高。

Chris 的上述建议对于小型数据库来说效果很好,但无法扩展,因为您的查询必须使用联接。对数据进行非标准化可能会更好。

即使您的应用程序没有获得足够的流量让您现在担心这个问题,请记住,由于上述原因,记录到数据库的事件无法很好地扩展。

具体建议:

如果您没有那么多流量并决定登录到数据库,请对单独的模式执行此操作,这样您就可以更轻松地将其移动到单独的数据库服务器,以便从您的生产数据库。

如果您决定将事件记录为 xml,请考虑为此目的使用关系数据库是否有意义 - 如果您无法有效地查询,那么简单的日志文件会简单得多。当然,您稍后必须弄清楚如何处理该日志数据,但对于不频繁/简单的查询,使用 grep、awk 等编写一些脚本将花费您相当长的时间。

当今(非常)大型应用程序常用的方法是记录到文件,然后使用映射减少运行分析(聚合),例如在hadoop上。

关于architecture - 收集审计和统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5396336/

相关文章:

architecture - ZeroMQ 服务和数据访问

java - 使用 java 的 JSON 模式验证

javascript - Business Catalyst - 如何从架构元内容中删除井号

oracle - 管理 Oracle 同义词

java - 地址簿搜索 - 当大数据时我应该使用哪种数据结构

c# - 在 C# 中表示游戏卡类的最佳方式

java - 用于初始化依赖于另一个应用程序 EJB 的 EJB 的模式

c# - 有人想过以这种方式使用黑板模式吗?

c# - 修改后的责任链

angular - 在功能模块中延迟加载 Angular Material