具有单个数据库的多个节点实例
我目前正在编写一个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之一:
-
使用标志在MongoDB中实现我自己的事务。 客户端对lockvariables执行findAndModify,如果成功,则执行操作。 如果不成功,客户端在一定的超时后重试。
-
使用Redis事务和pubsub实现相同的效果。 我不确定如何做到这一点,但听起来似乎是可能的。
-
实施某种智能负载均衡。 如果多个客户端在同一个项目上运行,请将它们路由到同一个实例。 由于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。