beanstalkd队列的算法

时间:2016-08-07 10:07:56

标签: algorithm mongoose beanstalkd

我正在处理大量的包裹以进行跟踪。我有mongodb,其中每个用户都有不同的包裹。有超过20家公司(tnt,fedex,dhl等),每家公司只允许单一跟踪或批量跟踪(例如tnt = 1,fedex = 20和dhl = 10)

我正在尝试找到一种方法来排队跟踪作业,从而有效地使用批处理。例如,如果我有50个联邦快递作业,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]]

我如何实现上述工作方案?

修改

我希望能够在一个或多个worker上运行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
    }]
});

1 个答案:

答案 0 :(得分:1)

这是一个建议。您可以执行以下操作:

  • 每个送货公司有一个管子,例如array:2 [▼ "folder1" => array:1 [▼ 2016 => array:4 [▼ "2" => array:1 [▶] "4" => array:2 [▶] "3" => array:4 [▶] "1" => array:4 [▶] ] ] ] fedex
  • 只有一个工作人员只有一个队列(但你可能有多少工人)
  • 每个工作人员都应该在dhl之前使用Beanstalkd的stats-tube <tube>命令。 reserve返回此队列中当前保留的作业数(命令的YAML输出中的字段stats-tube
  • 因此,您的工作人员确保它不会违反其处理的队列的SLA