2016-04-08 18 views
1

私はSinatra-JRubyアプリケーションを開発しており、同時API呼び出しがAPIレイヤーに来てからサービスとアダプタレイヤーで処理される状況を処理しています。共通の情報を共有するGlobalServiceモジュールを持っているので、他のどのレイヤーからでもこの共通の情報にアクセスできます。これは、同時呼び出しが来て以前のAPIの値をリセットするまでうまく動作します。私はこの問題に取り組むためにMutexを実装しましたが、これは問題への正しいアプローチではないと感じています。ここに私が実装したものがあります:JRubyでの並行処理

require 'thread' 

module GlobalService 
    @@mutex = Mutex.new 

    def self.set_header(auth_subject, transaction_id) 
     @@mutex.synchronize { 
      @auth_subject = auth_subject 
      @transaction_id = transaction_id 
     } 
    end 

    def self.get_header 
     @@mutex.synchronize { 
      return @auth_subject, @transaction_id 
     } 
    end 
end 

この問題を解決するための代替ソリューションを教えてください。

答えて

0

メモリを共有することは決してスレッドセーフではありません。したがって、メッセージパッシング戦略を使用するとよいでしょう。これに対する私の好みは、俳優を作り、州の変化について彼らに伝えることです。同時ルビーの俳優http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Actor.htmlをチェックしてください。

あなたは

require 'concurrent' 

class GlobalService < Concurrent::Actor::Context 

    def initialize(auth_subject, transaction_id) 
    @auth_subject = auth_subject 
    @transaction_id = transaction_id 
    end 

    def on_message(message) 
    #some logic 
    @auth_subject = message.auth_subject 
    @transaction_id = message.transaction_id 
    end 
end 

サービス= GlobalService.spawnような何か行うことができます(:最初に、 "ヘッダ..."、ID) などを...

私はこの戦略を使用しました過去とそれはかなりうまくいきました。 https://gitter.im/ruby-concurrency/concurrent-rubyで助けを求めることもできます。Pitrchは通常とても役に立ちます!