Rails এবং WebSocket Integration

রুবি অন রেইল (Ruby on Rails) - Web Development

273

WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে পূর্ণ-ডুপ্লেক্স (full-duplex) যোগাযোগ সক্ষম করে। এর মাধ্যমে আপনি এক্সট্রা HTTP রিকোয়েস্ট ছাড়াই রিয়েল-টাইম ডেটা ট্রান্সফার করতে পারেন। Rails-এ WebSocket ইন্টিগ্রেট করার জন্য সাধারণত Action Cable ব্যবহার করা হয়। Action Cable হল Rails-এর একটি বিল্ট-ইন ফিচার, যা WebSocket ভিত্তিক রিয়েল-টাইম ফিচার তৈরি করতে সহায়তা করে।

এই গাইডে, আমরা দেখব কীভাবে Rails অ্যাপ্লিকেশনে WebSocket এবং Action Cable ইন্টিগ্রেট করা যায়।


Action Cable কী?

Action Cable হল Rails-এর একটি মডিউল যা WebSockets এবং Action Pack (Rails এর HTTP এবং WebSocket রিকোয়েস্ট হ্যান্ডলিং) এর মধ্যে একটি ব্রিজ হিসাবে কাজ করে। এটি রিয়েল-টাইম কনভারসেশন, নোটিফিকেশন, লাইভ আপডেট ইত্যাদি তৈরি করতে ব্যবহৃত হয়।

Action Cable দুটি প্রধান অংশে বিভক্ত:

  1. Channels: Channels হল WebSocket কানেকশনের ব্যবস্থাপনা এবং ক্লায়েন্টের সাথে ডেটা এক্সচেঞ্জের জন্য ব্যবহৃত হয়।
  2. Streams: Streams হল এক ধরনের পত্রিকা, যা একাধিক সাবস্ক্রাইবারকে একত্রে রিয়েল-টাইম ডেটা প্রেরণ করতে সক্ষম।

Action Cable ইন্টিগ্রেশন প্রক্রিয়া

1. Action Cable Setup

প্রথমে Rails অ্যাপ্লিকেশনে Action Cable ইনস্টল করতে হবে। Rails 5 থেকে Action Cable ডিফল্টভাবে অন্তর্ভুক্ত থাকে, তবে আপনাকে কিছু কনফিগারেশন করতে হবে।

Step 1: Configuration

প্রথমে, আপনার config/cable.yml ফাইল চেক করুন। এটি Action Cable এর কনফিগারেশন ফাইল। সাধারণত এর মধ্যে ডেভেলপমেন্ট, প্রোডাকশন এবং টেস্ট কনফিগারেশন থাকবে।

development:
  adapter: async
  url: redis://localhost:6379/1
  channel_prefix: your_app_development

production:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: your_app_production
  connected: /cable

redis ব্যবহার করার জন্য আপনাকে Redis ইনস্টল করতে হবে। Redis একটি ইন-মেমরি ডেটাবেস, যা Action Cable এর মেসেজ কিউ পরিচালনা করে।

Step 2: Redis ইনস্টল করা

Redis ইনস্টল করতে, আপনি নিম্নলিখিত কমান্ড ব্যবহার করতে পারেন (OS অনুযায়ী):

  • Mac (Homebrew দিয়ে):
brew install redis
  • Ubuntu:
sudo apt-get install redis-server
  • Windows:

Windows-এ Redis ইন্সটল করা কিছুটা জটিল, তবে আপনি Redis for Windows ব্যবহার করতে পারেন।

Step 3: Redis ডিফল্ট অ্যাডাপ্টার হিসেবে কনফিগার করা

config/cable.yml ফাইলে Redis অ্যাডাপ্টার কনফিগার করতে হবে (যা উপরের কোডে দেখানো হয়েছে)।


2. Action Cable Channel তৈরি করা

Action Cable চ্যানেল তৈরি করার জন্য, আপনি rails generate channel কমান্ড ব্যবহার করতে পারেন।

Step 1: চ্যানেল জেনারেট করা

ধরা যাক, আপনি একটি Chat চ্যানেল তৈরি করতে চান:

rails generate channel Chat

এটি একটি app/channels/chat_channel.rb ফাইল তৈরি করবে এবং একটি app/javascript/channels/chat_channel.js ফাইল তৈরি করবে।

Step 2: চ্যানেল মডেল তৈরি

chat_channel.rb ফাইলে চ্যানেল ক্লাসের লজিক যুক্ত করতে হবে। উদাহরণস্বরূপ:

# app/channels/chat_channel.rb
class ChatChannel < ApplicationCable::Channel
  def subscribed
    # Chat রুমে সাবস্ক্রাইব করা
    stream_from "chat_#{params[:room]}"
  end

  def unsubscribed
    # সাবস্ক্রাইবার যখন কানেকশন কেটে দেবে তখন এই মেথড কাজ করবে
  end
end

এখানে stream_from "chat_#{params[:room]}" ব্যবহার করে আমরা একটি নির্দিষ্ট চ্যাট রুমের জন্য ডেটা স্ট্রিম করাচ্ছি।

Step 3: চ্যানেল জাভাস্ক্রিপ্ট সেটআপ

এখন, chat_channel.js ফাইলের মধ্যে ক্লায়েন্ট সাইড জাভাস্ক্রিপ্ট কোড যুক্ত করতে হবে। উদাহরণস্বরূপ:

// app/javascript/channels/chat_channel.js
import consumer from "./consumer"

const room = "general"; // রুমের নাম

consumer.subscriptions.create({ channel: "ChatChannel", room: room }, {
  received(data) {
    console.log(data); // রিয়েল-টাইম ডেটা প্রাপ্তি
  }
});

