覚書: Rails: Action Cable の PostgreSQLアダプタ

Action Cable の PostgreSQLアダプタのコードを読んで NOTIFY/LISTEN/UNLISTEN を使用していることを知りました。対象は Rails 7.0.5  になります。

7.1.1.3 PostgreSQLアダプタ
PostgreSQLアダプタはActive Recordコネクションプールを利用するため、アプリケーションのデータベース設定ファイル(config/database.yml)でコネクションを設定します。

Action Cable の概要 - Railsガイド

https://github.com/rails/rails/blob/v7.0.5/actioncable/lib/action_cable/subscription_adapter/postgresql.rb

PostgreSQL クラスは Base クラスを継承している。

module ActionCable
  module SubscriptionAdapter
    class PostgreSQL < Base # :nodoc:

Base クラスを確認する。

https://github.com/rails/rails/blob/v7.0.5/actioncable/lib/action_cable/subscription_adapter/base.rb

def initialize(server)
def broadcast(channel, payload)
def subscribe(channel, message_callback, success_callback = nil)
def unsubscribe(channel, message_callback)
def shutdown
def identifier

initialize と identifier 以外は raise NotImplementedError を返す。派生クラスで実装する。

def broadcast(channel, payload)
  raise NotImplementedError
end

identifier は次の通り。設定値がなければプロセスIDを使った文字列を返す。

def identifier
  @server.config.cable[:id] ||= "ActionCable-PID-#{$$}"
end

PostgreSQL クラスに戻る。
オーバライドしたメソッドで PostgreSQL の NOTIFY/LISTEN/UNLISTEN を使用している。

listener メソッドは、SubscriberMap クラスを継承した Listener クラスを返す。

private
  def listener
    @listener || @server.mutex.synchronize { @listener ||= Listener.new(self, @server.event_loop) }
  end

  class Listener < SubscriberMap

https://github.com/rails/rails/blob/v7.0.5/actioncable/lib/action_cable/subscription_adapter/subscriber_map.rb

module ActionCable
  module SubscriptionAdapter
    class SubscriberMap
      def initialize
        @subscribers = Hash.new { |h, k| h[k] = [] }
        @sync = Mutex.new
      end

以上です。

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