Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

अपस्टैश रेडिस, नेक्स्ट.जेएस सर्वर एक्शन और वर्सेल के साथ रीयल-टाइम सूचनाएं:एक चरण-दर-चरण मार्गदर्शिका

<पी> इस पोस्ट में, मैं इस बारे में बात करता हूं कि कैसे मैंने अपस्टैश रेडिस, नेक्स्ट.जेएस सर्वर एक्शन और वर्सेल के साथ सर्वर-भेजे गए इवेंट का उपयोग करके वास्तविक समय सूचनाएं बनाईं। अपस्टैश रेडिस में संदेश चैनलों का लाभ उठाने से आपके अनुप्रयोगों की संचार वास्तुकला में उल्लेखनीय वृद्धि हो सकती है, जिससे वे अधिक प्रतिक्रियाशील और गतिशील बन सकते हैं।

डेमो

हम क्या उपयोग करेंगे

  • Next.js (फ्रंट-एंड और बैक-एंड)
  • अपस्टैश रेडिस (पब्लिश कमांड के साथ सर्वर द्वारा भेजे गए इवेंट)
  • टेलविंड सीएसएस (स्टाइलिंग)
  • वर्सेल (तैनाती)

आपको क्या चाहिए

  • Node.js 18
  • एक अपस्टैश खाता
  • एक वर्सेल खाता

अपस्टैश रेडिस की स्थापना

<पी> एक बार जब आप एक अपस्टैश खाता बना लेते हैं और लॉग इन हो जाते हैं तो आप रेडिस टैब पर जाएंगे और एक डेटाबेस बनाएंगे।

<पी> अपस्टैश रेडिस, नेक्स्ट.जेएस सर्वर एक्शन और वर्सेल के साथ रीयल-टाइम सूचनाएं:एक चरण-दर-चरण मार्गदर्शिका

<पी> अपस्टैश रेडिस, नेक्स्ट.जेएस सर्वर एक्शन और वर्सेल के साथ रीयल-टाइम सूचनाएं:एक चरण-दर-चरण मार्गदर्शिका

<पी> अपना डेटाबेस बनाने के बाद, आप विवरण टैब पर जा रहे हैं। जब तक आपको अपना डेटाबेस कनेक्ट करें अनुभाग नहीं मिल जाता तब तक नीचे स्क्रॉल करें। रेडिस यूआरएल को कॉपी करें और इसे कहीं सुरक्षित रखें, हम इसे UPSTASH_REDIS_URL के रूप में उपयोग करेंगे हमारे पर्यावरण चर के रूप में।

<पी> अपस्टैश रेडिस, नेक्स्ट.जेएस सर्वर एक्शन और वर्सेल के साथ रीयल-टाइम सूचनाएं:एक चरण-दर-चरण मार्गदर्शिका

<पी> इसके अलावा, तब तक नीचे स्क्रॉल करें जब तक आपको REST API अनुभाग न मिल जाए और .env का चयन करें बटन. सामग्री को कॉपी करें और इसे किसी सुरक्षित स्थान पर सहेजें, हम UPSTASH_REDIS_REST_URL के रूप में प्राप्त वेरिएबल का उपयोग करेंगे और UPSTASH_REDIS_REST_TOKEN .

<पी> अपस्टैश रेडिस, नेक्स्ट.जेएस सर्वर एक्शन और वर्सेल के साथ रीयल-टाइम सूचनाएं:एक चरण-दर-चरण मार्गदर्शिका

प्रोजेक्ट की स्थापना

<पी> सेट अप करने के लिए, बस ऐप रेपो को क्लोन करें और इसमें जो कुछ भी है उसे जानने के लिए इस ट्यूटोरियल का अनुसरण करें। प्रोजेक्ट को फोर्क करने के लिए, चलाएँ:

