如何在beanstalkd中使用回调?

时间:2016-12-26 03:18:40

标签: python go beanstalkd beanstalkc

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

如果订单不属于机器1,我该怎么办? 释放或埋葬它?

蟒:     消费者:

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

golang:     发布:

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)
}

1 个答案:

答案 0 :(得分:1)

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

通过作业让发布者放置回调网址(队列或http),并且在作业成功或失败时,消费者可以向状态回调发送状态消息

所以工作结构可能就像

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

上述结构的json strng将成为工作主体。消费者将得到CallbackURL并将senbd状态发送到该网址

尝试解释为重新评估的细节

让我们致电producerconsumer(s) master以及workers(s)

  1. 当有工作可用时,主人会创建一个job object

    • 工作ID(识别工作的唯一值)
    • RequestBody(工作细节)
    • StatusCallbackURL(工作人员将以作业状态点击的URL)
  2. 其中一名工作人员正在聆听reserve这份工作的队列,有人说我会尝试

  3. 解码json并获取作业详细信息。现在没有工作
  4. 成功delete作业从队列和发送状态到CallbackURL
  5. 如果非临时故障将失败状态发送至CallbackURL且delete作业
  6. ,则失败
  7. 如果临时故障不做任何事情,因为保留超时后将重新排队
  8. 现在这个对象被转换为json并放入队列

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