এখানে আমরা ChatChannel চ্যানেলে সাবস্ক্রাইব করছি এবং যখনই নতুন ডেটা পাওয়া যাবে, তা received মেথডের মাধ্যমে প্রক্রিয়া করা হবে।


3. Rails Controller এবং View সেটআপ

এখন আমরা চাই, একটি Chat রুমে বার্তা পাঠাতে এবং গ্রহণ করতে। এজন্য আমাদের একটি সাধারণ ChatsController এবং View তৈরি করতে হবে।

Step 1: Controller তৈরি করা
rails generate controller Chats index create

এটি একটি ChatsController তৈরি করবে।

# app/controllers/chats_controller.rb
class ChatsController < ApplicationController
  def index
    # রুমের জন্য বার্তা দেখানো হবে
    @room = params[:room] || 'general'
  end

  def create
    # এখানে বার্তা তৈরি করা হবে এবং চ্যানেলে পাঠানো হবে
    ActionCable.server.broadcast "chat_#{params[:room]}", message: params[:message]
  end
end
Step 2: View তৈরি করা
<!-- app/views/chats/index.html.erb -->
<h1>Welcome to the <%= @room %> chat room</h1>

<%= form_with url: create_chat_path, method: :post do |form| %>
  <%= form.text_field :message %>
  <%= form.submit "Send" %>
<% end %>

<div id="messages"></div>

এখানে আমরা একটি ফর্ম তৈরি করেছি, যাতে ব্যবহারকারী বার্তা পাঠাতে পারে। ফর্ম সাবমিট হলে বার্তা create অ্যাকশনকে পাঠানো হবে, যা ActionCable চ্যানেলে বার্তা প্রেরণ করবে।


4. WebSocket কানেকশন টেস্ট করা

এখন সবকিছু সেটআপ হওয়ার পর, আপনি Rails সার্ভার চালিয়ে WebSocket কানেকশন টেস্ট করতে পারেন:

rails server

এখন, ব্রাউজারে http://localhost:3000/chats?room=general এ গিয়ে চ্যাট রুমে বার্তা পাঠান এবং রিয়েল-টাইম আপডেট দেখতে পাবেন।


সারমর্ম

Rails অ্যাপ্লিকেশনে WebSocket ইন্টিগ্রেট করার জন্য Action Cable ব্যবহার করা হয়, যা WebSocket প্রোটোকলের মাধ্যমে রিয়েল-টাইম ডেটা ট্রান্সফার করতে সহায়তা করে। Action Cable চ্যানেল তৈরি করে এবং ক্লায়েন্টদের রিয়েল-টাইম আপডেট পাঠানোর সুবিধা দেয়। Redis ব্যবহারের মাধ্যমে Action Cable একটি স্কেলেবল সিস্টেম তৈরি করতে সক্ষম, যেখানে একাধিক ক্লায়েন্টের মধ্যে ডেটা সহজে শেয়ার করা যায়। Action Cable ইন্টিগ্রেশন সাধারণত চ্যাট সিস্টেম, রিয়েল-টাইম নোটিফিকেশন, লাইভ ডাটা আপডেট ইত্যাদি ফিচার তৈরি করার জন্য ব্যবহৃত হয়।

Content added By

WebSocket একটি কমিউনিকেশন প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে পূর্ণ ডুplex (দ্বিমুখী) যোগাযোগের সুবিধা প্রদান করে। এটি HTTP প্রোটোকলের উপরে কাজ করে, কিন্তু HTTP এর সীমাবদ্ধতা (যেমন একে একে রিকোয়েস্ট এবং রেসপন্স) অতিক্রম করে, এবং ক্লায়েন্ট ও সার্ভারের মধ্যে স্থায়ী সংযোগ স্থাপন করে। এর ফলে একক কানেকশনের মাধ্যমে বারবার রিকোয়েস্ট এবং রেসপন্সের প্রয়োজন না পড়ে, যা রিয়েল-টাইম ডেটা এক্সচেঞ্জে খুব কার্যকরী।

Rails-এ Action Cable নামক একটি ফিচার রয়েছে, যা WebSocket-কে সহজে ইন্টিগ্রেট করার উপায় প্রদান করে।


1. WebSocket কী?

WebSocket হল একটি প্রোটোকল যা HTTP হ্যান্ডশেক সম্পন্ন হওয়ার পর একটি দ্বিমুখী যোগাযোগের চ্যানেল তৈরি করে, যা সার্ভার এবং ক্লায়েন্টের মধ্যে একে অপরের সাথে স্বাভাবিক যোগাযোগ রাখার জন্য ব্যবহার করা হয়। এটি সার্ভার থেকে ক্লায়েন্টে বার্তা পাঠানোর জন্য পুশ প্রযুক্তি ব্যবহার করে, যেখানে ক্লায়েন্টের পক্ষে সার্ভারে ক্রমাগত চেক করার দরকার পড়ে না।

WebSocket এর সুবিধাসমূহ:

  • একক কানেকশনে একাধিক বার্তা প্রেরণ করা যায়।
  • রিয়েল-টাইম অ্যাপ্লিকেশন যেমন চ্যাট অ্যাপ্লিকেশন, লাইভ স্ট্রিমিং, অথবা গেমিং অ্যাপ্লিকেশন জন্য উপযুক্ত।
  • কম ল্যাটেন্সি (সংযোগের বিলম্ব) এবং দ্রুত ডেটা ট্রান্সফার প্রদান করে।

2. Action Cable: Rails-এ WebSocket ইন্টিগ্রেশন

