我目前正在编写一个Node应用程序,我正在考虑缩放。据我所知,横向扩展是扩展应用程序以处理更多并发请求的更简单方法之一。我的工作副本当前在后端使用MongoDb。使用单个数据库的多节点实例
我的问题是这样的:我有一个类似链接列表的数据结构,需要严格维护订单。我的(想象中的)关注点是,当通过多个节点实例存在对数据库的竞争条件时,链表的分辨率可能不正确。
举一个例子:假设服务器有这个列表a-> b。实例1进入对象c,实例2进入对象d。可能存在竞争条件,其中两个实例都读取a-> b并决定将其自己的对象附加到列表中。实例1然后将其插入为a-> b-> c,而当数据库实际上包含a-> b-> c-> d时,实例2认为它是a-> b-> d。
一般来说,这听起来像是一个乐观锁定的工作,但据我所知,MongoDB或Redis(我正在考虑的另一个数据库)以SQL方式进行事务处理。
因此,我想象中的解决方案是下面一个:
使用标志MongoDB中实现自己的事务。客户端对lock变量执行findAndModify,如果成功,则执行操作。如果不成功,客户端在特定超时后重试。
使用Redis事务和pubsub实现相同的效果。我不确定如何做到这一点,但它听起来像是可能的。
实施某种智能负载均衡。如果多个客户端在同一个项目上运行,请将它们路由到同一个实例。由于JS是单线程的,所以问题就解决了。不幸的是,我没有找到一个简单的解决方案。
我确定存在一个更好,更优雅的方式来实现上述,我很乐意听到任何解决方案或建议。谢谢!
+1只是为了了解如何使用Node.js + MongoDB的 –
也期待在Neo4j的,如果你的数据看更像一组文档图... –
谢谢:)我会看看,太多。 – johncch