目前,我们正在将所有SOAP请求保存到日志文件中(滚动,每天一个)。当我收到关于谁做了什么,何时,经常等的请求时,我需要采用重型文本操作来提取该信息。我的想法是将这些SOAP请求保存到我可以执行某些查询的数据库中。
SOAP请求由标头和信封组成。标题内是调用操作的用户名。在信封的主体内,第一个元素是WS方法名称,后跟该方法的所有参数。每个WS方法显然都有不同的参数:
我想构建这样的查询而不会有太多困难:
这是否适合“文档存储类型的数据库”/ NoSQL,例如CouchDB / MongoDB?这难以设置吗?任何其他建议/建议/想法?
谢谢!
修改
答案 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可以。