<पी> वेब अनुप्रयोगों में रीयल-टाइम सुविधाएं तेजी से महत्वपूर्ण होती जा रही हैं, लेकिन प्रत्येक रेल डेवलपर एक्शन केबल, फ्रेमवर्क की अंतर्निहित वेबसॉकेट लाइब्रेरी से परिचित नहीं है। <पी> रेल्स एक्शन केबल लंबे समय से वेब सॉकेट का समर्थन करता है, लेकिन कुछ अतिरिक्त जटिलता के साथ आता है। रेल्स 8 सॉलिड केबल प्रस्तुत करता है , एक्शन केबल के लिए एक नया डेटाबेस-समर्थित एडाप्टर जो रेडिस की आवश्यकता को समाप्त करता है। इस गाइड में, मैं आपको सॉलिड केबल के माध्यम से एक्शन केबल के बारे में बताऊंगा और आपको दिखाऊंगा कि वास्तविक समय की सुविधा कैसे बनाई जाए। आप देखेंगे कि Redis से परेशान हुए बिना रेल्स 8 ऐप में रीयल-टाइम कार्यक्षमता जोड़ना कितना आसान है। <पी> मैं आपको मेरे साथ चलने और ऐप बनाने के लिए प्रोत्साहित करूंगा, लेकिन GitHub पर तैयार प्रोजेक्ट को देखने के लिए आपका स्वागत है। रेल एक्शन केबल का उपयोग क्यों करें?
<पी> आधुनिक वेब ऐप्स को अक्सर ग्राहकों को वास्तविक समय में अपडेट भेजने की आवश्यकता होती है। कुछ स्पष्ट उदाहरणों में तुरंत प्रदर्शित होने वाले चैट संदेश या लाइव डैशबोर्ड सूचनाएं शामिल हैं। एक्शन केबल आपके ऐप में वेबसॉकेट को एकीकृत करने, सर्वर और क्लाइंट के बीच दो-तरफ़ा, लगातार संचार को सक्षम करने के लिए रेल्स का अंतर्निहित समाधान है। मैं रेल्स फ्रेमवर्क के हिस्से के रूप में एक्शन केबल के लिए व्यक्तिगत रूप से आभारी हूं, क्योंकि यह आपको वास्तव में उपयोगी वेब ऐप के लिए आवश्यक सभी चीजें देने के समग्र विषय का समर्थन करता है। एक्शन केबल का उपयोग करने का मतलब है कि सर्वर ब्राउज़र को स्पष्ट रूप से अनुरोध किए बिना ब्राउज़र पर डेटा भेज सकता है (कोई उपयोगकर्ता द्वारा प्रेरित ताज़ा नहीं!)। <पी> एक्शन केबल और वेबसॉकेट के साथ, आपका रेल ऐप लाइव इंटरैक्टिव सुविधाएं प्रदान कर सकता है जिन्हें सर्वर-रेंडर ऐप में लागू करना ऐतिहासिक रूप से कठिन था। इसके लिए कुछ रोजमर्रा के उपयोग के मामले हैं: - लाइव चैट एप्लिकेशन
- सूचनाएं और फ़ीड
- लाइव अपडेट के साथ सहयोगी ऐप्स
- लाइव स्पोर्ट्स या स्टॉक टिकर
<पी> संक्षेप में, एक्शन केबल पारंपरिक अनुरोध-प्रतिक्रिया चक्र और वास्तविक समय घटना-संचालित अपडेट के बीच अंतर को पाटता है। क्लाइंट पक्ष पर, रेल्स चैनलों की सदस्यता लेने और प्रसारण प्राप्त करने के लिए एक जावास्क्रिप्ट उपभोक्ता प्रदान करता है। डेवलपर के रूप में, आप बैकएंड चैनल (कंट्रोलर के समान, लेकिन रीयल-टाइम स्ट्रीम के लिए) को परिभाषित करके एक्शन केबल के साथ इंटरैक्ट करते हैं, जिसे फ्रंट-एंड क्लाइंट सब्सक्राइब कर सकते हैं। तो फिर सॉलिड केबल क्या है?
<पी> यदि आपने पिछले रेल संस्करणों में एक्शन केबल का उपयोग किया है, तो आप जानते होंगे कि उत्पादन में यह आमतौर पर रेडिस (या पोस्टग्रेएसक्यूएल के NOTIFY) पर निर्भर करता है। ) विभिन्न सर्वर प्रक्रियाओं में संदेशों को प्रसारित करने के लिए। पब/उप सेवा (अक्सर रेडिस) यह सुनिश्चित करती है कि एक रेल प्रक्रिया से एक संदेश अन्य सभी प्रक्रियाओं तक पहुंचाया जाए ताकि वे इसे अपने कनेक्टेड वेबसॉकेट क्लाइंट को अग्रेषित कर सकें। यह अतिरिक्त बुनियादी ढांचा ऐतिहासिक रूप से एक्शन केबल का उपयोग करने के लिए एक आवश्यकता रही है। <पी> रेल्स 8 में पेश की गई सॉलिड केबल, आपके मौजूदा डेटाबेस को बैकएंड के रूप में उपयोग करके रेडिस जैसी बाहरी पब/उप सेवा की आवश्यकता को प्रतिस्थापित करती है। सॉलिड केबल एक्शन केबल के लिए एक डेटाबेस-समर्थित एडाप्टर है, एक्टिव जॉब के लिए सॉलिड क्यू और एक्टिव कैश के लिए सॉलिड कैश की तरह। प्रत्येक आने वाले वेबसॉकेट संदेश को डेटाबेस तालिका में लिखा जाता है, और सभी एक्शन केबल इंस्टेंसेस ग्राहकों को प्रसारित करने के लिए नए संदेशों के लिए उस तालिका का सर्वेक्षण करते हैं। यह बहुत तेज़ी से होता है (डिफ़ॉल्ट रूप से, हर 100 मिलीसेकंड में), जो लगभग वास्तविक समय का प्रदर्शन देता है। संदेशों को काटने से पहले केवल थोड़े समय (डिफ़ॉल्ट रूप से 24 घंटे) के लिए संग्रहीत किया जाता है, ताकि आप डेटाबेस स्थान के बारे में चिंता किए बिना हाल के मुद्दों को डीबग कर सकें। <पी> कुल मिलाकर, सॉलिड केबल रेल्स 8 के "सॉलिड ट्राइफेक्टा" के दर्शन में फिट बैठता है, जो कैशिंग, बैकग्राउंड जॉब और रीयल-टाइम मैसेजिंग के लिए अंतर्निहित, डेटाबेस-समर्थित सुविधाओं का एक पूरा सेट है। सॉलिड केबल के साथ, आपके पास अपने डेटाबेस के माध्यम से जॉब, कैशिंग और वेबसॉकेट चलाने के लिए अंतिम टुकड़ा है। सॉलिड केबल के साथ रेल 8 ऐप बनाना
<पी> आप संभवतः सॉलिड केबल से परिचित होने के लिए उत्सुक हैं, तो आइए इसे रेल्स 8 एप्लिकेशन में जोड़कर एक न्यूनतम चैट रूम बनाएं जहां कई उपयोगकर्ता वास्तविक समय में संदेशों का आदान-प्रदान कर सकें। एक उदाहरण ऐप बनाना
<पी> बैकएंड के रूप में सॉलिड केबल का उपयोग करते समय आप एक्शन केबल के बुनियादी सिद्धांतों (चैनल, सदस्यता, प्रसारण) को सीखेंगे। हम इस उदाहरण के लिए रेल्स 8 का उपयोग करने जा रहे हैं, इसलिए आगे बढ़ें और एक नया रेल्स ऐप बनाएं: rails _8.1.0_ new solid_cable_chat --database=sqlite3
<पी> फिर, cd नई Solid_cable_chat निर्देशिका में। <पी> चूंकि आपने रेल्स 8 का उपयोग किया है, इसलिए आपको रोलिंग के लिए सॉलिड केबल या कोई अन्य रत्न जोड़ने की आवश्यकता नहीं होगी। अधिकांश या सभी कॉन्फिगरेशन आपके लिए होंगे। यदि आप रेल के पुराने संस्करण से आ रहे हैं तो मैं आपको यह सब बताऊंगा। सॉलिड केबल को कॉन्फ़िगर करना
<पी> हम सॉलिड केबल सेटअप चलाकर शुरुआत करेंगे: bin/rails solid_cable:install
<पी> यह जनरेटर दो मुख्य काम करता है. यह एक config/cable.yml बनाता है कॉन्फ़िगरेशन फ़ाइल जो सॉलिड केबल को केबल एडाप्टर के रूप में सेट करती है। यह एक db/cable_schema.rb भी बनाता है फ़ाइल, जिसमें सॉलिड केबल की संदेश तालिका के लिए डेटाबेस स्कीमा परिभाषा शामिल है। रेल के हाल के संस्करण भी rails new चलाते समय इन फ़ाइलों को स्वचालित रूप से बनाते हैं . <पी> इसके बाद, हमें सॉलिड केबल के लिए अपनी डेटाबेस सेटिंग्स को कॉन्फ़िगर करने की आवश्यकता है। डिफ़ॉल्ट रूप से, रेल्स आपके बाकी डेटा से रीयल-टाइम मैसेजिंग डेटा को अलग करने के लिए सॉलिड केबल के लिए एक अलग डेटाबेस का उपयोग करता है। विकास में, आप या तो एक ही डेटाबेस का उपयोग कर सकते हैं या एक अलग डेटाबेस सेट कर सकते हैं। मैं आपको विकास में सॉलिड केबल के लिए एक अलग SQLite डेटाबेस का उपयोग करने के तरीके के बारे में बताऊंगा। इसका मतलब है एक नया "केबल" डेटाबेस कनेक्शन जोड़ना। सॉलिड केबल के लिए अपना डेटाबेस सेट करना
<पी> config/database.yml खोलें फ़ाइल. विकास अनुभाग में, एक cable जोड़ें डेटाबेस. उदाहरण के लिए, यदि आप SQLite (dev के लिए रेल डिफ़ॉल्ट) का उपयोग कर रहे हैं: development:
primary:
<<: *default
database: storage/development.sqlite3
cable:
<<: *default
database: storage/development_cable.sqlite3
migrations_paths: db/cable_migrate
production:
primary:
<<: *default
database: storage/production.sqlite3
cache:
<<: *default
database: storage/production_cache.sqlite3
migrations_paths: db/cache_migrate
queue:
<<: *default
database: storage/production_queue.sqlite3
migrations_paths: db/queue_migrate
cable:
<<: *default
database: storage/production_cable.sqlite3
migrations_paths: db/cable_migrate
<पी> पुनः, यदि आप रेल के नवीनतम संस्करण पर हैं, तो यह कॉन्फ़िगरेशन पहले से ही वहां मौजूद होगा। <पी> अब config/cable.yml खोलें . सॉलिड केबल को उत्पादन में पहले से ही डिफ़ॉल्ट एडाप्टर होना चाहिए। हम विकास में सॉलिड केबल को भी सक्षम करना चाहते हैं (ताकि हम लोकलहोस्ट में अपनी चैट का परीक्षण कर सकें)। cable.yml संपादित करें solid_cable का उपयोग करने के लिए एडॉप्टर विकास में है और इसे cable पर इंगित करें डेटाबेस जिसे हमने अभी कॉन्फ़िगर किया है: development:
adapter: solid_cable
connects_to:
database:
writing: cable
polling_interval: 0.1.seconds
message_retention: 1.day
test:
adapter: test
production:
adapter: solid_cable
connects_to:
database:
writing: cable
polling_interval: 0.1.seconds
message_retention: 1.day
<पी> उपरोक्त cable.yml में , हम डेवलपमेंट एडॉप्टर को solid_cable पर सेट करते हैं और उत्पादन सेटिंग से सेटिंग्स की प्रतिलिपि बनाई। connects_to सेटिंग एक्शन केबल को केबल का उपयोग करने के लिए कहती है डेटाबेस (जैसा कि database.yml में परिभाषित किया गया है ) संदेशों को संग्रहीत करने के लिए। आपको रेल के नवीनतम संस्करण पर भी यह परिवर्तन करना होगा। <पी> छोटे ऐप्स के लिए, आप सॉलिड केबल की तालिका को होल्ड करने के लिए उसी प्राथमिक डेटाबेस का उपयोग कर सकते हैं (स्कीमा को माइग्रेशन में कॉपी करके और अलग डीबी कॉन्फ़िगरेशन को हटाकर)। लेकिन आपके प्राथमिक ऐप डेटा के साथ किसी भी संभावित प्रदर्शन हस्तक्षेप से बचने के लिए एक अलग डेटाबेस का उपयोग करने की अनुशंसा की जाती है। <पी> अंत में, rails db:prepare चलाएँ यह सुनिश्चित करने के लिए कि डेटाबेस तैयार है। यदि आप अपना ऐप शिपिंग कर रहे हैं तो आपको उत्पादन में भी ऐसा करना होगा। एक्शन केबल चैनल स्थापित करना
<पी> एक्शन केबल चैनलों के माध्यम से संचालित होता है, जो रूबी वर्ग हैं जो डेटा की धाराओं को संभालते हैं। यह कुछ हद तक HTTP अनुरोधों को संभालने वाले नियंत्रकों के समान है। आइए अपनी चैट सुविधा के लिए एक चैनल बनाएं। हम इसे UserChatChannel कहेंगे . जनरेटर का उपयोग करें: rails generate channel UserChat
<पी> जेनरेट किए गए app/channels/user_chat_channel.rb को खोलें , और नए तर्क शामिल करने के लिए इसे अद्यतन करें। <पी> जब कोई ग्राहक UserChatChannel की सदस्यता लेता है (चैट पेज खोलकर), subscribed कॉलबैक लागू किया गया है. हम stream_from "user_chat_channel" पर कॉल करना चाहते हैं "user_chat_channel" नामक प्रसारण से स्ट्रीमिंग शुरू करने के लिए इस कॉलबैक में . <पी> अनिवार्य रूप से, हम कह रहे हैं "user_chat_channel पर प्रसारित होने वाले किसी भी डेटा को सुनें स्ट्रीम करें और इसे इस चैनल के ग्राहकों तक पहुंचाएं।" इस चैनल की सदस्यता लेने वाले सभी उपयोगकर्ताओं को "user_chat_channel" पर संदेश प्रसारण प्राप्त होगा . <पी> हम एक कस्टम क्रिया भी परिभाषित करना चाहते हैं, हम इसे talk(data) कहेंगे . किसी चैनल में किसी भी सार्वजनिक विधि को क्लाइंट की ओर से लागू किया जा सकता है। इस मामले में, जब ग्राहक perform("talk", { content: "Hello World" }) पर कॉल करता है , talk विधि सर्वर पर निष्पादित होती है। <पी> talk का हमारा कार्यान्वयन क्लाइंट द्वारा भेजे गए संदेश सामग्री को लेता है और ActionCable.server.broadcast का उपयोग करता है इसे "user_chat_channel" की सदस्यता लेने वाले सभी लोगों को भेजने के लिए . इसका मतलब है कि प्रत्येक ग्राहक (प्रेषक सहित) को वास्तविक समय में संदेश डेटा प्राप्त होगा। हम बस एक हैश प्रसारित करते हैं जिसमें संदेश पाठ होता है; आप आवश्यकतानुसार अन्य जानकारी (जैसे उपयोगकर्ता नाम या टाइमस्टैम्प) शामिल कर सकते हैं। ध्यान दें: एक वास्तविक ऐप में, आप संदेश को डेटाबेस पर भी जारी रख सकते हैं या यहां सत्यापन कर सकते हैं। सरलता के लिए, हम इसे केवल प्रसारित कर रहे हैं। class UserChatChannel < ApplicationCable::Channel
def subscribed
stream_from "user_chat_channel"
end
def unsubscribed
# Any cleanup needed when unsubscribing from the channel
end
def talk(data)
message = data["content"]
ActionCable.server.broadcast("user_chat_channel", { content: message })
end
end
क्लाइंट में हमारे चैनल का उपभोक्ता बनाना
<पी> अब जब हमने बैकएंड बना लिया है, तो हमें फ्रंट-एंड को जोड़ने की जरूरत है ताकि उपयोगकर्ता वास्तविक समय की कार्यक्षमता प्रदर्शित करने के लिए वेबसॉकेट के माध्यम से संदेश भेज और प्राप्त कर सकें। <पी> रेल्स 8 एक्शन केबल के जावास्क्रिप्ट सामग्री के साथ आता है। जनरेटर ने एक app/javascript/channels/user_chat_channel.js बनाया हमारे लिए फ़ाइल करें. हम आगे ग्राहक व्यवहार को वहां लागू करेंगे। <पी> app/javascript/channels/user_chat_channel.js खोलें और इसे अपडेट करें: import consumer from "channels/consumer";
const userChatChannel = consumer.subscriptions.create("UserChatChannel", {
connected() {
console.log("Connected to UserChatChannel.");
},
disconnected() {
console.log("Disconnected from UserChatChannel.");
},
received(data) {
const messagesDiv = document.getElementById("messages");
if (messagesDiv && data.content) {
const messageElement = document.createElement("p");
messageElement.textContent = data.content;
messagesDiv.appendChild(messageElement);
}
}
});
function sendMessage(content) {
userChatChannel.perform("talk", { content: content });
}
export { sendMessage };
window.sendMessage = sendMessage;
<पी> यहां हम consumer.subscriptions.create("UserChatChannel", {...}) का उपयोग करते हैं हमारे UserChatChannel की सदस्यता बनाने के लिए सर्वर पर. यह एक सब्सक्रिप्शन ऑब्जेक्ट लौटाता है जिसका उपयोग हम चैनल के साथ इंटरैक्ट करने के लिए कर सकते हैं। <पी> connected() कनेक्शन स्थापित होने पर कॉलबैक चलेगा। यहां हम बस कंसोल पर लॉग इन करते हैं ताकि हम देख सकें कि यह काम करता है। <पी> disconnected() यदि WebSocket डिस्कनेक्ट हो जाता है तो कॉलबैक चलता है। <पी> received(data) कॉलबैक महत्वपूर्ण है! जब भी हमारे चैनल को सर्वर से प्रसारण प्राप्त होता है तो यह कॉलबैक सक्रिय हो जाता है। UserChatChannel#talk में हम { content: message } प्रसारित करते हैं . data यहां तर्क वही हैश होगा। कोई नया संदेश आने पर यह सभी कनेक्टेड क्लाइंट के लिए हमारे चैट लॉग को तुरंत अपडेट कर देगा। <पी> हम एक सहायक sendMessage(content) को भी परिभाषित करते हैं वह userChatChannel.perform("talk", { content: ... }) कहता है . यह सर्वर-साइड talk पर एक अनुरोध भेजता है हमारे द्वारा परिभाषित कार्रवाई, जिसमें उपयोगकर्ता द्वारा टाइप की गई संदेश सामग्री भी शामिल है। <पी> अब हमें उपयोगकर्ताओं को संदेश भेजने और प्राप्त करने के लिए एक सरल यूआई की आवश्यकता है। आइए इसके लिए एक बहुत ही बुनियादी दृष्टिकोण बनाएं। हमारे उदाहरण ऐप के लिए एक सरल यूआई बनाना
<पी> सबसे पहले, एक नियंत्रक उत्पन्न करें: rails generate controller UserChat index
<पी> इसके बाद, इंडेक्स व्यू खोलें और इसे कुछ बुनियादी सेटअप दें: <h1>Chats from Users</h1>
<div id="messages" style="border: 1px solid #ccc; padding: 1em; height: 200px; overflow-y: auto; margin-bottom: 1em;">
<!-- Messages will appear here -->
</div>
<form id="chat-form" onsubmit="event.preventDefault(); sendMessage(document.getElementById('chat-input').value); document.getElementById('chat-input').value = '';">
<input type="text" id="chat-input" placeholder="Type a message..." autocomplete="off" style="width: 80%;" />
<button type="submit">Send</button>
</form>
<पी> अंत में, config/routes.rb में इस नए मार्ग को इंगित करने के लिए रूट रूट सेट करें : root "user_chat#index"
दिखा रहा है कि यह सब एक साथ कैसे काम करता है
<पी> हमारा सरल चैट ऐप परीक्षण के लिए तैयार है! प्रोजेक्ट को bin/dev के साथ चलाएँ और localhost:3000 पर जाएं : <पी>
<पी> वास्तविक समय के अपडेट दिखाने के लिए, ऐप को दो अलग-अलग ब्राउज़र टैब में खोलें। एक टैब में, "टैब नंबर 1 से नमस्ते!" जैसा संदेश दर्ज करें <पी>
यदि आप दूसरे टैब से कोई संदेश भेजते हैं, तो आप उसे पहले टैब में दिखाई देगा! <पी>
रेल एक्शन केबल को उत्पादन में तैनात करना
<पी> सॉलिड केबल वेबसॉकेट संदेशों को डेटाबेस तालिका में संग्रहीत करता है, और ऊपर दिए गए हमारे उदाहरण में डिफ़ॉल्ट cable का उपयोग किया गया है। डेटाबेस. रेल्स 8 नए ऐप्स में सॉलिड केबल के लिए SQLite का उपयोग करने में भी डिफ़ॉल्ट है, लेकिन आप तकनीकी रूप से इसे cable जोड़कर किसी भी रेल-समर्थित डेटाबेस पर इंगित कर सकते हैं। config/database.yml में अनुभाग . <पी> वास्तव में, उत्पादन में सॉलिड केबल के लिए एक अलग डेटाबेस का उपयोग करने की अनुशंसा की जाती है रीयल-टाइम मैसेजिंग लोड को आपके शेष डेटा से अलग करने के लिए। उदाहरण के लिए, आप एक समर्पित app_production_cable का प्रावधान कर सकते हैं सॉलिड केबल के लिए डेटाबेस जबकि आपका प्राथमिक ऐप डेटा app_production में रहता है . <पी> यह पृथक्करण चैट या अधिसूचना ट्रैफ़िक को आपके मुख्य एप्लिकेशन प्रश्नों से जूझने से रोकता है। जैसा कि कहा गया है, छोटे ऐप्स के लिए, ऐप डेटा और केबल संदेशों दोनों के लिए एकल डेटाबेस का उपयोग करना आमतौर पर ठीक होता है। <पी> गैर-स्पष्ट हिस्सा यह सुनिश्चित करना है कि सॉलिड केबल डेटाबेस आपके परिनियोजन सेटअप में शामिल है। यदि आप एक अलग डेटाबेस का उपयोग करते हैं, तो rails db:prepare चलाना याद रखें या rails db:migrate ताकि रेल messages बनाए उत्पादन में तालिका. <पी> ध्यान रखें कि प्रत्येक WebSocket कनेक्शन सर्वर मेमोरी की खपत करता है, इसलिए सुनिश्चित करें कि आपके सर्वर के पास आपके लिए आवश्यक कनेक्शनों की संख्या को संभालने के लिए पर्याप्त संसाधन हैं। मतदान अंतराल कॉन्फ़िगर करना
<पी> सॉलिड केबल के लिए मतदान आवृत्ति कॉन्फ़िगर करने योग्य है, जो आपको डेटाबेस लोड के साथ विलंबता को संतुलित करने की अनुमति देती है। अंतराल कम करने से अधिक बार मतदान होता है, जिससे नए संदेशों को लेने का समय कम हो जाता है, लेकिन आपके डेटाबेस पर अधिक SELECT क्वेरीज़ की कीमत पर। <पी> इसके विपरीत, एक लंबा अंतराल डेटाबेस के उपयोग को कम करेगा लेकिन प्रसारण और अपडेट में अधिक देरी लाएगा। व्यवहार में, डिफ़ॉल्ट 0.1s (प्रति सेकंड 10 पोल) एक अच्छा प्रारंभिक बिंदु है जो अधिकांश डेटाबेस पर दबाव डाले बिना वास्तविक समय में अपडेट प्रदान करता है। सॉलिड केबल सॉलिड ट्राइफेक्टा का एक आवश्यक स्तंभ है
<पी> आपने देखा है कि कैसे रेल्स एक्शन केबल वास्तविक समय संचार के लिए वेबसॉकेट को रेल्स में लाता है, और कैसे सॉलिड केबल रेडिस के बिना इसे संभव बनाता है। क्या आप जानते हैं कि रेल में दो अन्य "सॉलिड" लाइब्रेरी हैं ? सॉलिड कैश रेडिस के बिना कैश करना आसान बनाता है, और सॉलिड क्यू आपको रेडिस के बिना पृष्ठभूमि कार्यों को संसाधित करने देता है। <पी> "सॉलिड ट्राइफेक्टा" का उपयोग करने से आपको न्यूनतम बुनियादी ढांचे के ओवरहेड के साथ इंटरैक्टिव एप्लिकेशन बनाने के लिए एक उल्लेखनीय कार्यात्मक ढांचा मिलता है। <पी> सॉलिड केबल और उसके भाई-बहनों का मुख्य लाभ सरलता है। हमारे रेल्स ऐप की वास्तविक समय की कार्यक्षमता पर्दे के पीछे ऐप के डेटाबेस के साथ बॉक्स से बाहर काम करती है। परिनियोजन सरल है (कोई Redis या अतिरिक्त सेवाएँ नहीं), और कई अनुप्रयोगों के लिए, प्रदर्शन पर्याप्त से अधिक है। <पी> बेशक, उत्पादन में कोई भी रेल एप्लिकेशन चलाते समय, आपको उन समस्याओं की निगरानी करनी चाहिए जिनका आपके उपयोगकर्ताओं को सामना करना पड़ सकता है। क्या आप जानना नहीं चाहेंगे कि आपके एक्शन केबल उपभोक्ताओं और चैनलों के साथ कब कुछ गलत होता है आपके उपयोगकर्ताओं से पहले ? <पी> हनीबैगर रेल त्रुटि और प्रदर्शन निगरानी के लिए एक उत्कृष्ट विकल्प है, जो वास्तविक समय अनुप्रयोगों को तैनात करने के लिए महत्वपूर्ण हैं। जब आपके एप्लिकेशन में कहीं भी बैकएंड और क्लाइंट साइड में त्रुटियां होती हैं तो हनीबैगर आपको तुरंत सचेत करता है और तेजी से खोज, समस्या निवारण और समाधान के लिए आपके एप्लिकेशन लॉग और प्रदर्शन डेटा को खींचता है। <पी> आरंभ करने के लिए हनीबेजर के लिए साइन अप करें!