具有单个数据库的多个节点实例

我目前正在编写一个Node应用程序,我正在考虑缩放。 据我所知,水平缩放是扩展应用程序以处理更多并发请求的更简单的方法之一。 我的工作副本目前在后端使用MongoDb。

我的问题是这样的:我有一个类似于链接列表的数据结构,需要严格维护订单。 我的(假想的)关注点是,当通过多个节点实例对数据库存在竞争条件时,链表的分辨率可能不正确。

举个例子:假设服务器有这个列表a-> b。 实例1进入对象c,实例2进入对象d。 可能存在竞争条件,其中两个实例读取a-> b并决定将其自己​​的对象追加到列表中。 实例1然后将其插入为a-> b-> c,而当数据库实际上包含a-> b-> c-> d时,实例2认为它是a-> b-> d。

一般来说,这听起来像是乐观locking的工作,然而,据我所知,MongoDB或Redis(我正在考虑的另一个数据库)都不是以SQL方式进行事务。

因此,我想像下面的解决scheme之一:

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

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

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

我肯定有一个更好,更优雅的方式来实现上述,我很乐意听到任何解决scheme或build议。 谢谢!

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

//更新(条件,值)

update({version:whateverYouReceivedWhenYouDidFind},newValue)

希望能帮助到你。 格斯

你需要mongodb上的findAndModify命令,它将保证primefaces修改,同时返回新修改的文​​档。 由于变化是连续的,primefaces实例1将具有a-> b-> c,并且实例2将具有a-> b-> c-> d

干杯

如果您所做的只是向列表中添加新元素,则可以使用Redis列表并将时间包含在您添加的每个值中。 该列表可能在redis上未sorting,但应在检索时快速sorting。