Sidekiqのコードに潜む愉快なメソッドたち


少し前にRails4.2のActiveJobのバックエンドについて調べました。

Resque、SidekiqからSucker PunchまでActiveJobのバックエンドについてひと通り調べてみた

このときSidekiqのコードを読んで、Celluloidによるアクターモデルで並行処理を実装していることを知りました。 ちょうどScalaやErlangでアクターを使う方法を調べていたところだったので興味がわき、Celluloidを利用したアプリケーションのサンプルとして読んでみることにしました。

その時見つけた愉快なメソッドを紹介します。

今回読んだSidekiqのバージョンは3.3.3です。

注意事項

  • 本エントリはSidekiqやアクターの解説記事ではありません。
  • 記事に機種依存文字が含まれています。
    • OSXのChromeとFirefox、iOSのSafariとChromeでのみ表示を確認しています。
    • iOSのブラウザではGithubから引用しているコードの一部が化けます。

Sidekiq::Queue#💣

SidekiqはRedisをバックエンドとしてジョブを管理・実行するプロダクトです。

Sidekiq::Queueはそのジョブキューを扱うためのクラスで、💣はキューをクリアするためのメソッドです。

もしも使うのであれば次のような字面になります。

require 'sidekiq/api'

queue = Sidekiq::Queue.new
queue.💣

このメソッドはSidekiq::Queue#clearのエイリアスとして、以下で定義されています。

https://github.com/mperham/sidekiq/blob/v3.3.3/lib/sidekiq/api.rb#L246-L254

なかなかハジけたメソッド名ですよね。

なおSidekiq::SortedSetにも同様のメソッドがあります。

Sidekiq::CLI#☠

exitのエイリアスとして定義されています。

https://github.com/mperham/sidekiq/blob/v3.3.3/lib/sidekiq/cli.rb#L205

exitはSidekiq::CLIには定義されていないので、この場合Kernel.exitが実行されます。

exitは由緒正しいメソッド名ですが、実行すればこのプロセスは死ぬわけですから、dieの方がより率直に動作を表現していると言えます。 ただ、まで行くと毒薬かもしれないし海賊かもしれないため意図が曖昧になっており、好ましくないと思います。

Sidekiq::Manager#❤

なんとSidekiq::Manager#heatbeatの中で実際に使われています。

https://github.com/mperham/sidekiq/blob/v3.3.3/lib/sidekiq/manager.rb#L137-L148

サービスインしたあとでこんな実装が動いているのを知ってしまったら、胸がドキドキするかもしれませんね。

Sidekiq.❨╯°□°❩╯︵┻━┻

さて、このメソッドは何のためのメソッドなのでしょうか。 実行すると下記のメッセージが表示されます。

"Calm down, bro"

意訳すると、まあまあ兄さん落ち着いて、というところでしょうか。

このメソッドにはRSpecで書かれた単体テストがあります。

https://github.com/mperham/sidekiq/blob/v3.3.3/test/test_sidekiq.rb#L28-L36
※iOSで見ると一部文字化けすると思います。

どうやらこのメソッドは、怒れるプログラマが感情的な仕草を表現できるようにしつつ、その気持ちを宥めるために作られたメソッドのようです。

まとめ

4つの愉快なメソッドを紹介しました。

  • Sidekiq::Queue#💣
  • Sidekiq::CLI#☠
  • Sidekiq::Manager#❤
  • Sidekiq.❨╯°□°❩╯︵┻━┻

これらのうち、実際に内部で使われているのはSidekiq::Manager#❤だけです。

SidekiqはCOVERALLSというサービスでコミットごとにテストを実行してカバレッジ計測をしており、今日時点のカバレッジは85.67%です。 Sidekiq::Manager#❤についてもテストで最低一度は実行していることが確認されています。

https://coveralls.io/builds/2264006/source?filename=lib%2Fsidekiq%2Fmanager.rb#L137

Sidekiq::Queue#💣Sidekiq::CLI#☠ はただのエイリアスで、内部では一度も使用されていません。 Sidekiq.❨╯°□°❩╯︵┻━┻ はジョークメソッドで内部でも使われていませんが、テストはちゃんと書かれていました。

絵文字について

💣 はUnicode6.0で追加された携帯電話の絵文字で、いわゆる機種依存文字です。海外でもemojiと呼ぶようです。

Standardized Variants

も機種依存文字ですが、上の2つに比べると古い文字のようですね。

常識的に考えると絵文字でコード書くなんて論外という方がほとんどだと思います(それでもSidekiqは素晴らしいソフトウェアだと思います)。

ただ、このたびあえて先入観を捨ててその可能性を検討してみた結果、下記の気づきがありました。

  • Githubの検索フォームで 💣 はヒットするけど はヒットしない。
  • Google検索では 💣 もヒットしない。
  • 似たような文字がいっぱいある。 とか とかとか。
  • 同じUnicodeの文字でもフォント次第で大幅に見た目が変わり得る。
  • 当然だけど機種依存文字は端末によっては表示することができないことがある。

少なくとも検索性がかなり悪くなるということがわかりましたので、個人的には絵文字でコード書くのは避けようと思います。

アクターの話はまた今度気が向いたら書きます。

なお私はどちらかというとResqueの方が好きです。