我想知道dspace如何在支持并发性的同时管理数据库和solr中的索引。换句话说,如果2个人尝试同时写入同一个项目(例如更改元数据),dspace如何确保索引不会与数据库失去同步。
如果USER1与USER 2同时写入相同的元数据值,并且首先发生对USER 1的数据库的写入,则会发生这种情况,但随后写入数据库和USER2的索引,然后写入USER1 Happen的索引。
换句话说,USER1"写"将在索引中,而User2写入将在数据库中=不一致!!!
我想知道如何在dspace中避免这种情况,这是典型的双写问题。
使用dspace的事件系统,我不知道如何避免这种情况。
有谁知道?
答案 0 :(得分:2)
在Solr中,DSpace不仅仅索引单个元数据更改(发生时)。它实际上重新索引Solr中的整个Item。
这意味着虽然并发性是数据库层中的一个问题(并且写入/更新在数据库中同步),但它不是Solr索引过程中的一个。
以下是您的示例中应该/应该发生的事情。
因此,这里的简单答案是DSpace不会重新索引单个修改(如果不与数据库编辑同步,则最终可能会失序)。相反,它会跟踪哪些对象已更新,并触发整个对象元数据的重新索引。虽然这可能看起来像“过度杀伤”,但Solr中单个对象的重新索引并不是所有过程密集型的,它确保对象的当前/最新元数据在Solr中被索引(在同时写入的情况下)。
更新:根据要求(在下面的评论中),这里是DSpace如何更详细地执行重建索引(在Solr中)。
dspace.cfg
中的配置:https://github.com/DSpace/DSpace/blob/dspace-5_x/dspace/config/dspace.cfg#L732 IndexEventConsumer
执行索引的索引。默认情况下,此处已定义:https://github.com/DSpace/DSpace/blob/dspace-5_x/dspace/config/dspace.cfg#L732 Item.update()
方法将实际保存的更改保存回数据库层。DatabaseManager.update()
),Item.update()
方法会生成new MODIFY event in the Event System。BasicDispatcher
),然后在Solr中触发索引(通过已配置的IndexEventConsumer
)IndexEventConsumer
将更新对象列表(在本例中为Item)传递给IndexingService(默认情况下为SolrServiceImpl
)。SolrServiceImpl.indexContent()
从数据库中读取最新的元数据值,并在Solr中对它们进行索引。上面的逻辑仍然有点简化(因为它太复杂而无法遍历代码的每一步)。但是,这里的基本要点是每个Item.update()
调用都被视为数据库事务。它还会触发添加MODIFY事件,该事件存储在用户的会话中(Context对象)。提交数据库事务后,IndexEventConsumer
处理MODIFY事件,重新索引整个项目。
因此,在同步编辑的情况下,将生成两个MODIFY事件(每个编辑一个)。但是,在提交 last 数据库编辑之后才会触发 last MODIFY事件。因此,Solr索引应始终与数据库中的最新信息同步。