Action Cable হল Ruby on Rails-এর একটি ফিচার যা WebSocket-এর উপর ভিত্তি করে রিয়েল-টাইম ফিচার এবং ইন্টারঅ্যাকটিভ চ্যাট বা লাইভ আপডেটের জন্য ব্যবহৃত হয়। এটি WebSocket সার্ভার এবং ক্লায়েন্টের মধ্যে কানেকশন ম্যানেজমেন্ট, চ্যানেল এবং সাবস্ক্রিপশন সহজে পরিচালনা করতে সাহায্য করে।

Action Cable ইনস্টলেশন

Rails 5 এবং তার পরবর্তী সংস্করণে Action Cable স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত থাকে। তবে, আপনাকে কিছু কনফিগারেশন করতে হবে।

  1. Configuring Channels:

    প্রথমে, config/cable.yml ফাইলে ওয়েবসকেটের পরিবেশ সেটআপ করুন:

    development:
      adapter: redis
      url: redis://localhost:6379/1
      channel_prefix: your_app_development
    
    production:
      adapter: redis
      url: redis://localhost:6379/1
      channel_prefix: your_app_production
      redis:
        driver: hiredis
    
  2. Redis Setup:

    Redis হল একটি ইন-মেমরি ডেটাবেস যা Action Cable ব্যবহার করে। আপনি Redis ইনস্টল করতে পারেন:

    brew install redis  # MacOS ব্যবহারকারীদের জন্য
    sudo apt-get install redis-server  # Linux ব্যবহারকারীদের জন্য
    
  3. Start Redis:

    Redis চালু করতে নিচের কমান্ডটি ব্যবহার করুন:

    redis-server
    

3. Action Cable চ্যানেল তৈরি করা

Action Cable চ্যানেল হলো WebSocket সংযোগের একটি logical অংশ যা সার্ভার ও ক্লায়েন্টের মধ্যে রিয়েল-টাইম ডেটা শেয়ার করতে ব্যবহৃত হয়।

চ্যানেল তৈরি করা

Rails এ চ্যানেল তৈরি করতে, rails generate channel কমান্ড ব্যবহার করা হয়:

rails generate channel Chat

এই কমান্ডটি দুটি ফাইল তৈরি করবে:

  • app/channels/chat_channel.rb: চ্যানেলটির লজিক এখানে থাকে।
  • app/assets/javascripts/channels/chat.coffee: ক্লায়েন্ট সাইডে চ্যানেলটি পরিচালনা করে।

ChatChannel তৈরি করা

app/channels/chat_channel.rb ফাইলে চ্যানেলটির কনফিগারেশন করা হয়। এখানে একটি পপুলার চ্যাট চ্যানেল উদাহরণ:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "chat_#{params[:room]}"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end

  def speak(data)
    ActionCable.server.broadcast("chat_#{params[:room]}", message: data['message'])
  end
end

এখানে, subscribed মেথডে চ্যানেলটি সাবস্ক্রাইব করার সময় ক্লায়েন্টকে নির্দিষ্ট রুমের সাথে যুক্ত করা হয় এবং speak মেথডে সার্ভার থেকে বার্তা পাঠানো হয়।


4. ক্লায়েন্ট সাইডের কোড

app/assets/javascripts/channels/chat.js ফাইলে WebSocket কানেকশনের সাথে ইন্টারঅ্যাক্ট করার জন্য JavaScript কোড লিখতে হবে। উদাহরণস্বরূপ:

App.chat = App.cable.subscriptions.create({ channel: "ChatChannel", room: "general" }, {
  received: function(data) {
    $('#messages').append('<p>' + data.message + '</p>');
  },
  
  speak: function(message) {
    this.perform('speak', { message: message });
  }
});

এখানে, received মেথডে ক্লায়েন্ট নতুন বার্তা পেলে তা UI-তে দেখানো হয়, এবং speak মেথডে সার্ভারে বার্তা পাঠানো হয়।


5. WebSocket এর মাধ্যমে রিয়েল-টাইম আপডেট

Action Cable এবং WebSocket ব্যবহারের মাধ্যমে, ব্যবহারকারীরা একে অপরের সাথে রিয়েল-টাইমে যোগাযোগ করতে পারে, যেমন চ্যাট, লাইভ আপডেট, গেম স্ট্যাটাস, পুশ নোটিফিকেশন ইত্যাদি। উদাহরণস্বরূপ, একটি চ্যাট অ্যাপ্লিকেশন তৈরি করতে Action Cable ব্যবহার করলে, ব্যবহারকারীরা একে অপরকে রিয়েল-টাইমে বার্তা পাঠাতে সক্ষম হবে, এবং কোনও নতুন বার্তা এলেই তা অন্য ব্যবহারকারীদের স্ক্রীনে দেখা যাবে।


6. নিরাপত্তা এবং স্কেলিং

  • Authentication: WebSocket কানেকশনে ব্যবহৃত চ্যানেলগুলোতে নিরাপত্তা ব্যবস্থা রাখার জন্য আপনি before_action বা authenticate_user! মেথড ব্যবহার করতে পারেন।
  • Scaling: বড় অ্যাপ্লিকেশনগুলোতে Redis ক্লাস্টার ব্যবহার করে কানেকশন গুলো স্কেল করা যায়, যেখানে Redis ডেটা সিঙ্ক্রোনাইজড রাখে।

সারমর্ম

WebSocket হল একটি শক্তিশালী প্রযুক্তি যা পূর্ণ ডুplex (দ্বিমুখী) যোগাযোগের সুবিধা দেয় এবং রিয়েল-টাইম অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত উপযোগী। Ruby on Rails-এর Action Cable ব্যবহার করে WebSocket ইন্টিগ্রেট করা খুবই সহজ, এবং এর মাধ্যমে আপনি রিয়েল-টাইম চ্যাট, পুশ নোটিফিকেশন, লাইভ স্ট্রিমিং ইত্যাদি সিস্টেম তৈরি করতে পারেন। WebSocket-এর মাধ্যমে সার্ভার এবং ক্লায়েন্টের মধ্যে স্থায়ী সংযোগ স্থাপন করে ডেটা আদান-প্রদান করা হয়, যার ফলে রিয়েল-টাইম অভিজ্ঞতা আরও উন্নত হয়।

