2016-12-26 109 views
0

有3台机器和一个发布者,两个消费者。 我正在使用golang将订单发布到某台机器。 而这台机器是用python作为消费者。 我想知道如何获得订单在发布者中完成或失败的结果。如何在beanstalkd中使用回调?

如果订单不属于机器,我该怎么办? 发布还是埋葬?

蟒蛇: 消费者:

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

让出版商知道作业的状态正确的方法是使用回调

随着工作让发布者放置回调URL(队列或http),并且在作业成功或失败时,消费者可以向s发送状态消息tatus回拨

,所以任务结构可织机像

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

上述结构的JSON strng将是作业body.The消费者会得到CallbackURL,并senbd状态到该网址

试图解释为reqiuested细节

我们叫producerconsumer(s)masterworkers(s)

  1. 当过一份工作,请高手将创建一个job object具有

    • 作业ID(A独特的价值,以确定德作业)
    • RequestBody(作业的细节)
    • StatusCallbackURL(工作人员用工作状态打的URL)
  2. On e的工作人员在听队列reserve这份工作,那里有买得卖的我会试试做这份工作

  3. 解码json并得到工作细节。现在从队列中没有工作
  4. 在成功delete工作和发送状态的CallbackURL
  5. 失败时,如果非临时故障发送状态为
  6. 如果临时故障而什么都不做的失败后到CallbackURL和delete工作在它的储备超时西港岛线进行重新排队

现在这个对象转换成JSON,放入队列

PS:不删除之前的工作成功完成。完成或永久失败只会删除工作

+0

Thinkyou为您提供帮助。您的意思是在同一台机器上设置发布者和消费者吗?因此,它可以是“发布B(消费者),然后B(发布者)发布A“? – haroldT

+0

不需要在同一台机器上。我们称之为'master'(发行人)和'workers'(消费者)。当主人要求工人做某件事时,任何一个工人都可能拥有这项工作,并且在完成时它必须让主人知道它已经完成了,为此目的,主人可以在作业请求中附上一个“callbaclurl”。 –

+0

谢谢你的解释,所以在beanstalk(golang)或beanstalkc(python)中找不到任何函数。我真的很迷惑。 – haroldT