1

MessageConsumerHTTP 呼び出し、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_messageAmazon 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 に切り替える必要があるかもしれません。しかし興味深いことに、この問題はあまり一般的ではないので、私の実装に問題があるのではないかと思います。

何か案は?

4

1 に答える 1