Я обрабатываю огромное количество посылок для отслеживания. У меня есть mongodb, в котором у каждого пользователя есть разные посылки. Существует более 20 компаний (tnt, fedex, dhl и т. Д.), И каждая компания допускает только одно отслеживание или пакетное отслеживание с ограничением (например, tnt = 1, fedex = 20 и dhl = 10)Алгоритм для beanstalkd queue
Я пытаюсь найти способ поставить в очередь задания отслеживания, которые эффективно используют пакетную обработку. Например, если у меня есть общее количество рабочих мест 50 FEDex, 3 рабочих мест тротила и 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]]
Как я могу добиться выше сценария работы?
EDIT
Я хочу, чтобы иметь возможность запускать это на 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 агрегировать посылки каждого пользователя на эти куски.
Вот мои Mongoose Модели
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), чтобы получить количество партий, а затем заполнить все партии, за исключением, может быть, последнего ... –
I не имеют проблем с разделением заданий, если бы я их в одном ковше. Представьте, что тысячи пользователей имеют миллионы рабочих мест. Дело в том, что рабочие места распределяются среди пользователей, я не знаю, как получить эти задания от нескольких пользователей и разделить. Я не могу найти решение для эффективной загрузки заданий. – Meanteacher
Я не вижу, как «beanstalkd» поможет вам. Вам нужен некий фиксированный планировщик пула потоков (термин из Java), и выбор, очевидно, зависит от языка программирования, который вы используете. –