0

有 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

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

1 回答 1

1

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

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

所以工作结构可能会像

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

上述结构的 json 字符串将是作业主体。消费者将获得该CallbackURLurl 并将 senbd 状态

试图解释为要求的细节

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

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

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

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

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

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

于 2016-12-26T06:03:39.837 回答