MessageConsumer
HTTP 呼び出し、CRUD Mongo/Redis、API 呼び出しなど、それぞれ異なる責任を持つ一連の worker があります。
それらは同じ構造を持っています:
class MessageConsumer
include Celluloid
def perform(sqs_message)
# Do something
end
end
そして、私は[worker-name].rb
そのようなもので各ワーカーのファイルを持っています:
Celluloid::Actor[:pool] = MessageConsumer.pool
while @still_running
sqs_message = @queue.receive_message(start_options)
if sqs_message
Celluloid::Actor[:pool].async.perform(sqs_message)
else
# sleep for a while as there's nothing in the queue.
sleep rand(2..6)
end
end
は@queue.receive_message
Amazon SQS からメッセージを受信し、メッセージを渡してワーカーを呼び出します。
各サーバーには、[worker-name].rb
実行中のセットがあります。
pgrep -fl ruby
14885 ruby bin/worker_http # two processes
15890 ruby bin/worker_http # ^^^
17956 ruby bin/worker_api
19734 ruby bin/worker_mongo
22637 ruby bin/worker_redis
問題:"No live threads left. Deadlock?"
プロセスをしばらく実行した後 (スレッドがビジー状態になった後) 頻繁に発生します。
サーバーで使用ruby 2.0.0p451 (2014-02-24 revision 45167) [x86_64-linux]
していますが、MRI に関連する問題かどうかはわかりません。JRuby に切り替える必要があるかもしれません。しかし興味深いことに、この問題はあまり一般的ではないので、私の実装に問題があるのではないかと思います。
何か案は?