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 কনফিগারেশন:
- Gem ইনস্টল করা:
gem 'redis'
এটি আপনার Gemfile-এ যুক্ত করতে হবে। তারপর, কমান্ড দিয়ে জেম ইনস্টল করুন:
bundle install
- 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 আপনার অ্যাপ্লিকেশনকে একটি অত্যাধুনিক রিয়েল-টাইম ফিচার প্রদান করে, যা ব্যবহারকারীর অভিজ্ঞতাকে আরো উন্নত করে।
Read more