问题描述
我一直在使用 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 (将#修改为@)