我想知道在涉及数据库和文件系统的多个数据存储中处理事务的最佳方法是什么?

这是场景:

考虑一下我有一个系统,其中我必须存储包含文本和二进制文件的数据。文本提供元数据信息,而二进制数据是要存储的实际数据。数据也应基于客户端设置的元数据可搜索。

这带来了以3种形式存储数据的体系结构
1.将二进制数据存储到文件系统上
2. RDBMS中的一条记录,其中包含指向文件系统上二进制数据的指针(id,位置)
3.索引引擎(如Solr / Lucene)中的记录,用于基于元数据的搜索需求。

请注意,使用RDBMS是为了提高可靠性,因此可以在Solr / Lucene索引损坏的情况下进行重新索引。

在上述情况下的挑战在于,它们每个都是不同的数据存储,并具有自己的事务行为。 RDBMS为我提供了交易功能,而其他两个则没有。

现在的问题是,我想跨多个数据存储创建事务性行为。这意味着任何数据存储中的故障都应还原其他两个数据上的更改。

它还提出了一个问题,即应该从哪个主要数据存储中搜索信息,因此,将数据存储到每个数据存储中的顺序将变得非常重要。

在一个示例中,我想执行以下操作


将文件写入文件系统
在Solr / Lucene上创建索引
将记录插入数据库中。


在上述情况下,如果数据库插入失败并发生重试,那么我们可以将数据覆盖到文件系统以及索引引擎上。因为您不希望在服务器崩溃的情况下有数据库记录并且在文件系统中没有存储任何数据。

现在,如果搜索主要由搜索引擎提供,则它可以具有陈旧的数据,而数据库中没有相应的记录。这意味着跨数据存储存在一致性问题。

我相信有人需要某种状态引擎,该引擎了解跨数据存储的每条记录的状态,直到最后一次提交为止,并且具有清除陈旧数据的能力。

我想知道还有其他方法可以处理吗?还有什么其他技术可以处理跨多个数据存储的数据插入和更新的这种情况?

最佳答案

显然,您的问题描述了一个非常复杂的场景。跨多个数据存储写入数据,并希望所有系统之间的写入都是事务性的。

我可以想到三种方法。

使用服务总线

Mule ESB(http://www.mulesoft.org/)提供了自己的事务处理功能,可让您相当轻松地将数据写入多个系统。

困难的部分将是在写入之一失败的情况下实施回滚策略。但是Mule绝对是我的第一个想法,因为它与许多系统具有良好的集成,并且支持事务处理的想法。

将记录标记为脏

第二种方法是向每个系统中的每个记录引入一个脏标志。在开始事务时,您将写入数据,并将每个系统中每个记录的“脏”标志设置为1。

如果所有写入均成功,则需要返回并将标志设置为0。如果失败,则返回并删除任何脏的东西是很容易的。

对于读取,您永远不会读取任何脏的东西。

如果您要写入四个数据,则可以写入三个,第四个失败,而不必重新进行整个事务,您可以继续重试第四个直到成功。然后返回并标记所有内容为脏= 0。

Java JTA

http://en.wikipedia.org/wiki/Java_Transaction_API。如果您可以将所有内容包装在X / Open XA架构中,则可能会起作用。

10-02 00:38
查看更多