关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。
去年关门了。
改进这个问题
我们使用couchdb支持的hyperledger结构来存储包含大量文本的记录。我们希望构建一个解决方案,允许使用ElasticSearch对这些记录进行自由文本搜索。接下来的问题是实时将fabric/couchdb数据导入ElasticSearch。最好的方法是什么。我能想出三个approaches:-
1) 创建一个以连续模式侦听couchdb changes提要的服务(couch对此有很大的支持),并将更改推送到消息队列(kafka)。另一个服务可以读取Kafka的内容,并推送到ElasticSearch。我喜欢这个想法(“更改数据捕获”),因为我们可以从kafka日志中构建其他读取视图。这种方法的缺点:
虽然我们使用的是hyperledger结构,但我们正在对底层数据存储(couchdb)进行编程。如果hyperledger在一年后迁移到mongodb(或者决定与couchdb一起支持它,我们想迁移到mongodb),会发生什么?我们得重写/更换Kafka连接器。
维护两种状态:1)从couchdb读取的最后一个文档的偏移量更改feed和2)kafka偏移量。我们可以用Zookeeper吗?
2) 让我们的客户机应用程序(写入fabric的应用程序)在每次向fabric写入/更新事件时都将事件发布到kafka。然后,另一个服务可以读取这些事件并将其写入到elastic。这种方法最大的缺点是:
我们进入了双重写入的领域(1到fabric,1到kafka),没有什么好方法可以原子化地同时完成这两个任务。这使我们容易受到竞争条件和部分失败的影响(写入fabric成功,但写入kafka失败等)。
3) 我相信hyperlerdger结构对等机提供了一种称为“事件服务”的服务,它在每次写入账本时都会发布事件。然而,这个文档不是很好,我找不到任何例子。如果你有这方面的经验,你能详细说明一下吗?我对这种方法最大的问题是,它还没有经过实战测试,当由于缺少文档/博客/示例等而出现问题时,很多开发人员的时间将花在修复问题上。
非常感谢你的帮助。
1条答案
按热度按时间zpjtge221#
建议的模式是#3—侦听块事件,并让侦听器将所需的任何数据插入可查询的数据存储(如elasticsearch)。使用基于通道的事件服务,侦听器客户端从某个起始块开始注册事件。如果服务中有任何中断,侦听器客户端总是可以从中断的位置恢复。
node.js sdk事件教程中详细介绍了这种模式以及事件服务的一般用法。