【发布时间】:2016-08-07 10:07:55
【问题描述】:
我正在处理大量包裹以进行跟踪。我有 mongodb,其中每个用户都有不同的包裹。有超过 20 家公司(tnt,fedex,dhl 等),每家公司只允许单次跟踪或有限制的批量跟踪(例如 tnt=1、fedex=20 和 dhl=10)
我正在尝试找到一种方法来对有效使用批处理的跟踪作业进行排队。例如,如果我总共有 50 个fedex 工作、3 个 tnt 工作和 11 个 dhl 工作,我想像下面这样对它们进行排队
[fedex job:[20 jobs]][fedex job:[20 jobs]][fedex job:[10 jobs]]
[tnt job:[1 job]][tnt job:[1 job]][tnt job:[1 job]]
[dhl job:[10 job]][dhl job:[1 job]]
我怎样才能实现上述工作场景?
编辑
我希望能够在 beanstalkd 上与一个或多个工作人员一起运行它。因此独立状态非常重要。 Beanstalkd 作业应如下所示,
{
'slug':'fedex'
'trackingNumbers':[11,22,33....] //20
}
{
'slug':'tnt'
'trackingNumbers':[11,22,33....] //10
}
{
'slug':'dhl'
'trackingNumbers':[11] //1
}
{
'slug':'tnt'
'trackingNumbers':[11,22,33....] //10
}
{
'slug':'fedex'
'trackingNumbers':[11,22,33....] //20
},
{
'slug':'dhl'
'trackingNumbers':[11] //1
}
我真的不知道是否有一个 MongoDB 函数可以将每个用户的包裹聚合到上述块。
这是我的猫鼬模型
var UserSchema = mongoose.Schema({
email: {type: String, index: {unique: true, sparse: true}},
password: String,
createdOn: {type: Date, default:Date.now },
purchaseDate:Date,
expiryDate:Date,
purchaseID: {type: String, index: {unique: true, sparse: true}},
isEnabled: {type: Boolean,default: true}
});
UserSchema.virtual('parcels',{
ref: 'Parcel',
localField:'_id',
foreignField:'owner'
});
var ParcelSchema = mongoose.Schema({
owner : { type:mongoose.Schema.Types.ObjectId, ref: 'User' },
dna:String,
name: String,
count: {type: Number, default: 1},
trackingNumber: String,
slug:String,
isDelivered: {
type: Boolean, default: false
},
startDate: {type: Date, default:Date.now },
updateDate: Date,
finishDate: Date,
expectedDate: Date,
extra:String,
details:[{
_id:false,
message: String,
location: String,
date: Date,
status: Number
}]
});
【问题讨论】:
-
据我了解,您只需要将作业总数除以限制,四舍五入到最接近的整数(例如 ceil(50/20)=3)即可获得批次数,然后填满所有批次,除了最后一批......
-
如果我将它们放在单个存储桶中,我在划分工作时不会遇到问题。想象一下,有成千上万的用户拥有数百万个工作。问题是工作分布在用户之间,我不知道如何从多个用户那里获得这些工作并进行划分。我无法找到有效批处理作业的解决方案。
-
我看不出“beanstalkd”对你有什么帮助。您需要一种固定的线程池调度程序(Java 中的术语),而选择显然取决于您使用的编程语言。
-
Beanstalk 将帮助我解决以下问题。在我对作业进行排队后,a) 我可以从不同的机器上运行多个工人,b) 如果我无法访问网站,我可以重试作业(bury,retry) c) 如果作业多次失败,我可以删除作业等等。我的问题是如何从不同用户那里获取跟踪作业并将其推送到队列中。
-
所以你想要一个分布式状态?这是一个完全不同的要求,你不觉得吗?
标签: algorithm mongoose beanstalkd