我想知道处理涉及数据库和文件系统的多个数据存储中的事务的最佳方法是什么?
以下是该方案:
考虑我有一个系统,其中我必须存储包含文本和二进制文件的数据。文本提供元数据信息,二进制数据是要存储的实际数据。此外,还应根据客户端设置的元数据搜索数据。
这使架构以3种形式存储数据 1.将二进制数据存储到文件系统 2. RDBMS中包含指向文件系统二进制数据的指针(id,location)的记录 3.索引引擎中的记录,如Solr / Lucene,用于基于metedata的搜索要求。
请注意,RDBMS的使用是为了确保可靠性,以便在Solr / Lucene索引损坏的情况下重新编制索引。
上述场景中的挑战是它们中的每一个都是不同的数据存储并且具有它们自己的事务行为。 RDBMS为我提供了事务功能,但其他两个没有。
现在问题是,我想在多个数据存储中创建一个事务行为。这意味着任何数据存储中的故障都应该恢复其他两个上的更改。
它还提出了一个问题,即哪个主数据存储应该从哪里搜索信息,因此存储到每个数据存储中的数据顺序将变得非常重要。
在一个例子中,我想做以下
在上述情况下,如果数据库插入失败并且重试发生,那么我们可以将数据覆盖到文件系统以及索引引擎上。因为您不希望出现数据库记录,并且在服务器崩溃时没有数据存储在文件系统中。
现在,如果搜索主要由搜索引擎提供,则它可能具有过时数据,数据库中不存在相应的记录。这意味着跨数据存储存在一致性问题。
我认为需要某种状态引擎,它可以了解数据存储中每条记录的状态,直到最后一次提交,并且能够清理过时的数据。
我想知道有没有其他方法来处理这个?在多个数据存储中插入和更新数据的其他技术有哪些?
答案 0 :(得分:1)
显然你的问题描述了一个非常复杂的场景。在多个数据存储中写入数据,并希望写入在所有系统中都是事务性的。
我可以想到三种方法。
使用服务总线
Mule ESB(http://www.mulesoft.org/)提供了自己的事务功能,可以让您轻松地将数据写入多个系统。
如果其中一个写入失败,那么困难的部分就是实现回滚策略。但是Mule绝对是我的第一个想法,因为它与很多系统有很好的集成,它支持交易的想法。
将记录标记为脏
第二种方法是为每个系统中的每条记录引入一个脏标志。在开始事务时,您编写数据并为每个系统中的每条记录设置一个“脏”标志。
如果所有写入都成功,那么您需要返回并将标志设置为0.如果失败,则返回并删除任何脏的内容都相当容易。
对于读取,你永远不会读到任何脏东西。
如果你正在写四个数据,你可以写三个,第四个失败,而不是重新做整个事务,你可以继续重试第四个,直到成功。然后返回并将所有内容标记为脏= 0。
Java JTA
http://en.wikipedia.org/wiki/Java_Transaction_API。如果您可以将所有内容都包装在X / Open XA体系结构中,那么这可能会有效。