← All posts

by Sampo Kuokkanen

User avatar
Sampo Kuokkanen
Rails
2022-01-09
新しいRails 7アプリ作成したら、AnyCableでWebSocketを賢く使おう!

ActionCableからAnyCableへ

まず、RailsはデフォルトでActionCableというものが入っていて、 それでWebSocketが使えて、チャンネルなど、インタラクティブな要素にもってこいです。

ActionCableの問題点

Rubyという言語は同時処理には弱い言語ではあります。最近よくなっている分野でも ありますが、Go, Elixirなどと比べると劣るところはあります。 その代わり、書きやすい・読みやすい言語でもあるので、開発スピードの速さは魅力的です。

なので、一番いいのはRubyはそのまま使って、ActionCableという負荷が高いところを AnyCableにして、WebSocketのところだけGoベースのもににします。

# Gemfile
gem "anycable-rails"

というGemをGemfileに追加しましょう。 この段階でアダプターでRedisを使うようにするのは、RailsアプリではどうしてもRedisを使いたくなるような ことがこのあとも出てくるからです。例えばセッションはやはりRedisに入れた方が簡単な場合も多いです。

。。。と書こうと思ったら、Redisはもう標準で入っていますね!プロダクションでActionCableを使いたいのならRedis使え、 というコメントもついていました。RailsとRedisは仲がいいですね。

bundle exec rails g anycable:setupでAnyCableの設定をやります。

👋 Welcome to AnyCable interactive installer.
    conflict  config/cable.yml
Overwrite /home/sampo/ruby/worktimerr/config/cable.yml? (enter "h" for help) [Ynaqdhm] 

というメッセージが出たら、yを入力します。 ActionCableの設定は特にやってないので。

設定が進んで、次は

Which environment do you use for development? (1) Local, (2) Docker, (0) Skip

という質問がでます。まだDocker化は今回していないので、1を入力します。

How do you want to install AnyCable-Go WebSocket server? (1) Homebrew, (2) Download binary, (0) Skip 

バイナリーのインスール方法ですね。Macであれば1、Linuxであれば2を入力します。 ただしうまくいかなかったです・・・

ダウンロードしようとすると・・・・

ruby/3.1.0/psych/visitors/to_ruby.rb:430:in `visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias)

エラーでましたね。

go get -u -f github.com/anycable/anycable-go/cmd/anycable-go

0を入力して、Goでインストールします。

そして、bundle exec anycableを実行したら、同じエラーです・・・ こちらはPsych 4関連のエラーだったんですね。 YAMLのloadがsafe_loadみたいに振る舞うようになってて、エイリアスがそのまま使えなくなってしまっていました。

一番簡単な対処方法はanycable.yamlのなかでdefaultを使うのをやめて、設定を各ブロックにコピペすることです。 Add support for ruby 3.1 by such · Pull Request #95 · palkan/anyway_config こちらのPRがマージされ、新しいバージョンがリリースされたらそれでも治ります。

(Gemの中の.loadを.unsafe_loadにローカルで書き換えるやり方でとりあえず対応しました)

Goの方のアプリは以下のコマンドで実行します

anycable-go --host=localhost --port=8080

これで設定ができました! 全部Railsと一緒に起動されるように設定したいですね。

あと、Goでインストールしたものがちゃんと起動しなかったので、 ~/.bashrcに以下追加しました。

~/.bashrc
export GOPATH=$HOME/go;
export PATH=$PATH:$GOPATH/bin;

これで大体のセットアップは終わったので、次はようやくユーザーモデルの導入かと思います。

Ruby, Elixirの開発はご相談ください!

合同会社Sampo Development

sampo@sampo.ltd