Content added By

Ruby on Rails-এ Action Cable একটি শক্তিশালী ফিচার যা real-time ওয়েব অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। এটি WebSockets প্রযুক্তি ব্যবহার করে, যার মাধ্যমে সার্ভার এবং ক্লায়েন্টের মধ্যে দুই-মুখী যোগাযোগ সম্ভব হয়। Action Cable আপনাকে ওয়েবসাইটে চ্যাট সিস্টেম, লাইভ আপডেট, রিয়েল-টাইম ডেটা সিঙ্ক্রোনাইজেশন এবং আরও অনেক ধরনের ইন্টারেক্টিভ ফিচার তৈরি করার সুযোগ দেয়।


Action Cable কী?

Action Cable হল Rails-এর একটি ইন্টিগ্রেটেড ফিচার যা WebSocket প্রটোকলের উপর ভিত্তি করে কাজ করে। WebSockets ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্টেবল, ডুয়াল-ডাইরেকশনাল কানেকশন তৈরি করে, যার মাধ্যমে ডেটা দুইপথে আদান-প্রদান হয়। এর মাধ্যমে পুশ নোটিফিকেশন, রিয়েল-টাইম চ্যাট, লাইভ আপডেট ইত্যাদি অ্যাপ্লিকেশনের ফিচারগুলো সহজে তৈরি করা যায়।


Action Cable এর প্রধান বৈশিষ্ট্য

  • Real-time communication: সার্ভার এবং ক্লায়েন্টের মধ্যে রিয়েল-টাইম ডেটা এক্সচেঞ্জ সম্ভব হয়।
  • WebSocket support: WebSocket প্রোটোকল ব্যবহার করে এটি persistent connection তৈরি করে, যা HTTP-এর মতো পুনরায় কানেক্ট হতে হয় না।
  • Integration with Rails: Rails অ্যাপ্লিকেশনের মধ্যে Action Cable সহজে ইন্টিগ্রেট করা যায়, কারণ এটি Rails ফ্রেমওয়ার্কের অংশ।
  • Scalable: Action Cable ডিস্ট্রিবিউটেড সার্ভার এবং ক্লাস্টার সাপোর্ট করে, যা বড় অ্যাপ্লিকেশন এবং হাই-ট্রাফিক সাইটের জন্য উপযুক্ত।

Action Cable কনফিগারেশন

Action Cable ব্যবহারের জন্য Rails অ্যাপ্লিকেশনকে কিছু কনফিগারেশন করতে হয়, যেমন Redis বা অন্য কোনো পাসিং সার্ভিস ব্যবহার করা। Redis একটি জনপ্রিয় ডাটা স্টোরেজ সিস্টেম যা Action Cable-এর কিউ মেসেজিংয়ের জন্য ব্যবহৃত হয়।

Redis কনফিগারেশন:

  1. Gem ইনস্টল করা:
gem 'redis'

এটি আপনার Gemfile-এ যুক্ত করতে হবে। তারপর, কমান্ড দিয়ে জেম ইনস্টল করুন:

bundle install
  1. Cable কনফিগারেশন:

config/cable.yml ফাইলে Redis কনফিগারেশন করতে হবে:

development:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: your_app_development

production:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: your_app_production
  ssl: true
  redis:
    driver: hiredis

এখানে redis://localhost:6379/1 Redis সেভারের URL।


Action Cable এর মাধ্যমে Channel তৈরি

Action Cable-এ ডেটা আদান-প্রদান করতে Channel তৈরি করতে হয়। Channel হল WebSocket কানেকশনের একটি কনটেইনার, যা সার্ভার এবং ক্লায়েন্টের মধ্যে মেসেজ ট্রান্সফার করে।

1. Channel তৈরি করা:

rails generate channel Chat

এই কমান্ডটি একটি ChatChannel তৈরি করবে এবং app/channels/chat_channel.rb ফাইলটি তৈরি হবে।

chat_channel.rb এর উদাহরণ:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "chat_#{params[:room]}"
  end

  def unsubscribed
    # Unsubscribed logic
  end

  def receive(data)
    ActionCable.server.broadcast("chat_#{params[:room]}", data)
  end
end

এখানে, subscribed মেথডে আমরা একটি নির্দিষ্ট room স্ট্রিম করি এবং ক্লায়েন্টের কাছে ডেটা পাঠাতে receive মেথড ব্যবহার করা হয়েছে। ActionCable.server.broadcast মেথডটি ক্লায়েন্টে মেসেজ পাঠানোর জন্য ব্যবহৃত হয়।

2. Client-side Subscription:

app/javascript/channels/chat_channel.js ফাইলে ক্লায়েন্ট-সাইড সাবস্ক্রিপশন কোড যুক্ত করতে হয়।

import consumer from "./consumer"

const chatRoom = document.getElementById('chat-room')

if (chatRoom) {
  const room = chatRoom.getAttribute('data-room')
  consumer.subscriptions.create({ channel: "ChatChannel", room: room }, {
    received(data) {
      // নতুন মেসেজ স্ক্রীনে দেখানো হবে
      const message = document.createElement('div')
      message.innerHTML = data.message
      document.getElementById('chat-box').appendChild(message)
    }
  })
}

এখানে, আমরা একটি ChatChannel সাবস্ক্রাইব করছি এবং যখন সার্ভার থেকে ডেটা পাঠানো হয়, তখন তা received মেথডে চলে আসে এবং HTML DOM-এ যোগ করা হয়।


