beanstalkd中如何使用回调?

how to use callback in beanstalkd ?

有 3 台机器和一个发布者,两个消费者。 我正在使用 golang 向某台机器发布订单。 并且机器使用python作为消费者。 我想知道如何在发布者中得到订单完成或失败的结果。

如果订单不属于机器一,我该怎么办? 释放还是掩埋?

python: 消费者:

import beanstalkc

def get_beanstalk_data(conf):
    beanstalk = beanstalkc.Connection(host='127.0.0.1',port=11300)
    beanstalk.use('cloud')
    beanstalk.watch('cloud')
    beanstalk.ignore('default')
    job = beanstalk.reserve()

    if job.body == "one":  #job.body == "two"
        #TODO
        job.delete()
        return job.body
    else:
        #TODO    what should I do in here, because there is two consumer and get different orders

while True:
    data = get_beanstalk_data(conf)
    print data

戈朗: 发布:

package main

import (
    "fmt"
    "github.com/kr/beanstalk"
    "time"
)

func main() {
    c, err := beanstalk.Dial("tcp", "127.0.0.1:11300")
    id, err := c.Put([]byte("hello"), 1, 0, 120*time.Second)

    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(id)
}

让发布者了解作业状态的正确方法是使用回调

使用作业让发布者放置一个回调url(一个队列或http)并且在作业成功或失败时消费者可以向状态回调发送状态消息

所以工作结构可能会像

//JobRequest has the struct storing request name and body
type JobRequest struct {
        ID              string
        RequestBody     []byte
        CallbackURL  *string
}

上述结构的 json strng 将是工作 body.The 消费者将获得 CallbackURL 并将状态发送到 url

正在按要求详细解释

让我们调用 producerconsumer(s) masterworkers(s)

  1. 当有工作可用时,master 会创建一个 job object,其中有

    • 职位编号(识别职位的唯一值)
    • RequestBody(作业的详细信息)
    • StatusCallbackURL(URL 工作人员会点击工作状态)
  2. 其中一名听队列的工人reserve这份工作,有人告诉我会尝试做这份工作

  3. 解码 json 并获取作业详细信息。现在执行作业
  4. 成功时delete作业从队列中发送到回调URL
  5. 如果非临时性失败,则将失败状态发送给回调URL 和delete 作业
  6. 如果临时失败什么也不做,因为在保留超时后它将被重新排队

现在这个对象被转换为json并放入队列

PS: 在成功完成之前不要删除作业。在完成或永久失败时只删除作业