git clone https://github.com/rishi-raj-jain/upstash-nextjs-publish-messages-with-sse-example
cd upstash-nextjs-publish-messages-with-sse-example
npm install
<पी> एक बार जब आप रेपो क्लोन कर लेते हैं, तो आप एक .env फ़ाइल बनाने जा रहे हैं। आप उपरोक्त अनुभागों से हमारे द्वारा सहेजे गए आइटम जोड़ने जा रहे हैं।

<पी> इसे कुछ इस तरह दिखना चाहिए:

# .env
 
# Obtained from the steps as above
 
# Upstash Redis Secrets
UPSTASH_REDIS_URL="rediss://default:...@...-...-...-....upstash.io:..."
UPSTASH_REDIS_REST_URL="https://...-...-...-....upstash.io"
UPSTASH_REDIS_REST_TOKEN="...="
<पी> ध्यान दें कि UPSTASH_REDIS_URL पर कैसे वेरिएबल "रेडिस" कहता है न कि "रेडिस", यानी टीएलएस/एसएसएल विकल्प का उपयोग करें।

<पी> इन चरणों के बाद, आपको निम्न आदेश का उपयोग करके स्थानीय वातावरण प्रारंभ करने में सक्षम होना चाहिए:

npm run dev

रिपॉजिटरी संरचना

<पी> यह प्रोजेक्ट की मुख्य फ़ोल्डर संरचना है। मैंने उन फ़ाइलों को लाल रंग में चिह्नित किया है जिन पर इस पोस्ट में आगे चर्चा की जाएगी जो निम्नलिखित से संबंधित हैं:

  • अपस्टैश रेडिस में संदेश चैनलों को समझना
  • नेक्स्ट.जेएस ऐप राउटर में सर्वर-सेंटेड इवेंट एपीआई बनाना
  • सूचनाएं प्रकाशित करने के लिए अपस्टैश रेडिस के साथ नेक्स्ट.जेएस सर्वर एक्शन सेटअप करें
  • वास्तविक समय में सूचनाएं लगातार सुनने और प्रदर्शित करने के लिए Next.js फ्रंटएंड सेटअप करें
<पी> अपस्टैश रेडिस, नेक्स्ट.जेएस सर्वर एक्शन और वर्सेल के साथ रीयल-टाइम सूचनाएं:एक चरण-दर-चरण मार्गदर्शिका

अपस्टैश रेडिस में संदेश चैनलों को समझना

<पी> अपस्टैश रेडिस में, प्रकाशन/सदस्यता मॉडल संदेश चैनलों के मूल में है। प्रकाशक नामित चैनलों पर संदेश प्रसारित करते हैं, और ग्राहक वास्तविक समय में विशिष्ट चैनलों से संदेश प्राप्त करने में सक्षम होते हैं। यह मॉडल किसी एप्लिकेशन के विभिन्न हिस्सों के बीच निर्बाध संचार को सक्षम बनाता है।

<पी> यहां बताया गया है कि एज संगत लाइब्रेरी, @upstash/redis का उपयोग करके किसी चैनल पर संदेश कैसे प्रकाशित किए जा सकते हैं 👇🏻

import { Redis } from '@upstash/redis'
 
// Connect to an Upstash Redis instance
const redis = Redis.fromEnv()
 
// Publish a message to the Upstash Redis instance
await redis.publish('posts', JSON.stringify({ date: new Date().toString(), message: "I am a new message." }))
<पी> यहां बताया गया है कि ग्राहक अपस्टैश रेडिस चैनल को कैसे सुन सकते हैं (यहां, posts ) नोड संगत लाइब्रेरी के साथ, ioredis 👇🏻

// Use ioredis to be able to subscribe to an Upstash Redis instance
import Redis from 'ioredis'
 
// Create an Upstash Redis Subscriber instance
const redisSubscriber = new Redis(process.env.UPSTASH_REDIS_URL)
 
// Define the key to listen and publish messages to
const setKey = 'posts'
 
// Subscribe to Redis updates for the key: "posts"
// In case of any error, just log it
redisSubscriber.subscribe(setKey, (err) => {
 if (err) console.log(err)
})
 
