Action Cableの理解: ライフサイクル
外観
Action Cableの用語の理解にRailsConfのセッションが参考になりました。
特にスライドの全体図が外観の理解に役立ちました。
Action Cableのライフサイクル
1. クライアントがケーブルに接続する
2.サーバが接続を確認する
3.クライアントがチャネルをサブスクライブする
4.クライアントがサーバにメッセージを送信する
5.サーバがクライアントにメッセージを送信する
参照
Unraveling the Cable- How Action Cable Works - Speaker Deck
リポジトリ
https://github.com/usutani/try_ac_how_action_cable_works
1. クライアントがケーブルに接続する
RubyでのHTTPリクエスト:
# frozen_string_literal: true
require 'socket'
body = <<~BODY
GET / HTTP/1.0\r
Host: localhost:3000\r
\r
BODY
Socket.tcp('localhost', 3000) do |sock|
sock.print body
sock.close_write
puts sock.read
end
ソケットの取得:
# frozen_string_literal: true
require 'socket'
body = <<~BODY # .gsub("\n", "\r\n")
GET ws://localhost:3000/cable HTTP/1.1\r
Host: localhost:3000\r
Connection: Upgrade\r
Upgrade: websocket\r
Origin: http://localhost:3000\r
\r
BODY
Socket.tcp('localhost', 3000) do |sock|
sock.print body
sock.close_write
puts sock.read
end
2.サーバが接続を確認する
rack.hijack
https://github.com/rails/rails/blob/v6.0.3.1/actioncable/test/connection/client_socket_test.rb
3.クライアントがチャネルをサブスクライブする
ハンドシェイク。
RubyでのRedis Pub/Subの実装例。
# frozen_string_literal: true
require 'redis'
redis = Redis.new
redis.subscribe('chan1') do |on|
on.message do |channel, msg|
puts '1) messsage'
puts "2) #{channel}"
puts "3) #{msg}"
end
end
# frozen_string_literal: true
require 'redis'
redis = Redis.new
redis.publish 'chan1', ARGV[0]
4.クライアントがサーバにメッセージを送信する
RFC 6455 - The WebSocket Protocol > 5.2. Base Framing Protocol
5.サーバーがクライアントにメッセージを送信する
ブロードキャストの例。(Railsのログ出力でJSONは確認できる)
以上です。この方が作成されたスライドは分かりやすいしきれいですねー。
この記事が気に入ったらサポートをしてみませんか?