0

3 つのマシンと 1 つのパブリッシャー、2 つのコンシューマーがあります。私はgolangを使って注文をいくつかのマシンに公開しています。そして、マシンはPythonを使用して消費者になります。パブリッシャーで注文が完了または失敗したという結果を得るにはどうすればよいか知りたいです。

注文がマシン 1 に属していない場合、どうすればよいですか? 解放するか埋めますか?

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 文字列がジョブの本文になります。コンシューマは を取得し、CallbackURLその URL にステータスを送信します。

要求された詳細を説明しようとしている

producerandconsumer(s) masterと を呼び出しましょうworkers(s)

  1. ジョブが利用可能なときはいつでも、マスターjob object

    • ジョブID(ジョブを識別する一意の値)
    • RequestBody (ジョブの詳細)
    • StatusCallbackURL (ワーカーがジョブ ステータスでヒットする URL)
  2. reserve仕事の待ち行列を聞いている労働者の 1 人が、この仕事をしようと言っています。

  3. json をデコードし、ジョブの詳細を取得します。
  4. 成功deleteするとキューからジョブが送信され、ステータスが CallbackURL に送信されます
  5. 一時的ではない失敗の場合、失敗時にステータスが失敗として CallbackURL とdeleteジョブに送信されます
  6. 一時的な障害が発生した場合、リザーブのタイムアウト後に再キューイングされるため、何もしません。

これで、このオブジェクトは json に変換され、キューに入れられます

PS:正常に完了する前にジョブを削除しないでください。完了時または永続的な失敗時にのみ、ジョブを削除してください。

于 2016-12-26T06:03:39.837 に答える