2016-12-26 66 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