Haskell で単純なアクター モデルを試しています。各アクターは次のとおりです。
- Haskellスレッドです
- メッセージを受信する zeroMQ PULL ソケットがある
一部のアクターは「既知」であり、有効期間が無期限であるため、ソケットが既知のポートにバインドされています。他のアクターは存続期間が短く一時的なものであるため、ランダムな空きポートを割り当てる必要があります。
http://api.zeromq.org/3-2:zmq-tcpで説明されているように、一時ポートへのバインドを許可する zmq3 の機能を以前は知りませんでした。
したがって、一時的なアクターの場合、現在、特定の範囲内の空きポートにバインドしようとするコードがあります。これは意図したとおりに機能しますが、問題を引き起こす zmq の動作が明らかになります。一時的なアクターがポートを閉じて終了し、新しい一時的なアクターが開始すると、古いものと同じポートにバインドされる可能性があります。この状況では、古いアクターのためにキューに入れられた未処理または後続のメッセージはすべて、新しいアクターによって受信されます。
どうすればこれを回避できますか?
ワイルドカードを使用して一時的なアクター ソケットをバインドし、システムに割り当てられたエフェメラル ポートを取得した場合でも、この問題が発生する可能性はありますか?
他とは異なることが保証されている TCP トランスポートを使用して、新しい一意の PULL ソケットを生成するにはどうすればよいですか?