目前我们正在将所有 SOAP 请求保存到一个日志文件中(滚动,每天一个)。当我收到有关谁做了什么、何时、多久等的请求时 - 然后我需要求助于重型文本操作以提取该信息。我的想法是将这些 SOAP 请求保存到一个数据库中,我可以在其中执行一些查询。
SOAP 请求由 header 和信封组成。 header 中是调用该操作的用户名。在信封的主体中,第一个元素是 WS 方法名称,后面是该方法的所有参数。每个 WS 方法显然都有不同的参数:
- SOAP 请求
- 信封
- 页眉
- 用户名 = XXX
- 正文
- WS 名称
- WS 参数(方法之间不同,分层)
- WS 名称
- 页眉
- 信封
我想构建这样的查询而不会有太多困难:
- 用户XXX在一定时间内调用了哪些WS方法
- 每个 WS 方法被调用的频率
- 显示对 WS XXX 的所有请求,其中 WS 的特定参数是 YYY(例如,每次调用“changeParty”,其中 partyId = 123)
这是否非常适合“文档存储类型的数据库”/NoSQL,例如 CouchDB/MongoDB?这会很难设置吗?还有其他建议/建议/想法吗?
谢谢!
编辑:
- 在大多数情况下,我认为我可以使用以下索引:用户、WS 方法、requestDate。任何其他字段可能不会被索引(尽管我会对它们进行一些过滤)。由于它仅用于审计目的,因此不必快如闪电。
- 我正在考虑将 NoSql 服务器放在我们拥有的庞大应用服务器上,并让“真正的底层”数据库 (DB2) 摆脱任何类型的日志记录,因为它的使用非常频繁。
最佳答案
好吧,特别是关于 Couch 和 Mongo,您必须处理的第一个问题是将 SOAP XML 有效负载转换为一些相关的 JSON 有效负载,因为这是这些数据库所理解的。
接下来,大多数这些数据库都要求您预先、在初始设计期间以及理想情况下在开始向它们加载数据之前,很好地了解您希望从它们进行哪些查询。对于现有数据集,尤其是大型数据集,添加新索引的成本可能很高。
这一切都非常可行,但您想摆脱 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 文档中公开的任何内容构建 View 或索引。您将无法(轻松地)从原始 SOAP 请求中查询任何内容。只有您专门提取并放入 JSON 负载中的元素才能通过数据库轻松访问。
不过,我的基本观点是,如果您必须通过任何编码过程来转换您的数据并使其为数据库做好准备,那么您可能还不如使用您已经知道并在您的公司得到支持的数据库(即可能是您现有的 RDBMS),而不是通过添加新数据库向您的堆栈中引入另一 block 砖。
如果您已经是原生 JSON,或者说,找到了支持原生 XML 与 JSON 的 NoSQL 式数据库,那么这可能是值得的,因为您可以跳过该过程的这一部分。
但是您可以轻松地创建一个(或多个)表来在大多数现代 RDBMS 中处理这些数据。
关于logging - NoSql 用于将 SOAP 请求保存到数据库以进行审计日志记录 - 然后进行查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671718/