HTML এবং Action Cable ইন্টিগ্রেশন

আপনি যে chat room এর জন্য রিয়েল-টাইম চ্যাট তৈরি করছেন, সে সম্পর্কিত HTML কোড কিছুটা এরকম হতে পারে:

<div id="chat-room" data-room="general">
  <div id="chat-box"></div>
  <input type="text" id="message-input" placeholder="Type your message...">
  <button onclick="sendMessage()">Send</button>
</div>

এখানে, data-room="general" দ্বারা রুমের নাম নির্ধারণ করা হয়েছে। আপনি যখন নতুন মেসেজ পাঠাতে চান, তখন JavaScript থেকে Action Cable চ্যানেলকে মেসেজ পাঠানোর জন্য কল করা হবে।

মেসেজ পাঠানোর JavaScript কোড:

function sendMessage() {
  const messageInput = document.getElementById('message-input')
  const message = messageInput.value
  const room = document.getElementById('chat-room').getAttribute('data-room')

  consumer.subscriptions.subscriptions[0].send({ message: message, room: room })
  messageInput.value = ''
}

এটি ক্লায়েন্ট-সাইডে মেসেজ পাঠানোর জন্য ব্যবহৃত হয়। যখন মেসেজ পাঠানো হয়, তখন তা WebSocket চ্যানেল এ পাঠানো হয় এবং চ্যানেলটি ওই মেসেজ সার্ভারে ব্রডকাস্ট করে।


Action Cable Scaling (স্কেলিং)

Action Cable-এ scalability নিশ্চিত করার জন্য Redis ব্যবহার করা হয়, বিশেষত যখন অ্যাপ্লিকেশনটি বড় এবং ডিস্ট্রিবিউটেড হয়। একাধিক ইনস্ট্যান্সে কাজ করা অ্যাপ্লিকেশনগুলির জন্য Redis একটি মাঝারি সিস্টেম হিসেবে কাজ করে, যা pub/sub মডেল অনুসরণ করে। Redis নিশ্চিত করে যে একাধিক সার্ভার ইনস্ট্যান্সের মধ্যে WebSocket কানেকশন এবং ব্রডকাস্ট সঠিকভাবে বিতরণ করা হচ্ছে।

Scaling Redis in Production:

config/cable.yml ফাইলে Redis-এর URL সেট করা থাকে, যা প্রতিটি সার্ভার ইনস্ট্যান্সে সংযুক্ত হয় এবং ডিস্ট্রিবিউটেড কনফিগারেশন প্রদান করে।


সারমর্ম

Action Cable Rails অ্যাপ্লিকেশনের মধ্যে রিয়েল-টাইম ফিচার যোগ করার একটি শক্তিশালী টুল। এটি WebSockets প্রোটোকল ব্যবহার করে সার্ভার এবং ক্লায়েন্টের মধ্যে দুই-মুখী যোগাযোগ প্রতিষ্ঠা করে, যা রিয়েল-টাইম চ্যাট, লাইভ আপডেট, পুশ নোটিফিকেশন ইত্যাদি তৈরি করতে ব্যবহৃত হয়। Action Cable-এ চ্যানেল ব্যবহার করা হয়, যা সার্ভার থেকে ক্লায়েন্টে ডেটা পাঠানোর জন্য সহায়তা করে। Redis ব্যবহার করে আপনি সহজেই অ্যাপ্লিকেশনের স্কেলিং এবং ডিস্ট্রিবিউটেড সিস্টেম তৈরি করতে পারেন। Rails-এর Action Cable আপনার অ্যাপ্লিকেশনকে একটি অত্যাধুনিক রিয়েল-টাইম ফিচার প্রদান করে, যা ব্যবহারকারীর অভিজ্ঞতাকে আরো উন্নত করে।

Content added By

WebSocket হলো একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে একক, দীর্ঘস্থায়ী সংযোগ স্থাপন করতে ব্যবহৃত হয়, যার মাধ্যমে উভয়ের মধ্যে দ্রুত এবং রিয়েল-টাইম ডেটা আদান-প্রদান করা সম্ভব। Ruby on Rails-এ WebSocket এর সাহায্যে আপনি লাইভ আপডেট এবং নোটিফিকেশন সিস্টেম তৈরি করতে পারেন, যেখানে ক্লায়েন্টদের নতুন তথ্য বা ইভেন্ট সম্পর্কে রিয়েল-টাইমে জানানো হয়।

Rails-এ WebSocket প্রযুক্তি কার্যকরভাবে ব্যবহার করার জন্য জনপ্রিয় দুটি পদ্ধতি রয়েছে:

  • Action Cable
  • JavaScript/WebSocket API

Rails 5 থেকে Action Cable নামের একটি বিল্ট-ইন ফিচার অন্তর্ভুক্ত করা হয়েছে যা WebSocket সাপোর্ট দেয়। এটি আপনাকে সহজে রিয়েল-টাইম ফিচার (যেমন চ্যাট, লাইভ আপডেট, নোটিফিকেশন) তৈরি করতে সাহায্য করে।


Action Cable কী?

Action Cable হল Ruby on Rails এর একটি ফিচার যা WebSocket প্রটোকল ব্যবহার করে রিয়েল-টাইম কমিউনিকেশন সাপোর্ট করে। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে একযোগে ডেটা পাঠানোর মাধ্যমে লাইভ আপডেট এবং নোটিফিকেশন সিস্টেম তৈরি করতে সাহায্য করে।

এটি মূলত দুইটি গুরুত্বপূর্ণ অংশে বিভক্ত:

  1. Channel: সার্ভারের একটি চ্যানেল, যা ক্লায়েন্টের সাথে রিয়েল-টাইম ডেটা আদান-প্রদান করে।
  2. Subscription: ক্লায়েন্ট সাইডে WebSocket কানেকশনের মাধ্যমে সার্ভারের চ্যানেলে সাবস্ক্রাইব করার প্রক্রিয়া।

