由瑞安·博伊德 (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,这意味着他们的用户可以获得更好的搜索和路由体验。