<पी> वर्सेल केवी वेब परियोजनाओं के लिए एक अमूल्य उपकरण है, फिर भी इसके व्यापक उपयोग से HTTP अनुरोधों की संख्या में तेजी से वृद्धि हो सकती है, जो संभावित रूप से प्रदर्शन को प्रभावित कर सकती है। जबकि रेडिस पाइपलाइन कमांड को बैचने और अनुरोधों को कम करने का एक तरीका प्रदान करती है, उन्हें लागू करना मुश्किल हो सकता है। क्या कोई ऐसा समाधान है जो पाइपलाइनों की दक्षता को बुनियादी रेडिस कमांड की सरलता के साथ जोड़ता है? ऑटो-पाइपलाइनिंग आती है - कोडिंग जटिलता के बिना प्रदर्शन को बढ़ाने का एक सहज तरीका प्रदान करना। समस्या
<पी> कल्पना कीजिए कि आपने एक वेबपेज बनाया है जहां रेडिस का उपयोग बड़े पैमाने पर डेटा स्रोत के रूप में किया जाता है। कई घटक अपनी स्वयं की रेडिस कॉल कर रहे हैं, कुछ को अलग-अलग सामग्री के साथ कई बार प्रस्तुत किया जा रहा है। <पी> यह सेटअप हर बार वेबपेज खुलने पर रेडिस के लिए बड़ी संख्या में अनुरोध उत्पन्न कर सकता है। अनुरोधों की विशाल मात्रा काफी ओवरहेड लाती है, जिससे प्रदर्शन प्रभावित होता है। इसके अतिरिक्त, क्लाउडफ्लेयर वर्कर्स जैसे वातावरण में, जहां समवर्ती HTTP अनुरोधों की संख्या गंभीर रूप से सीमित है, यह एक गंभीर मुद्दा बन जाता है। नियमित पाइपलाइन
<पी> ऐसी स्थितियों में एक पारंपरिक समाधान रेडिस पाइपलाइनों का उपयोग करना है। एक-एक करके अनुरोध भेजने के बजाय, पाइपलाइन आपको कई कमांड एकत्र करने और उन्हें एक साथ निष्पादित करने की अनुमति देती है। इस तरह, एक एकल HTTP अनुरोध में कई Redis कमांड होते हैं, जिससे HTTP अनुरोधों की संख्या काफी कम हो जाती है और प्रदर्शन में सुधार होता है। import { kv } from '@vercel/kv';
const pipeline = kv.pipeline();
pipeline.set("foo", "bar");
pipeline.get("foo");
const res = await pipeline.exec();
console.log(res); // ["OK", "bar"]
पाइपलाइनों के नुकसान
<पी> हालाँकि, पाइपलाइनों का उपयोग एक प्रोग्रामर के दृष्टिकोण से महत्वपूर्ण ओवरहेड का परिचय देता है। पाइपलाइन एपीआई मानक रेडिस एपीआई से भिन्न है, जिससे इसे सक्षम या अक्षम करना एक गैर-तुच्छ कार्य बन जाता है। <पी> इसके अलावा, यदि आपको एक ही पाइपलाइन के भीतर विभिन्न घटकों के लिए डेटा का अनुरोध करने की आवश्यकता है, तो आपको फ़ेचिंग लॉजिक को उस जगह से अलग लिखना होगा जहां डेटा का उपयोग किया जाएगा। इस अलगाव से खंडित और कम रखरखाव योग्य कोडबेस बन सकता है। ऑटो-पाइपलाइनिंग
<पी> ऑटो-पाइपलाइनिंग इन मुद्दों को सहजता से संबोधित करती है। ऑटो-पाइपलाइनिंग के साथ, आप अपने मौजूदा कोड को बदले बिना अपने प्रोजेक्ट में पाइपलाइन कार्यक्षमता को सक्षम कर सकते हैं। आप रेडिस का उपयोग हमेशा की तरह जारी रख सकते हैं, जबकि रेडिस क्लाइंट जब भी संभव हो स्वचालित रूप से कमांड बैच करता है, जिससे प्रदर्शन सहजता से बढ़ता है। <पी> आइए देखें कि ऑटो-पाइपलाइनिंग एक सामान्य परिदृश्य को कैसे अनुकूलित करती है:एकाधिक कुंजियों के लिए मान प्राप्त करना: const keys = ["key1", "key2", "key3"];
const values = await Promise.all(keys.map(key => kv.get(key)));
<पी> पाइपलाइनों के बिना, यह कोड रेडिस को तीन HTTP अनुरोध भेजेगा। हालाँकि, ऑटो-पाइपलाइनिंग सक्षम होने पर, इन अनुरोधों को एक एकल HTTP अनुरोध में बैच किया जाएगा। मुहावरेदार रिएक्ट सर्वर घटकों के लिए ऑटो-पाइपलाइन
<पी> रिएक्ट सर्वर कंपोनेंट्स (आरएससी) अपना स्वयं का डेटा प्राप्त कर सकते हैं। एक सामान्य उदाहरण एक ट्वीट घटक है जिसे इस तरह लागू किया जा सकता है async function Tweet({id}) {
const tweet = kv.get(`tweets:${id}`)
return <div>{tweet.text}</div>
}
<पी> यदि आप इस घटक को जैसे लूप में कॉल करते हैं {tweetIds.map(id => <Tweet id={id} />)}
<पी> आप उपरोक्त उदाहरण के अनुसार समान एन बैकएंड अनुरोधों को ट्रिगर करते हैं। एक बार फिर, ऑटो-पाइपलाइनिंग को सक्रिय करने से मुहावरेदार प्रतिक्रिया कोड को बनाए रखते हुए एन कमांड को एक ही पाइपलाइन में बैच दिया जाता है। यह कैसे काम करता है
<पी> ऑटो-पाइपलाइनिंग पृष्ठभूमि में 'सक्रिय पाइपलाइन' बनाए रखकर काम करती है। कमांड स्वयं को पाइपलाइन में जोड़ते हैं और deferExecution को लागू करते हैं : private async deferExecution() {
await Promise.resolve()
return await Promise.resolve()
}
<पी> deferExecution पर कॉल करने पर , कमांड Node.js मुख्य थ्रेड का नियंत्रण देता है। अगला GET अनुक्रम में कमांड फिर थ्रेड पर नियंत्रण हासिल कर लेता है और इसके निष्पादन के साथ आगे बढ़ता है, बिल्कुल पहले GET जैसा ही काम करता है। :स्वयं को सक्रिय पाइपलाइन में जोड़ना और थ्रेड का नियंत्रण प्रदान करना। <पी> यहां छद्म कोड के रूप में ऑटो पाइपलाइन तर्क दिया गया है: let activePipeline: Pipeline;
let pipelinePromises: new WeakMap<Pipeline, Promise<Array<unknown>>>();
let commandIndex: number;
const executeCommand = (command) => {
activePipeline = activePipeline || createNewPipeline();
activePipeline.addCommand(command);
commandIndex++;
const pipelinePromise = deferExecution().then(() => {
if (!pipelinePromises.has(activePipeline) {
const pipelinePromise = pipeline.exec();
pipelinePromises.set(pipeline, pipelinePromise);
activePipeline = null;
commandIndex = 0
};
return pipelinePromises.get(activePipeline)!;
});
const result = await pipelinePromise;
return result[commandIndex];
};
<पी> स्वयं को सक्रिय पाइपलाइन में जोड़ने के बाद, तीसरा GET deferExecution पर भी कॉल करता है . इस बिंदु पर, चूंकि आगे बढ़ने के लिए कोई अन्य आदेश नहीं हैं, इसलिए स्थगित GET में से एक कमांड नियंत्रण पुनः प्राप्त करेंगे और पाइपलाइन को निष्पादित करेंगे। <पी> यह पाइपलाइन हमारे उदाहरण में तीन परिणाम लौटाती है, प्रत्येक प्रारंभिक कमांड के अनुरूप है। प्रत्येक कमांड अपने तर्क के सूचकांक को ट्रैक करता है, यह सुनिश्चित करते हुए कि उसे बैच प्रतिक्रिया से सही परिणाम प्राप्त होता है। <पी> ऑटो-पाइपलाइनिंग तर्क के पीछे का कोड यहां उपलब्ध है। v0.dev में ऑटो-पाइपलाइनिंग
<पी> V0.dev के प्रदर्शन पर ऑटो-पाइपलाइनिंग का प्रभाव लैंडिंग पृष्ठ में सुधार से स्पष्ट है। लैंडिंग पृष्ठ पिछली क्वेरी और पीढ़ियों के उदाहरण दिखाता है। सबसे पहले, यह प्रदर्शित करने के लिए आइटमों की सूची लाता है और फिर प्रत्येक आइटम के लिए अलग-अलग फ़ेच करता है, जिसके परिणामस्वरूप कई रेडिस अनुरोध होते हैं। <पी>
<पी> ऑटो-पाइपलाइनिंग को सक्षम करने के बाद, इस प्रक्रिया को एक स्विच के फ्लिप के साथ अनुकूलित किया जाता है। अब, दूसरा भाग, जिसमें कई अलग-अलग फ़ेच शामिल होते थे, को एक एकल पाइपलाइन ऑपरेशन में समेकित किया गया है। <पी> ऑटो-पाइपलाइनिंग के कार्यान्वयन से पहले, इन रेडिस अनुरोधों के कारण बड़ी संख्या में व्यक्तिगत HTTP अनुरोध आए, जिससे पेज लोड समय धीमा हो गया। हालाँकि, ऑटो-पाइपलाइनिंग सक्षम होने से, इन अनुरोधों को कुशलतापूर्वक पाइपलाइनों में बैच किया जाता है, जिससे आवश्यक HTTP अनुरोधों की संख्या कम हो जाती है। परिणामस्वरूप, पेज लोड समय में सुधार हुआ है, जो लगभग 450ms से घटकर लगभग 200ms हो गया है। <पी> V0 टीम ने शुरुआत में ऑटो-पाइपलाइनिंग को अपने लिए एक हैक के रूप में भेजा। ऑटो-पाइपलाइनिंग अब अपस्टैश के रेडिस क्लाइंट के v1.31.3 के साथ-साथ वर्सेल केवी के v2.0 में उपलब्ध है।