多语言持久性案例研究:Wanderu + Neo4j + MongoDB

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

由瑞安·博伊德 (Ryan Boyd) 撰写。

每种语言和数据存储解决方案都有其优势。毕竟,对于您应用程序中的每项可能任务,没有任何一种解决方案是性能最佳且最具成本效益的。

为了利用不同数据存储解决方案的不同优势,您的应用程序需要利用多语言持久性。这正是 Wanderu 在建立他们的元搜索旅游网站时所做的——他们是这样做的:

技术挑战

Wanderu 为消费者提供了搜索公共汽车和火车票的能力,其旅程结合了来自多家不同运输公司的行程。路线数据存储在 JSON 中,使像 MongoDB 这样的文档存储引擎成为路线段数据存储的绝佳解决方案。

但是,他们还需要能够 找到从起点到终点的最佳路径 。这对于像 Neo4j 这样的图形数据库来说是完美的,因为 Neo4j 可以理解不同公交路线腿之间的数据关系。

多语言持久性:使用 MongoDB 和 Neo4j

Wanderu 不想强制 MongoDB(一种基于文档的数据存储)处理图形样式的关系,因为实施成本高且效率低下。相反,他们使用多语言持久性方法来利用各自的优势,决定同时使用 MongoDB 和 Neo4j。

解决方案架构图


Wanderu 机票搜索引擎同时使用 MongoDB(用于简单的 JSON 文档存储)和 Neo4j(用于高效的路线计算)。

同步的挑战

由于公交路线路段存储在 MongoDB 中,Wanderu 必须决定是编写应用程序代码将此信息作为图形模型同步到 Neo4j 中,还是使用同步技术自动处理此信息。

Wanderu 的首席技术官兼联合创始人 Eddy Wong 发现了 名为“mongo-connector”的 GitHub 项目, 该项目使 Mongo 的内置复制服务能够将数据复制到另一个数据库。 Eddy 只需为 Neo4j 编写一个文档管理器,它处理每个 MongoDB 插入或更新操作的回调。

当新条目添加到 MongoDB OpLog 时,Mongo 连接器调用 Neo4j DocMgr。 Wanderu 编写的 Neo4j DocMgr 代码然后使用 py2neo 开源 Python 库 在 Neo4j 中创建相应的节点、属性和关系。 API 服务器然后使用 Node-Neo4j 将查询发送到图形数据库。

最终的解决方案利用了 Neo4j、MongoDB、JSON、Node.js、Express.js、Mongo Connector、Python 和 py2neo。多语言持久性确保这些技术中的每一种都根据其最大优势来使用。对于 Wanderu,这意味着他们的用户可以获得更好的搜索和路由体验。