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は確認できる)

以上です。この方が作成されたスライドは分かりやすいしきれいですねー。




この記事が気に入ったらサポートをしてみませんか?