Action Cable সেটআপ এবং কনফিগারেশন

১. Action Cable ইনস্টলেশন

Action Cable ব্যবহার করতে হলে প্রথমে আপনার Rails অ্যাপ্লিকেশনটি Rails 5 বা তার পরের ভার্সনে থাকতে হবে। সাধারণত, এটি Rails-এ ডিফল্টভাবে অন্তর্ভুক্ত থাকে, তবে আপনাকে এটিকে কনফিগার করার জন্য কিছু সেটিংস প্রয়োজন।

আপনি যদি Redis ব্যবহার করতে চান, তাহলে Redis ইনস্টল করে সেটি কনফিগার করতে হবে, কারণ Action Cable Redis-কে ব্যবহৃত করে।

Redis ইনস্টল করতে:

brew install redis  # MacOS এ
sudo apt-get install redis-server  # Linux এ

এরপর, Rails অ্যাপ্লিকেশনে Redis কনফিগার করুন। Gemfile এ এই লাইনের মাধ্যমে Redis যোগ করুন:

gem 'redis', '~> 4.0'

এবং তারপর bundle install চালান।

২. Action Cable কনফিগারেশন

config/cable.yml ফাইলে Action Cable এর জন্য কনফিগারেশন সেট করুন:

development:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: your_app_development

production:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: your_app_production
  pool_size: 5

এখানে, url হল Redis এর কানেকশন স্ট্রিং, এবং channel_prefix হল চ্যানেলের নামের একটি প্রিফিক্স।

৩. Channel তৈরি করা

এবার আপনাকে একটি channel তৈরি করতে হবে, যা ক্লায়েন্টের সাথে যোগাযোগ করবে। এটি একটি Ruby ক্লাস হবে যা Action Cable এর মাধ্যমে ডেটা পাঠাতে এবং গ্রহণ করতে সক্ষম।

rails generate channel Notifications

এটি দুটি ফাইল তৈরি করবে:

  • app/channels/notifications_channel.rb (Channel ক্লাস)
  • app/javascript/channels/notifications_channel.js (JavaScript ক্লায়েন্ট সাইড সাবস্ক্রিপশন)

app/channels/notifications_channel.rb ফাইলটি দেখতে কিছুটা এরকম হবে:

class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    # যখন ক্লায়েন্ট চ্যানেলে সাবস্ক্রাইব করবে, তখন এটি চালু হবে
    stream_from "notifications_#{current_user.id}"
  end

  def unsubscribed
    # যখন ক্লায়েন্ট চ্যানেল থেকে আনসাবস্ক্রাইব করবে
  end
end

এখানে, stream_from মেথড ব্যবহার করে আমরা একটি নির্দিষ্ট চ্যানেল থেকে ডেটা পাঠাচ্ছি, যা ব্যবহারকারীর আইডির উপর ভিত্তি করে নির্ধারিত।

৪. ক্লায়েন্ট সাইড সাবস্ক্রিপশন

JavaScript ফাইলটি (যেমন app/javascript/channels/notifications_channel.js) সঠিকভাবে কনফিগার করা প্রয়োজন:

import consumer from "./consumer"

consumer.subscriptions.create("NotificationsChannel", {
  connected() {
    console.log("Connected to Notifications Channel!");
  },

  disconnected() {
    console.log("Disconnected from Notifications Channel!");
  },

  received(data) {
    // এখানে ডেটা পেলে আপনি কিছু করতে পারবেন (যেমন, নোটিফিকেশন শো করা)
    alert(data.message);
  }
});

এখানে, connected মেথডটি চ্যানেলে সাবস্ক্রাইব করার পর কল হবে, এবং received মেথডে আপনি যখনই নতুন ডেটা পাবেন তখন সেটা পেতে পারবেন।


Action Cable ব্যবহার করে Live Updates পাঠানো

এখন, আপনাকে Action Cable এর মাধ্যমে live updates পাঠাতে হবে। সাধারণত, একটি নির্দিষ্ট অ্যাকশন বা ইভেন্টের জন্য সার্ভার থেকে ক্লায়েন্টকে আপডেট পাঠানো হয়।

ধরা যাক, আপনি যখন একটি নতুন পোস্ট তৈরি করবেন, তখন সকল লগ ইন ইউজারকে একটি নোটিফিকেশন পাঠাতে চান।

class PostsController < ApplicationController
  def create
    @post = Post.new(post_params)
    if @post.save
      # নতুন পোস্ট সেভ হলে সব ইউজারের জন্য লাইভ নোটিফিকেশন পাঠানো
      ActionCable.server.broadcast "notifications_#{current_user.id}", message: "New post created!"
      redirect_to @post
    else
      render :new
    end
  end
end

এখানে, ActionCable.server.broadcast মেথডটি ব্যবহারকারীর চ্যানেলে একটি নোটিফিকেশন পাঠাচ্ছে।


নোটিফিকেশন পাঠানোর সময় অ্যাসিঙ্ক্রোনাস কাজ

Action Cable ডিফল্টভাবে সিঙ্ক্রোনাস কাজ করে, কিন্তু কিছু সময় অ্যাসিঙ্ক্রোনাস কাজ করা প্রয়োজন। আপনি অ্যাসিঙ্ক্রোনাস কাজ করতে deliver_later ব্যবহার করতে পারেন।

class Post < ApplicationRecord
  after_create_commit do
    broadcast_to "notifications_#{user.id}", message: "A new post has been created!"
  end
end

এখানে, broadcast_to মেথডটি অ্যাসিঙ্ক্রোনাসভাবে নোটিফিকেশন পাঠাবে।


