# Rails'te Action Cable ve WebSocket'ler: Teknik Mulakat Rehberi 2026 > Ruby on Rails'te Action Cable ve WebSocket'lerin derinlemesine incelenmesi. Bağlantılar, kanallar, broadcasting, Rails 8'de Solid Cable, Redis ile ölçeklendirme ve kod örnekleriyle sık sorulan mülakat soruları. - Published: 2026-05-07 - Updated: 2026-05-07 - Author: Anthony Fillion-Maillet - Tags: ruby on rails, action cable, websockets, real-time, solid cable, rails 8 - Reading time: 11 min --- Action Cable, WebSocket desteğini doğrudan Rails framework'üne entegre ederek sohbet, bildirimler ve canlı panolar gibi gerçek zamanlı özelliklerin harici bağımlılıklar olmadan oluşturulmasını sağlar. 2026 teknik mülakatlarında Action Cable'ın iç mekanizmalarını — bağlantı yaşam döngüsünden üretim ortamında ölçeklendirmeye kadar — bilmek, güçlü adayları diğerlerinden ayıran önemli bir faktördür. > **Mülakatlar için Temel Bilgi** > > Action Cable, WebSocket'leri kontrolcüler ve modeller için kullanılan aynı konvansiyonlarla Rails framework'üne entegre eder. Rails 8, pub/sub mesajlaşması için Redis gereksinimini ortadan kaldıran veritabanı destekli bir adaptör olan Solid Cable'ı tanıtır. ## Rails Bağlamında WebSocket Protokolü Temelleri WebSocket protokolü (RFC 6455), tek bir TCP bağlantısı üzerinden kalıcı, çift yönlü bir iletişim kanalı oluşturur. HTTP'nin istek-yanıt döngüsünün aksine, WebSocket'ler açık bir bağlantı sürdürerek hem istemcinin hem de sunucunun herhangi bir anda mesaj göndermesine olanak tanır. Action Cable bu protokolü Rails'e uygun bir soyutlamaya dönüştürür. Sunucu, `/cable` adresinde WebSocket yükseltmelerini yönetir, bağlantı kimlik doğrulamasını kontrol eder ve mesajları kanallar üzerinden yönlendirir. İstemci tarafındaki JavaScript kütüphanesi abonelikleri otomatik olarak oluşturur ve yönetir. Tipik bir HTTP isteği milisaniyeler içinde tamamlanır ve kapanır. WebSocket bağlantısı ise dakikalarca, saatlerce veya tüm oturum boyunca açık kalır. Bu temel fark, Action Cable'daki her mimari kararı belirler. ## Action Cable Mimarisi: Bağlantılar, Kanallar ve Abonelikler Action Cable, üç temel soyutlamaya sahip katmanlı bir mimari izler: bağlantılar kimlik doğrulamayı yönetir, kanallar iş mantığını kapsüller ve abonelikler tüketicileri belirli kanallara bağlar. ```ruby # app/channels/application_cable/connection.rb module ApplicationCable class Connection < ActionCable::Connection::Base identified_by :current_user def connect self.current_user = find_verified_user end private def find_verified_user # Cookies are available in WebSocket handshake if verified_user = User.find_by(id: cookies.encrypted[:user_id]) verified_user else reject_unauthorized_connection end end end end ``` Bağlantı sınıfı, WebSocket el sıkışması sırasında bir kez çalışır. Kimlik doğrulama burada gerçekleşir — bireysel kanallarda değil. `identified_by` bildirimi kullanıcı kimliğini kaydederek o bağlantıdaki tüm kanal aboneliklerinde erişilebilir kılar. ```ruby # app/channels/chat_channel.rb class ChatChannel < ApplicationCable::Channel def subscribed room = ChatRoom.find(params[:room_id]) # Authorization: verify user belongs to this room if room.members.include?(current_user) stream_for room else reject end end def receive(data) message = ChatMessage.create!( room_id: params[:room_id], user: current_user, body: data["body"] ) ChatChannel.broadcast_to( message.room, { id: message.id, body: message.body, user: current_user.name } ) end def unsubscribed # Cleanup: mark user as offline AppearanceTracker.mark_offline(current_user) end end ``` Kanallar üç yaşam döngüsü callback'i tanımlar: `subscribed`, `receive` ve `unsubscribed`. `stream_for` metodu aboneliği belirli bir model örneğine bağlayarak isim alanlı bir akış oluşturur. Bu akışa yapılan broadcast, bağlı her aboneye mesajları iletir. ## JavaScript ile İstemci Tarafı Abonelikler İstemci tarafındaki tüketici, Action Cable sunucusuna bağlanır ve abonelikleri yönetir. Her abonelik, sunucu tarafındaki bir kanala karşılık gelir. ```javascript // app/javascript/channels/chat_channel.js import consumer from "./consumer" const chatChannel = consumer.subscriptions.create( { channel: "ChatChannel", room_id: roomId }, { connected() { // Called when the subscription is ready console.log("Connected to chat room", roomId) }, disconnected() { // Called when the subscription is closed console.log("Disconnected from chat room") }, received(data) { // Called when data is broadcast to the channel const messageList = document.getElementById("messages") messageList.insertAdjacentHTML("beforeend", `
` ) }, sendMessage(body) { // Calls ChatChannel#receive on the server this.perform("receive", { body: body }) } } ) ``` `received` callback'i, sunucu abone olunan akışa her broadcast yaptığında tetiklenir. `perform` metodu istemciden sunucuya veri göndererek ilgili kanal metodunu çağırır. ## Rails 8'de Solid Cable: Veritabanı Destekli Pub/Sub Rails 8, Solid Queue ve Solid Cache ile birlikte "Solid Trifecta"nın bir parçası olarak Solid Cable'ı sunar. Solid Cable, mesajları bir veritabanı tablosunda depolayarak Redis'in yerine pub/sub arka ucu olarak görev yapar. ```yaml # config/cable.yml (Rails 8 default) development: adapter: solid_cable production: adapter: solid_cable connects_to: database: writing: cable polling_interval: 0.1.seconds message_retention: 1.day ``` Solid Cable, her broadcast mesajını bir veritabanı tablosuna yazarak ve yapılandırılabilir bir aralıkta yeni mesajları sorgulayarak çalışır. Varsayılan 100ms'lik sorgulama aralığı, çoğu uygulama için neredeyse gerçek zamanlı teslimat sağlar. Ödünleşim açıktır: Solid Cable bir altyapı bağımlılığını (Redis) ortadan kaldırırken, biraz daha yüksek gecikme ve veritabanı yükü getirir. Zaten PostgreSQL veya MySQL kullanan uygulamalar için bu ödünleşim genellikle mantıklıdır. Yüksek frekanslı broadcasting (saniyede binlerce mesaj) için Redis daha iyi bir seçim olmaya devam eder. ```ruby # config/database.yml (Rails 8 multi-database) production: primary: <<: *default database: myapp_production cable: <<: *default database: myapp_cable_production migrations_paths: db/cable_migrate ``` Solid Cable, birincil veritabanı ile çakışmayı önlemek için ayrılmış bir veritabanı kullanır. Bu ayrım, mesaj sorgulamasının uygulama sorgularını etkilemesini önler. ## Broadcasting Kalıpları ve Sunucu Tarafı Tetikleyiciler Modeller, arka plan görevleri ve kontrolcülerden broadcasting, üretim Rails uygulamalarında en yaygın üç kalıbı kapsar. ```ruby # Broadcasting from a model callback class Notification < ApplicationRecord belongs_to :user after_create_commit :broadcast_to_user private def broadcast_to_user ActionCable.server.broadcast( "notifications_#{user_id}", { id: id, title: title, read: false } ) end end # Broadcasting from a background job class DashboardUpdateJob < ApplicationJob queue_as :default def perform(dashboard_id) dashboard = Dashboard.find(dashboard_id) stats = dashboard.compute_stats ActionCable.server.broadcast( "dashboard_#{dashboard_id}", { stats: stats, updated_at: Time.current.iso8601 } ) end end ``` Model callback'leri, kayıt değişiklikleriyle tetiklenen basit bildirimler için uygundur. Arka plan görevleri ise daha ağır hesaplamaları — pano istatistiklerinin hesaplanması veya verilerin toplanması gibi — istek döngüsünü engellemeden yönetir. Broadcast'in kendisi her zaman hafiftir: payload'ı serileştirir ve adaptöre yayınlar. ## Turbo Streams ve Action Cable Entegrasyonu Hotwire ile Rails 8, Turbo Streams için taşıma katmanı olarak Action Cable'ı kullanarak özel JavaScript yazmadan gerçek zamanlı DOM güncellemeleri yapılmasını sağlar. ```ruby # app/models/message.rb class Message < ApplicationRecord belongs_to :chat_room # Automatically broadcasts append to subscribers broadcasts_to :chat_room end # app/views/chat_rooms/show.html.erb <%= turbo_stream_from @chat_room %>