2016-08-07 3 views
0

Я обрабатываю огромное количество посылок для отслеживания. У меня есть 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 
    }] 
}); 
+0

Из того, что я вас понял просто нужно разделить общее число заданий до предела, округлить до ближайшего целого (например, ceil (50/20) = 3), чтобы получить количество партий, а затем заполнить все партии, за исключением, может быть, последнего ... –

+0

I не имеют проблем с разделением заданий, если бы я их в одном ковше. Представьте, что тысячи пользователей имеют миллионы рабочих мест. Дело в том, что рабочие места распределяются среди пользователей, я не знаю, как получить эти задания от нескольких пользователей и разделить. Я не могу найти решение для эффективной загрузки заданий. – Meanteacher

+0

Я не вижу, как «beanstalkd» поможет вам. Вам нужен некий фиксированный планировщик пула потоков (термин из Java), и выбор, очевидно, зависит от языка программирования, который вы используете. –

ответ

1

Вот это предложение. Вы могли бы сделать следующее:

  • есть труба в компании доставки, например. fedex, dhl и т.д.
  • еще один работник прилагается только один очереди (но вы можете иметь столько же рабочий, как вы хотели бы)
  • каждый работник должен использовать stats-tube <tube> команды Beanstalkd перед reserve. stats-tube возвращает число в настоящее время зарезервированных заданий в этой очереди (поле current-jobs-reserved в YAML выводе команды)
  • так что ваш работник делает, что он не нарушает SLA для очереди он обрабатывает
+0

Спасибо за ответ. Я пытаюсь получить работу, чтобы разрешить говорить с MongoDb по свойствам компании. Трубка Fedex должна быть заполнена заданиями, которые должны содержать 20 идентификационных номеров внутри. Таким образом, я могу работать независимо друг от друга, и я могу обрабатывать 20 номеров отслеживания.Если я правильно вас понимаю, вы постоянно говорите мне о статистической трубке, и когда она достигает, 20 резервных 20 рабочих мест, но будет очень сложно зарезервировать 20 рабочих мест, если бы 5 рабочих разрешили наблюдать за одной и той же трубкой Fedex. – Meanteacher

Смежные вопросы