সারমর্ম

Action Cable ব্যবহার করে Ruby on Rails-এ WebSocket এর মাধ্যমে রিয়েল-টাইম লাইভ আপডেট এবং নোটিফিকেশন সিস্টেম তৈরি করা সম্ভব। Action Cable চ্যানেল এবং সাবস্ক্রিপশন ব্যবস্থার মাধ্যমে সার্ভার এবং ক্লায়েন্টের মধ্যে একযোগে ডেটা আদান-প্রদান করা যায়। Redis ব্যবহার করে এটি ডেটা দ্রুত এবং দক্ষতার সাথে প্রেরণ করতে সক্ষম। Action Cable রিয়েল-টাইম চ্যাট, নোটিফিকেশন এবং লাইভ আপডেট ফিচার তৈরির জন্য একটি শক্তিশালী উপকরণ।

Content added By

Real-time data transfer বা রিয়েল-টাইম ডেটা ট্রান্সফার এমন একটি প্রযুক্তি যা ব্যবহারকারীদের সাথে সার্ভারের সরাসরি, অবিচ্ছিন্ন এবং দ্রুত যোগাযোগ স্থাপন করতে সক্ষম। এটি বিশেষত চ্যাট অ্যাপ্লিকেশন, লাইভ আপডেট, গেমিং, এবং অন্যান্য ইন্টারঅ্যাকটিভ ওয়েব অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত গুরুত্বপূর্ণ। WebSocket এবং API দুটি প্রধান প্রযুক্তি যা রিয়েল-টাইম ডেটা ট্রান্সফারের জন্য ব্যবহৃত হয়।

এই টিউটোরিয়ালে আমরা আলোচনা করবো WebSocket এবং API এর মাধ্যমে রিয়েল-টাইম ডেটা ট্রান্সফারের প্রযুক্তি, তাদের মধ্যে পার্থক্য এবং কিভাবে Ruby on Rails-এ এগুলো ব্যবহার করা যায়।


WebSocket: পরিচিতি

WebSocket একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে একটানা, দ্বিমুখী যোগাযোগ তৈরি করে। এটি HTTP প্রোটোকল থেকে ভিন্ন এবং সার্ভার এবং ক্লায়েন্টের মধ্যে একটি স্টেবল কানেকশন স্থাপন করে, যা দীর্ঘ সময় ধরে কার্যকর থাকে।

WebSocket এর সুবিধা

  1. দ্বিমুখী যোগাযোগ: WebSocket ক্লায়েন্ট এবং সার্ভারের মধ্যে উভয় দিকে ডেটা ট্রান্সফার করতে সক্ষম।
  2. কম লেটেন্সি: একবার কানেকশন স্থাপিত হলে, তথ্য দ্রুত এবং কম লেটেন্সি সহ ট্রান্সফার করা সম্ভব।
  3. স্টেটফুল কানেকশন: কানেকশন একটানা স্থায়ী থাকে, ফলে একটি নির্দিষ্ট কানেকশনের মাধ্যমে একাধিক মেসেজ আদান-প্রদান করা সম্ভব।

WebSocket এর ব্যবহার

WebSocket ব্যবহার করে রিয়েল-টাইম ডেটা ট্রান্সফার করা যায়, যেমন:

  • চ্যাট অ্যাপ্লিকেশন
  • স্টক মার্কেট ডেটা
  • লাইভ গেমিং
  • লাইভ শেয়ার মার্কেট আপডেট
  • পুশ নোটিফিকেশন

WebSocket এবং Ruby on Rails

Ruby on Rails-এ WebSocket ব্যবহারের জন্য ActionCable নামে একটি বিল্ট-ইন লাইব্রেরি রয়েছে। এটি WebSocket কানেকশন পরিচালনা করতে সাহায্য করে এবং ডেটার রিয়েল-টাইম আপডেট প্রদান করে।

ActionCable কে ব্যবহার করার জন্য:

  1. ActionCable ইনস্টল করা:

    Rails 5 এবং তার পরবর্তী ভার্সনগুলিতে ActionCable ডিফল্টভাবে অন্তর্ভুক্ত থাকে। ActionCable ব্যবহার শুরু করার জন্য আপনাকে কেবল নিচের কোডগুলি আপনার অ্যাপ্লিকেশন ফাইলে সংযুক্ত করতে হবে।

  2. Channels তৈরি করা:

    ActionCable এ WebSocket কানেকশন প্রতিষ্ঠিত করার জন্য একটি channel তৈরি করতে হয়। উদাহরণস্বরূপ:

    rails generate channel chat
    

    এটি app/channels/chat_channel.rb ফাইল তৈরি করবে। আপনি এখানে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা পাঠানোর জন্য কোড লিখতে পারেন।

    # app/channels/chat_channel.rb
    class ChatChannel < ApplicationCable::Channel
      def subscribed
        stream_from "chat_#{params[:room]}"
      end
    
      def unsubscribed
        # Clean up when the user unsubscribes
      end
    end
    
  3. Client-side JavaScript:
    ক্লায়েন্ট সাইডে, আপনি JavaScript ব্যবহার করে WebSocket কানেকশন তৈরি করবেন:

    // app/assets/javascripts/channels/chat.js
    App.chat = App.cable.subscriptions.create({ channel: "ChatChannel", room: "General" }, {
      received: function(data) {
        console.log(data);
      }
    });
    
  4. Rails Server কনফিগারেশন:
    আপনার config/cable.yml ফাইলে WebSocket কনফিগারেশন করতে হবে।

    development:
      adapter: async
      url: redis://localhost:6379/1
    
    production:
      adapter: redis
      url: redis://localhost:6379/1
      channel_prefix: your_app_production
    

