2012-05-07 26 views
6

我目前正在编写一个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方式进行事务处理。

因此,我想象中的解决方案是下面一个:

  1. 使用标志MongoDB中实现自己的事务。客户端对lock变量执行findAndModify,如果成功,则执行操作。如果不成功,客户端在特定超时后重试。

  2. 使用Redis事务和pubsub实现相同的效果。我不确定如何做到这一点,但它听起来像是可能的。

  3. 实施某种智能负载均衡。如果多个客户端在同一个项目上运行,请将它们路由到同一个实例。由于JS是单线程的,所以问题就解决了。不幸的是,我没有找到一个简单的解决方案。

我确定存在一个更好,更优雅的方式来实现上述,我很乐意听到任何解决方案或建议。谢谢!

+3

+1只是为了了解如何使用Node.js + MongoDB的 –

+0

也期待在Neo4j的,如果你的数据看更像一组文档图... –

+0

谢谢:)我会看看,太多。 – johncch

回答

0

如果我理解正确并且列表正在作为单个文档存储,那么您可能正在查看行版本控制。因此,添加属性的文件将处理的版本,当你更新时,会增加(或改变)版本和你做一个有条件更新:

//更新(条件,值)

更新({version:whateverYouReceivedWhenYouDidFind},newValue)

希望它有帮助。 格斯

0

你希望mongodb上的findAndModify命令能够在返回新修改的文​​档时保证原子修改。由于变化是串行和原子的实例1将有A-> B-> C和实例2将有A-> B-> C-> d

干杯

+0

不幸的是我需要在find和modify命令之间做一些处理,所以看起来使用这个mongo API是不可能的。 – johncch

0

如果你正在做的是增加新元素添加到列表中,您可以使用Redis列表并在添加的每个值中包含时间。该列表可能在redis上未排序,但应在检索时快速排序。

相关问题