【问题标题】:how to use callback in beanstalkd ?如何在 beanstalkd 中使用回调?
【发布时间】:2016-12-26 03:18:40
【问题描述】:

有 3 台机器和 1 个发布者,2 个消费者。 我正在使用 golang 将订单发布到某台机器。 并且机器使用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)
}

【问题讨论】:

    标签: python go beanstalkd beanstalkc


    【解决方案1】:

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

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

    所以工作结构可能会隐约可见

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

    上述结构的 json 字符串将是作业主体。消费者将获得 CallbackURL 并将状态发送到该 url

    试图解释为要求的详细信息

    让我们打电话给 producerconsumer(s) masterworkers(s)

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

      • 作业 ID(用于识别作业的唯一值)
      • RequestBody(作业的详细信息)
      • StatusCallbackURL(工作人员会点击作业状态的 URL)
    2. 其中一名工人正在听队列reserve 工作,告诉我会尝试做这项工作

    3. 解码 json 并获取作业详细信息。现在完成作业
    4. 成功时 delete 队列中的作业并将状态发送到 CallbackURL
    5. 如果非临时失败失败,则将失败状态发送到 CallbackURL 和 delete 作业
    6. 如果临时故障在保留超时后什么都不做,它将被重新排队

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

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

    【讨论】:

    • 想你的帮助。你的意思是在同一台机器上设置发布者和消费者?这样可以“A发布B(消费者)然后B(发布者)发布A”?跨度>
    • 不需要在同一台机器上。让我们打电话给master(发布者)和workers(消费者)。当主人要求工人做某事时,任何一个工人都可能拥有这项工作,完成后必须让主人知道它已经完成,为此,主人可以在工作请求中附上callbaclurl
    • 谢谢你的解释,所以我在 beanstalk(golang) 或 beanstalkc(python) 中找不到任何函数。我真的很困惑。
    • 这不是队列(或库)特定的东西。使用 beanstalk master 将推送工作主体为 json 的工作,例如 {"id":"Sasa", "job":"actualjob","callback":"http://example.com/status"} 。一个worker 执行reserve 获取作业解码json,现在它知道作业主体json.jobstatus callback 即json.callback。作业完成后,工作人员将在队列中为作业执行 delete 并将状态发送到回调 url
    • 更新了答案,请阅读。如果对您有帮助,请勾选已接受:D
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多