dRubyというRubyのスタンダードライブラリにあるプロセス間の通信を可能にするものがあります。
これを使って、バックエンドジョブのGemを今作っています。
用途としては主にRedis, PostgreSQLが使えない、純粋にRuby, SQLiteだけを使う場合に使えるものとして作っています。
(まだちゃんと使えるものではないですが。。。)
ちょっと試しているときに、DRb::DRbUnknown
というエラーに遭遇しました。
以下のようなコードでした。
$ bundle exec belated # Belatedのプロセスを起動
Railsのコンソールのなか:
class Hello
def perform
puts 'hello world'
end
end
client = Belated::Client.new
client.perform_belated(Hello.new)
これでDRb::DRbUnknown
というエラーになりましたが、原因はBelatedの方はこのコードにアクセスできていないからです。Railsのコンソールで新しく定義したクラスだからですが、ここでこのオブジェクトに対してreload
を実行して、定義されているかどうかを試すこともできるみたいです。
考えてみれば当たり前ですが、普段一つのプロセスの中でしか動いていないプログラムを書いているとなかなかここまで考えないですね。
Sidekiqのコードを読むと、Reloaderというクラスにも遭遇しますので、そこも開発環境の考慮が入っているみたいです。
詳細はこちらで確認できます:
https://docs.ruby-lang.org/ja/latest/class/DRb=3a=3aDRbUnknown.html