如何在beanstalkd中使用回调?
问题描述:
有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)
}
答
让出版商知道作业的状态正确的方法是使用回调
随着工作让发布者放置回调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细节
我们叫producer
和consumer(s)
master
和workers(s)
。
-
当过一份工作,请高手将创建一个
job object
具有- 作业ID(A独特的价值,以确定德作业)
- RequestBody(作业的细节)
- StatusCallbackURL(工作人员用工作状态打的URL)
On e的工作人员在听队列
reserve
这份工作,那里有买得卖的我会试试做这份工作- 解码json并得到工作细节。现在从队列中没有工作
- 在成功
delete
工作和发送状态的CallbackURL - 失败时,如果非临时故障发送状态为
- 如果临时故障而什么都不做的失败后到CallbackURL和
delete
工作在它的储备超时西港岛线进行重新排队
现在这个对象转换成JSON,放入队列
PS:不删除之前的工作成功完成。完成或永久失败只会删除工作
Thinkyou为您提供帮助。您的意思是在同一台机器上设置发布者和消费者吗?因此,它可以是“发布B(消费者),然后B(发布者)发布A“? – haroldT
不需要在同一台机器上。我们称之为'master'(发行人)和'workers'(消费者)。当主人要求工人做某件事时,任何一个工人都可能拥有这项工作,并且在完成时它必须让主人知道它已经完成了,为此目的,主人可以在作业请求中附上一个“callbaclurl”。 –
谢谢你的解释,所以在beanstalk(golang)或beanstalkc(python)中找不到任何函数。我真的很迷惑。 – haroldT