チャネルの待ち受けについて
複数のジョブフローにて、同じチャネルオブジェクトを待ち受けすることは何か弊害がありますでしょうか?
(タイミングによって、メッセージ取り出しに失敗したり、同じものを重複して取り出すなど)
-
正式なコメント
フィックスポイントの高橋です。
複数のジョブフロー(正しくは複数のプロセス)が同じチャネルオブジェクトを待ち受けることはできます。この場合、基本的には先に待ち受けた(イベントジョブを開始した)プロセスがメッセージを受け取ることになります。ただし、イベントジョブでガード式を指定している場合は、パターンにマッチしたイベントジョブがメッセージを受け取るので、この限りではありません(先に待ち受けたイベントのガード式にマッチせず、後に待ち受けたイベントジョブが受け取る場合があります)。
Kompira の機能として、1つのプロセスで複数のチャネルを待ち受けることや、1つのチャネルを複数のプロセスで待ち受けることは出来ますが、動作としては複雑になりがちですので、注意深く実装および動作確認していただく必要はあるかもしれません。
以下は補足になります。
通常のイベントジョブでは「同じものを重複して取り出す」ことはありませんが、イベントジョブで v1.6.7 で導入された peek_mode=true を指定している場合は注意が必要です。peek_mode=true を指定してイベントジョブを実行すると、チャネルのメッセージキューからメッセージを削除せずに受信したメッセージを参照することができます。これは複数のプロセスが同じキューに対して peek_mode=true を指定したイベントジョブを呼び出すと、複数のプロセスが同じメッセージを参照できることを意味します。(なお、peek_mode はその後にIDをもとにチャネルからメッセージを削除する使い方を想定しています。複数プロセスが同じメッセージを参照した場合にはどのプロセスが削除するのかという問題があり、複数プロセスでの利用には注意が必要です)
参考になさってください。
コメントアクション
サインインしてコメントを残してください。
コメント
2件のコメント