3

Pheanstalk を PHP ジョブの基本クラスにラップしようとしています。リザーブと遅延機能を備えたリザーブをテストしていますが、最初のインスタンスがジョブを解放したり、TTR がタイムアウトしたりすることなく、基本クラスの 2 番目のインスタンスからジョブを予約できることがわかりました。これはまさにジョブ キューが防ぐべきものだと思っていたので、これは予想外です。最初のプットと最初のリザーブの beanstalkd コマンドとタイムスタンプを以下に示します。最後に stats-job リクエストも行います。

01:40:15: Sending command: use QueuedCoreEvent
01:40:15: Got response: USING QueuedCoreEvent

01:40:15: Sending command: put 1024 0 300 233
a:4:{s:9:"eventName";s:21:"ReQueueJob_eawu7xr9bi";s:6:"params";a:2:{s:12:"InstanceName";s:21:"ReQueueJob_eawu7xr9bi";s:17:"aValueToIncrement";i:123456;}s:9:"behaviors";a:1:{i:0;s:22:"BehMCoreEventTestDummy";}s:12:"failureCount";i:0;}
01:40:15: Got response: INSERTED 10

01:40:15: Sending command: watch QueuedCoreEvent
01:40:15: Got response: WATCHING 2

01:40:15: Sending command: ignore default
01:40:15: Got response: WATCHING 1

01:40:15: Sending command: reserve-with-timeout 0
01:40:15: Got response: RESERVED 10 233
01:40:15: Data: a:4:{s:9:"eventName";s:21:"ReQueueJob_eawu7xr9bi";s:6:"params";a:2:{s:12:"InstanceName";s:21:"ReQueueJob_eawu7xr9bi";s:17:"aValueToIncrement";i:123456;}s:9:"behaviors";a:1:{i:0;s:22:"BehMCoreEventTestDummy";}s:12:"failureCount";i:0;}

01:40:15: Sending command: stats-job 10
01:40:15: Got response: OK 162
01:40:15: Data: ---
id: 10
tube: QueuedCoreEvent
state: reserved
pri: 1024
age: 0
delay: 0
ttr: 300
time-left: 299
file: 0
reserves: 1
timeouts: 0
releases: 0
buries: 0
kicks: 0

ここまでは順調ですね。次に、基本クラスの 2 番目のインスタンスから別の予約を行い、続いて別の統計ジョブ リクエストを行います。タイム スタンプが 1 秒以内であり、設定した 300 秒の TTR にはほど遠いことに注意してください。また、この 2 番目の stats-job の出力では、タイムアウトが 0 でリリースが 0 のこのジョブの予約が 2 つあることに注意してください。

01:40:15: Sending command: watch QueuedCoreEvent
01:40:15: Got response: WATCHING 2

01:40:15: Sending command: ignore default
01:40:15: Got response: WATCHING 1

01:40:15: Sending command: reserve-with-timeout 0
01:40:15: Got response: RESERVED 10 233
01:40:15: Data: a:4:{s:9:"eventName";s:21:"ReQueueJob_eawu7xr9bi";s:6:"params";a:2:{s:12:"InstanceName";s:21:"ReQueueJob_eawu7xr9bi";s:17:"aValueToIncrement";i:123456;}s:9:"behaviors";a:1:{i:0;s:22:"BehMCoreEventTestDummy";}s:12:"failureCount";i:0;}

01:40:15: Sending command: stats-job 10
01:40:15: Got response: OK 162
01:40:15: Data: ---
id: 10
tube: QueuedCoreEvent
state: reserved
pri: 1024
age: 0
delay: 0
ttr: 300
time-left: 299
file: 0
reserves: 2
timeouts: 0
releases: 0
buries: 0
kicks: 0

私が間違っているかもしれないことについて誰にもアイデアがありますか? 一度に 1 人のワーカーだけがジョブにアクセスできるようにキューに伝えるために何かしなければならないことはありますか? beanstalkd とのセッションを終了すると思われるキューからジョブを取得するとすぐに、pheanstalk インスタンスで「設定解除」を行っています。これにより、Beanstalkd がワーカーが停止したと判断し、タイムアウトなしでジョブを自動的に解放する可能性がありますか? ワーカーの状態を判断するために、beanstalkd がセッション状態にどの程度依存しているかはわかりません。私は、セッションを問題なく開いたり閉じたりできると思っていました。また、Beanstalkd がジョブ操作を結び付けるために気にかけているのはそのジョブ ID だけでしたが、それは私の側では愚かだったかもしれません...これは、ジョブ キューへの私の最初の進出です.

ありがとう!

4

2 に答える 2

2

私の推測では、最初のクライアント インスタンスは、2 番目のクライアント インスタンスがジョブを予約する前に、beanstalkd サーバーへの TCP ソケットを閉じました。

TCP 接続を閉じると、暗黙的にジョブが解放されてキューに戻されます。これらの暗黙的な解放 (接続のクローズ、コマンドなど) は、カウンターquitをインクリメントしていないようです。releases

次に例を示します。

# Create a job, reserve it, close the connection:
pda@paulbookpro ~ > telnet 0 11300
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
put 0 0 600 5
hello
INSERTED 1
reserve
RESERVED 1 5
hello
^]
telnet> close
Connection closed.

# Reserve the job, stats-job shows two reserves, zero releases.
# Use 'quit' command to close connection.
pda@paulbookpro ~ > telnet 0 11300
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
reserve
RESERVED 1 5
hello
stats-job 1
OK 151
---
id: 1
tube: default
state: reserved
pri: 0
age: 33
delay: 0
ttr: 600
time-left: 593
file: 0
reserves: 2
timeouts: 0
releases: 0
buries: 0
kicks: 0

quit
Connection closed by foreign host.

# Reserve the job, stats-job still shows zero releases.
# Explicitly release the job, stats-job shows one release.
pda@paulbookpro ~ > telnet 0 11300
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
reserve
RESERVED 1 5
hello
stats-job 1
OK 151
---
id: 1
tube: default
state: reserved
pri: 0
age: 46
delay: 0
ttr: 600
time-left: 597
file: 0
reserves: 3
timeouts: 0
releases: 0
buries: 0
kicks: 0

release 1 0 0
RELEASED
stats-job 1
OK 146
---
id: 1
tube: default
state: ready
pri: 0
age: 68
delay: 0
ttr: 600
time-left: 0
file: 0
reserves: 3
timeouts: 0
releases: 1
buries: 0
kicks: 0

quit
Connection closed by foreign host.
于 2013-04-01T21:55:40.620 に答える