// Listen for new posts from Redis
redisSubscriber.on('message', (channel, message) => {
 // Log the data when the channel message is received is same as the message is published to
 if (channel === setKey) console.log(mesage)
})
<पी> किसी चैनल पर एक संदेश प्रकाशित करने पर, सभी ग्राहकों को तुरंत संदेश प्राप्त होता है, जिससे अपस्टैश रेडिस के भीतर कुशल और वास्तविक समय संचार की अनुमति मिलती है।

नेक्स्ट.जेएस ऐप राउटर में सर्वर-सेंटेड इवेंट एपीआई बनाना

<पी> सर्वर-भेजे गए इवेंट कई क्लाइंट अनुरोधों की आवश्यकता के बिना वास्तविक समय में नया डेटा भेजने का एक शक्तिशाली तरीका है। पारंपरिक अनुरोध-प्रतिक्रिया तंत्र के विपरीत, एसएसई एकल, लंबे समय तक चलने वाले HTTP कनेक्शन पर सर्वर से क्लाइंट तक डेटा के यूनिडायरेक्शनल प्रवाह को सक्षम बनाता है।

<पी> यहां बताया गया है कि आप Next.js ऐप राउटर में सर्वर-भेजे गए इवेंट को कैसे लागू कर सकते हैं 👇🏻

// File: app/api/stream/route.js
 
// Prevents this route's response from being cached on Vercel
export const dynamic = 'force-dynamic'
 
export async function GET() {
 const encoder = new TextEncoder()
 // Create a streaming response
 const customReadable = new ReadableStream({
 start(controller) {
 const message = 'Hey, I am a message.'
 controller.enqueue(encoder.encode(`data: ${message}\n\n`))
 },
 })
 // Return the stream response and keep the connection alive
 return new Response(customReadable, {
 // Set the headers for Server-Sent Events (SSE)
 headers: {
 'Content-Type': 'text/event-stream; charset=utf-8',
 Connection: 'keep-alive',
 'Cache-Control': 'no-cache, no-transform',
 'Content-Encoding': 'none'
 },
 })
}

Next.js सर्वर क्रियाओं का उपयोग करके अपस्टैश रेडिस पर संदेश प्रकाशित करना

<पी> Next.js सर्वर क्रियाएँ आपको Next.js में सीधे आपके फ्रंटएंड कोड के भीतर सर्वर-साइड लॉजिक को परिभाषित करने की अनुमति देती हैं। यह मैन्युअल रूप से एपीआई रूट बनाने की प्रक्रिया और फॉर्म जमा करने की स्थिति को सबमिट करने और ट्रैक करने की परेशानी से बचाता है।

<पी> use server के साथ फ़ंक्शन के शीर्ष पर, हम यह सुनिश्चित करने में सक्षम हैं कि फ़ंक्शन केवल सर्वर-साइड चलता है। हमारे फॉर्म सबमिशन सर्वर एक्शन के अंदर, हम message निकालते हैं फॉर्म से मूल्य, उपयोगकर्ता का देश प्राप्त करने के लिए वर्सेल हेडर का उपयोग करें और जानकारी को posts पर एक संदेश के रूप में प्रकाशित करें। अपस्टैश रेडिस संदेश चैनल।

// File: app/actions.jsx
 
'use server'
 
import { Redis } from '@upstash/redis'
import { headers } from 'next/headers'
 
// The function that takes care of obtaining the country code from Vercel headers
// And publishing messages to the Upstash Redis database with the current timestamp
export async function publishNotification(formData) {
 'use server'
 const redis = Redis.fromEnv()
 
 // Extract the message in the form submitted
 const message = formData.get('message')
 
 // Obtain country of the user using Vercel's x-vercel-ip-country header
 const headersList = headers()
 const country = headersList.get('x-vercel-ip-country')
 
 // Publish the message to the "posts" channel in Upstash Redis
 await redis.publish(
 'posts',
 JSON.stringify({
 message,
 country,
 date: new Date().toString(),
 }))
}
<पी> फॉर्म सबमिट होते ही इस सर्वर एक्शन को लागू करने के लिए, हम इसे फॉर्म action के हैंडलर के रूप में पास करते हैं। घटना.

