by Sampo Kuokkanen
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;
これで大体のセットアップは終わったので、次はようやくユーザーモデルの導入かと思います。