【问题标题】:NoSql for saving SOAP requests to DB for audit logging - and then querying?NoSql 用于将 SOAP 请求保存到数据库以进行审计日志记录 - 然后查询?
【发布时间】:2010-09-10 04:35:41
【问题描述】:

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

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

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

我想构建这样的查询没有太多困难:

  • 特定时间段内调用了用户 XXX 的哪些 WS 方法
  • 每个 WS 方法的调用频率
  • 显示向 WS XXX 发出的所有请求,其中 WS 的特定参数为 YYY(例如,每次调用“changeParty”,其中partyId = 123)

这是否非常适合“数据库的文档存储类型”/NoSQL,例如 CouchDB/MongoDB?这会很难设置吗?任何替代建议/建议/想法?

谢谢!

编辑:

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

【问题讨论】:

    标签: logging soap nosql


    【解决方案1】:

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

    接下来,这些数据库中的大多数都要求您在初始设计期间,最好是在开始将数据加载到它们之前,充分了解要从它们中进行哪些查询。对于现有数据集,尤其是大型数据集,添加新索引的成本可能很高。

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

    最后,由于您已经将数据从 XML 转换为 JSON,您最好从 SOAP 请求中提取“有趣的字段”,即您想要查询的那些,然后简单地填充您自己的索引字段和行并将数据存储在您(我假设)已经存在的 SQL 数据库中。

    编辑评论:

    这对你来说是不透明的,用户,因为转换为 JSON 的负担落在你身上,因为提到的两个数据库需要一个 JSON 文档传递给他们。

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

    所以,你可以创建一个文档:

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

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

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

    如果您已经是原生 JSON,或者说,找到了支持原生 XML 与 JSON 的 NoSQL 式数据库,那么这可能是值得的,因为您可以跳过该过程的那部分。

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

    【讨论】:

    • 我猜 XML 到 JSON 的转换可以透明地完成?在大多数情况下,我认为我可以使用以下索引:用户、WS 方法名称、soap-requestDate。任何其他字段都可能不会被索引(尽管我会对它们进行一些过滤)。由于它仅用于审计目的,因此不必快如闪电。只有合理
    【解决方案2】:

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

    【讨论】:

    • +1 在我的部分答案中发布相同内容时没有看到此答案。
    【解决方案3】:

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

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

    我相信其他 SQL 数据库也可以做到这一点。

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

    【讨论】:

    • 我实际上在 AS/400 上使用旧版本的 DB2,我认为它本身不支持 XML。此外,我不想在数据库机器上增加额外的负载和存储空间要求。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 2014-04-17
      • 2015-03-13
      • 2011-03-06
      • 2011-02-22
      • 2023-01-23
      相关资源
      最近更新 更多