如何解决使用 MongoDB 的预订系统中的双重预订
我一直在使用 node、express 和 MongoDb (mongoose) 构建预订系统。我的约会模式:
const appointmentSchema = mongoose.Schema({
date: Date,freeSlots: Number,reservations: [{type: mongoose.Types.ObjectId,ref: 'Reservation'}],event: mongoose.Types.ObjectId,});
我的主要想法是进行原子更新以确保预订时不会发生错误。
updateAppointment(date,eventId,newReservation.id).then(
async (updateResult) => {
if (updateResult.nModified === 1) // Continue my logic
})
这是我的辅助方法:
const updateAppointment = (date,newOrder) => {
return Appointment.updateOne(
{
date: {$eq: date},freeSlots: {$gt: 0},event: eventId,},{$inc: {freeSlots: -1},$push: {reservations: newOrder}}
);
};
在每次预订时,我都会减少 freeSlots 并将预订推送到预订数组。但是,我可以看到在某些约会中,保留的数量超出了允许范围。我相信如果发生这种情况,那么 freeSlots 应该是一个负数。怎么显示为0?下面是一个创建的约会示例,其中只有 5 个空闲时段,但一段时间后它包含 8 个预订!
{"_id":{"$oid":"5fd589c508949f73c0118220"},"reservations":[{"$oid":"5fd7c95357fb0bae178f990e"},{"$oid":"5fd8152682279bb3d43ce201"},{"$oid":"5fd8178782279bb3d43ce203"},{"$oid":"5fdb7ba43a6b35e4e7907d1f"},{"$oid":"5fdba7063a6b35e4e7907d54"},{"$oid":"5fdceff13a6b35e4e7907dea"},{"$oid":"5fdcf6133a6b35e4e7907df2"},{"$oid":"5fdcf6ec3a6b35e4e7907df3"}],"date":{"$date":"2020-12-19T10:00:00.000Z"},"freeSlots":0,"event":{"$oid":"5fce5a80a0f1ee45d9aa04e1"},"__v":0}
我已经使用 Apache Jmeter 测试了端点,其中有 2 个组,每个组有 25 个线程,但它没有给我超过允许的数量!谁能弄清楚为什么它对我有用而对真实用户却不是?
编辑: 在修改了复制的概念之后,写和读的问题。我认为问题是因为 MongoDB Atlas 添加了 3 个副本,而我没有管理这些写操作将如何发生。使用 Quorum Consensus concept 后,我的问题已解决或停止发生!这个解决方案解释了为什么 Apache Jmeter 没有重现相同的错误,因为我是在我的本地机器上测试(没有副本)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。