【问题标题】:Algorithm for beanstalkd queuebeantalkd 队列算法
【发布时间】: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


【解决方案1】:

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

  • 每个快递公司都有一个管子,例如fedexdhl
  • 仅将一名工作人员附加到一个队列(但您可以拥有任意数量的工作人员)
  • 每个工人都应该在reserve 之前使用Beanstalkd 的stats-tube <tube> 命令。 stats-tube 返回此队列中当前保留的作业数(命令 YAML 输出中的字段 current-jobs-reserved
  • 因此您的工作人员确保其处理的队列不违反 SLA

【讨论】:

  • 感谢您的回复。我正在尝试根据公司的属性从 MongoDb 找工作。 Fedex 管必须装满工作,里面必须有 20 个跟踪号。通过这种方式,我可以独立运行工作人员,并且可以处理 20 个跟踪号。如果我理解正确,你告诉我 stats-tube 不断地当它达到时,20 保留 20 个工作,但如果有 5 名工人说看同一个联邦快递管,那么保留 20 个工作将非常困难。
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多