NoSql用于将SOAP请求保存到DB以进行审计日志记录 - 然后查询?

时间:2010-09-08 20:43:23

标签: logging soap nosql

目前,我们正在将所有SOAP请求保存到日志文件中(滚动,每天一个)。当我收到关于谁做了什么,何时,经常等的请求时,我需要采用重型文本操作来提取该信息。我的想法是将这些SOAP请求保存到我可以执行某些查询的数据库中。

SOAP请求由标头和信封组成。标题内是调用操作的用户名。在信封的主体内,第一个元素是WS方法名称,后跟该方法的所有参数。每个WS方法显然都有不同的参数:

  • SOAP请求
    • 信封
      • 标题
        • 用户名= XXX
      • 车身
        • WS名称
          • WS参数(方法之间不同,分层)

我想构建这样的查询而不会有太多困难:

  • 哪些WS方法在一定时间内调用了用户XXX
  • 每个WS方法多久调用一次
  • 向我展示向WS XXX提出的所有请求,其中WS的特定参数是YYY(例如,每次调用“changeParty”,其中partyId = 123)

这是否适合“文档存储类型的数据库”/ NoSQL,例如CouchDB / MongoDB?这难以设置吗?任何其他建议/建议/想法?

谢谢!

修改

  • 在大多数情况下,我认为我可以使用索引:user,WS方法,requestDate。任何其他字段都可能不会被索引(尽管我会对它们进行一些过滤)。由于它仅用于审计目的,因此不必是快速闪电。
  • 我正在考虑将NoSql服务器放在我们拥有的怪物app-servers上,并让“真正的底层”数据库(DB2)从任何类型的日志记录中解脱出来,因​​为它的使用非常繁重。

4 个答案:

答案 0 :(得分:3)

嗯,特别是关于Couch和Mongo,您必须处理的第一个问题是在一些相关的JSON有效负载中转换SOAP XML有效负载,因为这就是这些数据库所理解的。

接下来,大多数这些数据库要求您在初始设计期间,在理想情况下开始将数据加载到这些数据库之前,要很好地了解您希望从中进行哪些查询。对于现有数据集,特别是大数据集,添加新索引可能会非常昂贵。

这一切都非常可行,但是你想要在RDBMS中找到任何“临时”查询的概念。它们通常在NoSQL系统中表现不佳。

最后,由于您必须已经将数据从XML转换为JSON,因此最好从SOAP请求中提取“感兴趣的字段”,您要查询的字段,并简单地填充您自己的索引字段并将数据存储在您的(我假设的)已存在的SQL数据库中。

编辑评论:

对用户而言,这对您来说并不透明,因为转换为JSON的负担落在您身上,因为提到的两个DB需要将JSON文档传递给它们。

也就是说,您可以简单地提取您关心的几个位而不是整理整个文档。在这种情况下,您必须对您感兴趣的所有内容进行编组,包括过滤。

因此,您可以创建一个文档:

{ "user":"Bob",
  "methodName" : "helloWorld",
  "soapDate" : "2010-09-01 12:23:45",
  "soapRequest" : "...escaped XML goes here..."
}

然后,您可以构建JSON文档中公开的任何内容的视图或索引。您将无法(轻松地)从原始SOAP请求中查询任何内容。只有您专门提取并放入JSON有效负载的元素才能通过数据库轻松访问。

我的基本观点是,如果您必须通过任何编组过程来转换数据并为数据库做好准备,那么您可能也可以使用您已经知道的数据库并得到贵公司的支持(即可能是您现有的RDBMS)而不是通过添加新的数据库将另一块砖插入堆栈。

如果您已经是本机JSON,或者说,发现了一个支持原生XML与JSON的NoSQL-esque数据库,那么这可能是值得的,因为您可以跳过该部分过程。

但在大多数现代RDBMS中,您可以轻松创建一个或多个表来处理这些数据。

答案 1 :(得分:1)

正如@Robin所说,没有充分的理由在这里使用NoSQL数据库。我最近使用SQL Server做了这种事情,因为它支持XML作为本机数据类型。可以将SOAP请求和响应作为XML类型的列存储在数据库中。然后,可以使用XQuery查询数据库,以查找可能需要的任何请求和响应集。

答案 2 :(得分:0)

为什么选择nosql?例如,如果您使用Postgres,则可以使用简单的插入触发器将XML有效内容和提取的数据块转储到xml字段,以便直接将数据提取到数据库中。你可以有这样一个表:

create table soaps (
  payload text,
  user int,
  method_invoked char,
  .. etc ..
);

我确信其他SQL数据库也可以这样做。

我可以看到使用无SQL解决方案的唯一原因是,如果您拥有大量数据。无论哪种方式,您可能都需要一些数据生命周期管理工具来存档旧数据。

答案 3 :(得分:0)

如果您在.net或java中的对象实例中加载了该数据: db4o 。保存顶部实例并定义一些索引。

如果你在xml中使用它,我会使用能直接支持它的东西。我认为Sql Server Express可以。