// File: app/page.jsx
 
// Import the server action
import { publishNotification } from './actions'
 
const Home = () => {
 return (
 <>
 <div>
 <form
 
 /* set the server action to invoked as form is submitted */
 action={publishNotification}
 
 >
 {/* Place a client side form component here */}
 </form>
 </div>
 </>
 )
}
 
export default Home

रिएक्ट के उपयोगफॉर्मस्टैटस हुक के साथ फॉर्म सबमिशन के दौरान लंबित स्थिति प्रदर्शित करने के लिए Next.js फ्रंटएंड को सेटअप करें

<पी> निम्नलिखित कोड फॉर्म सबमिशन को संभालने और pending प्रदर्शित करने के लिए नेक्स्ट.जेएस फॉर्म क्लाइंट साइड घटक के सेटअप को प्रदर्शित करता है। रिएक्ट के useFormStatus का उपयोग करके बताएं हुक. आइए कोड के प्रमुख तत्वों को तोड़ें:

  • हाल ही में जारी [useFormStatus को आयात किया जा रहा है रिएक्ट से हुक](https://react.dev/reference/react-dom/hooks/useFormStatus), जो आपको अंतिम फॉर्म सबमिशन की स्थिति की जानकारी देता है।
  • pending का उपयोग करना प्रतिक्रियाशील वैरिएबल बताएं जो दर्शाता है कि फॉर्म सबमिशन प्रगति पर है या नहीं।
  • यदि सबमिशन लंबित नहीं है, तो reset फॉर्म.
  • pending का उपयोग करें फॉर्म की सशर्त स्थिति दिखाने के लिए बूलियन।
'use client'
 
import { useEffect } from 'react'
import { useFormStatus } from 'react-dom'
 
const Form = () => {
 
 // Use React's useFormStatus hook to detect form submission state
 const { pending } = useFormStatus()
 
 useEffect(() => {
 // If the form is not pending, reset the form
 if (!pending) document.getElementById('publish-form').reset()
 }, [pending])
 
 return (
 <>
 <input placeholder="Your message" className="border rounded px-3 outline-none focus:border-black/50 py-2" type="text" name="message" required />
 <button
 /* Disable button click while the form submission is pending */
 disabled={pending}
 className="hover:border-black/50 max-w-max border rounded py-1 px-3" type="submit"
 >
 {/* Display "pending" state placeholder */}
 {pending ? (
 <div className="flex flex-row gap-x-2 items-center">
 <div className="animate-spin border border-gray-800 rounded-full h-[15px] w-[15px]"></div>
 <span>Publishing</span>
 </div>
 ) : (
 <>Publish Notification &rarr;</>
 )}
 </button>
 </>
 )
}
 
export default Form

सर्वर द्वारा भेजे गए ईवेंट को लगातार सुनने के लिए Next.js फ्रंटएंड सेटअप करें

<पी> इस अनुभाग में, हम सीखेंगे कि सर्वर-भेजे गए इवेंट एपीआई संदेशों के लिए न्यूनतम श्रोता को कैसे सेटअप किया जाए, और एसएसई एपीआई से कनेक्शन जारी रखने के लिए एक दृष्टिकोण कैसे बनाया जाए।

रिएक्ट फ्रंटएंड में सर्वर-भेजे गए इवेंट एपीआई को सुनना

<पी> रिएक्ट में हमारे क्लाइंट साइड घटक में एसएसई एपीआई को सुनने के लिए, हम useEffect का उपयोग करते हैं हुक. एसएसई एपीआई से कनेक्शन स्थापित करने के लिए, एक नया EventSource बनाएं उदाहरण /api/stream की ओर इशारा करता है समापनबिंदु. फिर message के लिए एक इवेंट श्रोता संलग्न करें घटना, जहां स्ट्रीम से आने वाले डेटा को JSON के रूप में पार्स किया जाता है और आगे संसाधित किया जाता है या घटक में प्रदर्शित किया जाता है।

<पी> अंत में, कोड में घटक के अनमाउंट होने पर एसएसई कनेक्शन को बंद करने के लिए एक क्लीनअप फ़ंक्शन शामिल होता है, जिससे संभावित मेमोरी लीक को रोका जा सकता है।

import { useEffect, useState } from 'react'
 
const ClientSideComponent = () => {
 
 useEffect(() => {
 
 // Initiate the first call to connect to SSE API
 const eventSource = new EventSource('/api/stream')
 
 eventSource.addEventListener('message', (event) => {
 // Parse the data received from the stream into JSON
 // Add it the list of messages seen on the page
 const tmp = JSON.parse(event.data)
 // Do something with the obtained message
 })
 
 // As the component unmounts, close listener to SSE API
 return () => {
 eventSource.close()
 }
 
 }, [])
 
 return <></>
}
 
export default ClientSideComponent

रिएक्ट फ्रंटएंड में सर्वर-भेजे गए इवेंट एपीआई से कनेक्शन जारी रखना

<पी> रिएक्ट घटक के उन्नत संस्करण में, हमने त्रुटियों को संभालकर और स्वचालित रूप से पुन:कनेक्ट करके एसएसई एपीआई से निरंतर और लगातार कनेक्शन सुनिश्चित करने के लिए एक तंत्र लागू किया है।

<पी> यह connectToStream के माध्यम से हासिल किया गया है फ़ंक्शन जो SSE API से कनेक्शन स्थापित करने और बनाए रखने के लिए ज़िम्मेदार है।

<पी> यहां इसकी कार्यप्रणाली का विवरण दिया गया है 👇🏻

  1. प्रारंभिक कनेक्शन और संदेश प्रबंधन:
<पी> फ़ंक्शन एक नया EventSource बनाता है उदाहरण, /api/stream से कनेक्ट करना समापन बिंदु.

// Function to take care of initial connect to the SSE API
// Also, it reconnects to the SSE API as soon as it shuts down
// This keeps the connection alive - forever with micro second delays
const connectToStream = () => {
 // Connect to /api/stream as the SSE API source
 const eventSource = new EventSource('/api/stream')
 // ..
}
<पी> इसके अलावा, यह message के लिए एक इवेंट श्रोता स्थापित करता है इवेंट, जहां स्ट्रीम से आने वाले डेटा को JSON के रूप में पार्स किया जाता है। पार्स किए गए डेटा को फिर रिएक्ट घटक में संसाधित या प्रदर्शित किया जा सकता है।

const connectToStream = () => {
 // ...
 eventSource.addEventListener('message', (event) => {
 // Parse the data received from the stream into JSON
 // Add it the list of messages seen on the page
 const tmp = JSON.parse(event.data)
 setPosts((prevPosts) => [...prevPosts, tmp])
 })
 // ...
}
  1. त्रुटि प्रबंधन और स्वचालित पुन:कनेक्शन:
<पी> error के लिए एक अतिरिक्त ईवेंट श्रोता सेट किया गया है घटना. किसी भी त्रुटि की स्थिति में, जैसे कि कनेक्शन विफलता, ईवेंट स्रोत बंद हो जाता है।

<पी> बंद करने के बाद, फ़ंक्शन setTimeout का उपयोग करता है 1 मिलीसेकंड की न्यूनतम देरी के बाद पुनः कनेक्शन ट्रिगर करने के लिए। यह छोटी सी देरी सर्वर पर तीव्र कनेक्शन प्रयासों के दबाव के बिना एक आसान और निरंतर पुन:कनेक्शन प्रक्रिया बनाने में मदद करती है

// In case of any error, close the event source
// So that it attempts to connect again
eventSource.addEventListener('error', () => {
 eventSource.close()
 setTimeout(connectToStream, 1)
})
  1. एसएसई एपीआई स्रोत क्लोजर को संभालना:
<पी> onclose एसएसई एपीआई स्रोत बंद होने पर पता लगाने के लिए ईवेंट का उपयोग किया जाता है। बंद होने पर, फ़ंक्शन थोड़ी देर के बाद स्ट्रीम से कनेक्ट करने का एक और प्रयास शेड्यूल करता है।

// As soon as SSE API source is closed, attempt to reconnect
eventSource.onclose = () => {
 setTimeout(connectToStream, 1)
}
<पी> इन रणनीतियों को संयोजित करके, फ़ंक्शन यह सुनिश्चित करता है कि एसएसई एपीआई से कनेक्शन लगातार बना रहे। यहां तक कि त्रुटियों या बंद होने की स्थिति में भी, रिएक्ट घटक प्रभावी ढंग से निरंतर कनेक्शन बनाए रखते हुए न्यूनतम देरी के साथ पुन:कनेक्ट करने का प्रयास करता रहेगा।

वर्सेल में तैनात करें

<पी> रिपॉजिटरी वर्सेल में तैनात करने के लिए तैयार है। वर्सेल के साथ निर्बाध रूप से तैनात करने के लिए नीचे दिए गए चरणों का पालन करें 👇🏻

  • एक GitHub Repository बनाएं ऐप कोड के साथ
  • एक New Project बनाएं वर्सेल डैशबोर्ड में
  • बनाए गए GitHub Repository को लिंक करें आपके नए प्रोजेक्ट के रूप में
  • नीचे स्क्रॉल करें और Environment Variables को अपडेट करें .env से स्थानीय स्तर पर
  • तैनाती! 🚀

संदर्भ


  1. शीर्ष 10 नि:शुल्क Android खेल शीर्ष 10 नि:शुल्क Android खेल

    मैं आपके लिए सबसे अच्छा मुफ्त एंड्रॉइड गेम लाता हूं। यदि आप उन सभी को पसंद करते हैं, ठीक है, आप उन सभी को डाउनलोड कर सकते हैं, आखिरकार मैंने उल्लेख किया कि ये मुफ़्त थे! उनमें से सभी नवीनतम नहीं हैं जिन्हें आप आज डाउनलोड कर सकते हैं, लेकिन इन खेलों में लोकप्रियता और अद्भुत गेम खेलने के अनुभवों पर जो

  1. रेडिस सेंटिनल बनाम रेडिस क्लस्टर:वे कैसे तुलना करते हैं और किसे चुनना है रेडिस सेंटिनल बनाम रेडिस क्लस्टर:वे कैसे तुलना करते हैं और किसे चुनना है

    इस वीडियो को देखने के लिए कृपया जावास्क्रिप्ट सक्षम करें, और HTML5 वीडियो का समर्थन करने वाले वेब ब्राउज़र में अपग्रेड करने पर विचार करें 20 मार्च 1.9 हजार 500 3 निधि शर्मा अनुशंसित वीडियो रेडिस वितरित ताले की व्याख्या:सुरक्षित पैटर्न और सामान्य नुकसान बैभव कुमार 16 मार

  1. एचटीएमएल डोम इनपुट रेडियो फॉर्म संपत्ति एचटीएमएल डोम इनपुट रेडियो फॉर्म संपत्ति

    एचटीएमएल डोम इनपुट रेडियो फॉर्म प्रॉपर्टी का उपयोग फॉर्म संदर्भ को वापस करने के लिए किया जाता है जिसमें दिए गए इनपुट रेडियो बटन होते हैं। यदि रेडियो बटन फॉर्म के बाहर है तो यह केवल न्यूल लौटाएगा। यह संपत्ति केवल पढ़ने के लिए है। सिंटैक्स इनपुट रेडियो फॉर्म प्रॉपर्टी के लिए सिंटैक्स निम्नलिखित है -