API এর মাধ্যমে Real-time Data Transfer

API (Application Programming Interface) ব্যবহারের মাধ্যমে, বিশেষত RESTful API বা GraphQL API, আপনি রিয়েল-টাইম ডেটা ট্রান্সফার করতে পারেন, তবে এটি WebSocket এর তুলনায় একটু ভিন্ন ধরণের যোগাযোগ। API প্রোটোকলগুলো সাধারনত ক্লায়েন্ট-সার্ভার মডেলে কাজ করে, এবং এতে প্রতিটি রিকুয়েস্টের জন্য সার্ভারের কাছে একটি রেসপন্স প্রয়োজন হয়। তবে, API-এর মাধ্যমে রিয়েল-টাইম ডেটা পাওয়ার জন্য Polling, Long Polling, অথবা Server-Sent Events (SSE) ব্যবহার করা হয়।

API এবং Ruby on Rails

Rails এ API নির্মাণের জন্য আপনাকে Rails API mode ব্যবহার করতে হবে। এটি rails new কমান্ডের মাধ্যমে একটি API-ফোকাসড অ্যাপ্লিকেশন তৈরি করতে সহায়তা করে।

  1. API রিসোর্স তৈরি করা:

    একটি সাধারণ API রিসোর্স তৈরি করতে:

    rails new myapp --api
    

    এর পরে, একটি API কন্ট্রোলার তৈরি করতে:

    rails generate controller Api::V1::Messages
    

    কন্ট্রোলারে আপনি RESTful রিসোর্স মেথডগুলো যেমন index, create, show, update ইত্যাদি লিখতে পারেন।

    class Api::V1::MessagesController < ApplicationController
      def index
        @messages = Message.all
        render json: @messages
      end
    
      def create
        @message = Message.new(message_params)
        if @message.save
          render json: @message, status: :created
        else
          render json: @message.errors, status: :unprocessable_entity
        end
      end
    
      private
    
      def message_params
        params.require(:message).permit(:content)
      end
    end
    
  2. Polling এবং Long Polling:

    Polling হল একটি পদ্ধতি যেখানে ক্লায়েন্ট একটি নির্দিষ্ট সময় পর পর সার্ভারে রিকুয়েস্ট পাঠায়। যদি নতুন ডেটা থাকে, তবে তা রিটার্ন করা হয়, নতুবা সার্ভার একটি খালি রেসপন্স পাঠায়।

    Long Polling হল একটি উন্নত পদ্ধতি যেখানে সার্ভার রিকুয়েস্ট গ্রহণ করার পর অপেক্ষা করে যতক্ষণ না নতুন ডেটা আসে, তারপর তা রিটার্ন করা হয়। এটি ক্লায়েন্টকে দ্রুত ডেটা দেয়, তবে এর কার্যকারিতা WebSocket-এর মতো নয়।

  3. Server-Sent Events (SSE):

    SSE একটি ওয়েব প্রযুক্তি যা ক্লায়েন্ট-সার্ভারের মধ্যে একমুখী রিয়েল-টাইম ডেটা ট্রান্সফার করার জন্য ব্যবহৃত হয়। এটি সাধারণত লাইভ ফিড, এলার্ট বা রিয়েল-টাইম অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত হয়।

    # app/controllers/messages_controller.rb
    class MessagesController < ApplicationController
      include ActionController::Live
    
      def stream
        response.headers['Content-Type'] = 'text/event-stream'
        10.times do |i|
          response.stream.write "data: Hello #{i}\n\n"
          sleep 1
        end
      ensure
        response.stream.close
      end
    end
    

    ক্লায়েন্ট সাইডে SSE রিসিভ করতে:

    const eventSource = new EventSource('/messages/stream');
    eventSource.onmessage = function(event) {
      console.log(event.data);
    };
    

WebSocket এবং API এর মাধ্যমে Real-time Data Transfer এর মধ্যে পার্থক্য

ফিচারWebSocketAPI (Polling/SSE)
যোগাযোগের ধরনদ্বিমুখী (bidirectional)একমুখী (unidirectional)
কার্যক্ষমতাকম লেটেন্সি, দ্রুত ডেটা ট্রান্সফারঅধিক লেটেন্সি, কিছুটা ধীর গতির ট্রান্সফার
ডেটা আদান-প্রদানঅবিচ্ছিন্ন এবং রিয়েল-টাইমপর্যায়ক্রমে, নতুন ডেটা আসলে রিসিভ হয়
ব্যবহারচ্যাট, লাইভ গেমিং, স্টক মার্কেট আপডেটলাইভ ফিড, এলার্ট সিস্টেম

সারমর্ম

WebSocket এবং API উভয়ই রিয়েল-টাইম ডেটা ট্রান্সফার করার জন্য ব্যবহৃত হয়, তবে তাদের মধ্যে মূল পার্থক্য হল তাদের কার্যকারিতা এবং ব্যবহারের পদ্ধতি। WebSocket একটি দ্বিমুখী এবং কম লেটেন্সি প্রযুক্তি, যা রিয়েল-টাইম

অ্যাপ্লিকেশন যেমন চ্যাট বা গেমিং-এ ব্যবহৃত হয়। অপরদিকে, API এর মাধ্যমে Polling বা SSE-এর মাধ্যমে ডেটা ট্রান্সফার করা হয়, যা তুলনামূলকভাবে ধীর গতির হলেও সাইট বা অ্যাপ্লিকেশনের জন্য কার্যকরী হতে পারে। Rails অ্যাপ্লিকেশনে ActionCable এর মাধ্যমে WebSocket ইন্টিগ্রেট করা সহজ, এবং API এর জন্য আপনি RESTful কন্ট্রোলার তৈরি করে রিয়েল-টাইম ডেটা ট্রান্সফার করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...