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

रेडिस के साथ एमसीपी विकास में तेजी लाएं:तेज़, लागत प्रभावी समाधान

<पी> मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) तेजी से एआई मॉडल को बाहरी टूल और डेटा स्रोतों से जोड़ने का मानक तरीका बनता जा रहा है। जैसे-जैसे एमसीपी अपनाना बढ़ रहा है, डेवलपर्स को पता चल रहा है कि मजबूत, उत्पादन-तैयार एमसीपी कार्यान्वयन के निर्माण के लिए केवल विशिष्टताओं का पालन करने से कहीं अधिक की आवश्यकता है:इसके लिए सही बुनियादी ढांचे की आवश्यकता है। इस पोस्ट में, हम यह पता लगाएंगे कि Redis तीन अलग-अलग MCP उपयोग मामलों को कैसे शक्ति प्रदान करता है:वर्सेल के SSE कार्यान्वयन में वितरित सर्वर रहित कार्यों का समन्वय करना, लंबे समय तक चलने वाली स्ट्रीम के लिए ईवेंट पुन:प्रारंभ करने योग्य सक्षम करना, और क्लर्क के साथ सुरक्षित OAuth प्रवाह का प्रबंधन करना।

एमसीपी ट्रांसपोर्ट को समझना

<पी> हमारे उदाहरणों पर गौर करने से पहले, आइए संक्षेप में देखें कि एमसीपी संचार को कैसे संभालता है। MCP दो परिवहनों का समर्थन करता है:Stdio स्थानीय सर्वर और स्ट्रीमयोग्य HTTP के लिए दूरस्थ सर्वर के लिए. अतीत में, रिमोट सर्वर के लिए एक एसएसई (सर्वर-सेंटेड इवेंट) ट्रांसपोर्ट भी था, जो अब बंद हो गया है।

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

केस 1 का उपयोग करें:रेडिस पब/सब के साथ एसएसई

<पी> जब वर्सेल सीटीओ माल्टे ने अपना एमसीपी हैंडलर बनाया, तो उन्हें एक क्लासिक सर्वर रहित चुनौती का सामना करना पड़ा:जब प्रत्येक अनुरोध को एक अलग सर्वर रहित फ़ंक्शन द्वारा नियंत्रित किया जा सकता है, तो आप एकाधिक एंडपॉइंट के बीच समन्वय कैसे करते हैं?

<पी> एसएसई परिवहन मॉडल में, दो महत्वपूर्ण समापन बिंदु हैं:/sse कनेक्शन बनाए रखने के लिए और /message ग्राहक संदेश प्राप्त करने के लिए. समस्या यह है:वर्सेल जैसे सर्वर रहित वातावरण में, ये समापन बिंदु पूरी तरह से अलग-थलग हैं। वे मेमोरी साझा नहीं करते हैं, और /message के लिए एक अनुरोध करते हैं /sse को संभालने वाले की तुलना में एक पूरी तरह से अलग फ़ंक्शन इंस्टेंस द्वारा नियंत्रित किया जा सकता है .

<पी> समाधान? रेडिस पब/उप. जैसा कि माल्टे ने एक्स पर समझाया:

<पी> रेडिस के साथ एमसीपी विकास में तेजी लाएं:तेज़, लागत प्रभावी समाधान

<पी> कार्यान्वयन अंतिम बिंदुओं के बीच समन्वय करने के लिए रेडिस चैनलों का उपयोग करता है। जब कोई ग्राहक /message पर संदेश भेजता है , वह समापन बिंदु रेडिस चैनल पर प्रकाशित होता है जो कि /sse है समापन बिंदु की सदस्यता ली गई है. /sse एंडपॉइंट अनुरोध को संसाधित करता है और प्रतिक्रिया को दूसरे चैनल /message के माध्यम से वापस प्रकाशित करता है सुन रहा है.

<पी> रेडिस के साथ एमसीपी विकास में तेजी लाएं:तेज़, लागत प्रभावी समाधान

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

केस 2 का उपयोग करें:पुन:प्रारंभ करने की क्षमता के लिए इवेंट स्टोर

<पी> MCP के स्ट्रीमेबल HTTP ट्रांसपोर्ट की सबसे शक्तिशाली विशेषताओं में से एक इसकी पुन:प्रारंभ करने योग्य क्षमता के लिए समर्थन है। यह सुविधा ग्राहकों को वियोग की स्थिति में स्ट्रीम को वहीं से जारी रखने की अनुमति देती है जहां से इसे छोड़ा गया था। यह उन उत्पादन अनुप्रयोगों के लिए महत्वपूर्ण है जहां नेटवर्क व्यवधान अपरिहार्य हैं।

एमसीपी स्ट्रीम को समझना

<पी> यह समझने के लिए कि पुन:प्रारंभ करने योग्यता क्यों मायने रखती है, हमें यह समझने की आवश्यकता है कि एमसीपी स्ट्रीम में क्या शामिल है। कुछ ऑपरेशन, जैसे एक साधारण टूल को कॉल करना, एक ही प्रतिक्रिया देता है। लेकिन उपकरण सर्वर.sendLoggingMessage जैसी विधियों का उपयोग करके निष्पादन के दौरान कई ईवेंट भी लौटा सकते हैं। ये बहु-घटना धाराएँ ऐसी हैं जहाँ पुन:प्रारंभ करना महत्वपूर्ण हो जाता है। यदि कोई ग्राहक बीच में ही डिस्कनेक्ट कर देता है, तो उसे फिर से शुरू करने के बजाय वहीं से शुरू करने में सक्षम होना चाहिए जहां उसने छोड़ा था।

रेडिस के साथ इवेंटस्टोर को कार्यान्वित करना

<पी> एमसीपी एसडीके एक इवेंटस्टोर इंटरफ़ेस को परिभाषित करता है जिसके लिए दो तरीकों की आवश्यकता होती है:storeEvent ईवेंट और replayEventsAfter जोड़ने के लिए किसी विशिष्ट इवेंट आईडी से शुरू होने वाले इवेंट को पुनः प्राप्त करने के लिए। एसडीके में इन-मेमोरी कार्यान्वयन शामिल है, लेकिन उत्पादन उपयोग के लिए, आपको लगातार भंडारण की आवश्यकता है।

<पी> यहां इवेंटस्टोर का रेडिस-आधारित कार्यान्वयन है:

import { Redis } from '@upstash/redis';
import { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
import { EventStore } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
 
export class RedisEventStore implements EventStore {
 private redis: Redis;
 
 constructor(params: ConstructorParameters<typeof Redis>[0]) {
 this.redis = new Redis(params);
 }
 
 /**
 * Stores an event in a Redis Stream
 * Implements EventStore.storeEvent
 */
 async storeEvent(streamId: string, message: JSONRPCMessage): Promise<string> {
 const eventId = await this.redis.xadd(`stream:${streamId}`, '*', {
 message: JSON.stringify(message),
 });
 return eventId;
 }
 
 /**
 * Replays events that occurred after a specific event ID
 * Implements EventStore.replayEventsAfter
 */
 async replayEventsAfter(
 lastEventId: string,
 { send }: { send: (eventId: string, message: JSONRPCMessage) => Promise<void> }
 ): Promise<string> {
 if (!lastEventId) {
 return '';
 }
 
 // Extract the stream ID from the lastEventId
 const streamId = lastEventId.split('-')[0]; // Assuming the stream ID is part of the key
 if (!streamId) {
 return '';
 }
 
 let nextId = lastEventId;
 while (true) {
 // Fetch events from the stream starting AFTER the next ID (exclusive)
 const events = await this.redis.xrange(`stream:${streamId}`, `(${nextId}`, '+', 10);
 
 // Convert the returned object to an array of entries
 const eventEntries = Object.entries(events);
 
 if (eventEntries.length === 0) {
 break; // No more events to replay
 }
 
 for (const [eventId, fields] of eventEntries) {
 // Ensure fields.message exists and parse it
 if (fields && typeof fields === 'object' && 'message' in fields && typeof fields.message === 'string') {
 const message = JSON.parse(fields.message) as JSONRPCMessage;
 await send(eventId, message);
 nextId = eventId; // Update the next ID to the current event ID
 }
 }
 }
 
 return streamId;
 }
}
<पी> यह कार्यान्वयन रेडिस स्ट्रीम का उपयोग करता है, जो इस उपयोग के मामले के लिए बिल्कुल उपयुक्त है।

एक सीमा

<पी> सावधान रहने के लिए एक महत्वपूर्ण चेतावनी है:जब कोई टूल एकाधिक ईवेंट भेजता है, तो स्ट्रीमआईडी _GET_stream पर सेट होता है। , और यह स्थिरांक विभिन्न धाराओं और उपयोगकर्ताओं के लिए समान रहता है। इसका मतलब यह है कि यदि दो उपयोगकर्ता एक साथ एक ही टूल का उपयोग कर रहे हैं जो कई इवेंट भेजता है, तो उनके इवेंट को एक ही स्ट्रीम में मिलाया जा सकता है।

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

केस 3 का उपयोग करें:क्लर्क का MCP OAuth कार्यान्वयन

<पी> एमसीपी विनिर्देश में प्रमाणीकरण और प्राधिकरण के लिए समर्थन शामिल है, जो एमसीपी सर्वर को ग्राहकों को सुरक्षित रूप से प्रमाणित करने और संसाधनों तक पहुंच को नियंत्रित करने की अनुमति देता है। विनिर्देश OAuth 2.0 सहित कई प्रमाणीकरण योजनाओं का समर्थन करता है, जो मौजूदा पहचान प्रदाताओं के साथ एकीकृत करने और टूल और डेटा तक उपयोगकर्ता-स्कोप पहुंच को सक्षम करने के लिए विशेष रूप से उपयोगी है।

<पी> क्लर्क ने MCP SDK से OAuthClientProvider इंटरफ़ेस लागू करके MCP के लिए एक व्यापक OAuth क्लाइंट बनाया है। उनका कार्यान्वयन एमसीपी अनुप्रयोगों में रेडिस के लिए एक और महत्वपूर्ण उपयोग का मामला प्रदर्शित करता है। यदि आप उनके एमसीपी टूल के साथ शुरुआत करना चाहते हैं, तो उनके डेमो रिपॉजिटरी को देखें जो एक बेहतरीन शुरुआती बिंदु प्रदान करता है।

OAuth के लिए संग्रहण क्यों मायने रखता है

<पी> जैसा कि क्लर्क अपने mcp-tools में बताते हैं रिपॉजिटरी, लगातार भंडारण दो प्रमुख कारणों से MCP OAuth कार्यान्वयन के लिए आवश्यक है:

  1. OAuth प्रवाह कई समापन बिंदुओं तक फैला है - इनिशियलाइज़ेशन, OAuth कॉलबैक और MCP अनुरोध सभी को साझा मेमोरी के बिना विभिन्न सर्वर रहित फ़ंक्शंस द्वारा नियंत्रित किया जा सकता है
  2. MCP कनेक्शन लंबे समय से चल रहे हैं - इन-मेमोरी स्टोरेज पर भरोसा करने से एप्लिकेशन स्केल के रूप में मेमोरी आवश्यकताओं में वृद्धि होगी, और कोई भी सर्वर पुनरारंभ सभी सत्रों को अमान्य कर देगा

रेडिस में क्या संग्रहीत होता है

<पी> क्लर्क का रेडिस स्टोर तीन प्रकार के डेटा का प्रबंधन करता है, प्रत्येक OAuth प्रवाह में एक विशिष्ट उद्देश्य के साथ:

<पी> पीकेसीई सत्यापनकर्ता (pkce_verifier_<...> ) इन्हें OAuth प्रवाह शुरू करते समय संग्रहीत किया जाता है और उपयोगकर्ता द्वारा पहुंच प्रदान करने के बाद फिर से पढ़ा जाता है। वे PKCE (कोड एक्सचेंज के लिए प्रूफ कुंजी) प्रवाह का हिस्सा हैं, जो यह सुनिश्चित करके सार्वजनिक ग्राहकों में OAuth के लिए अतिरिक्त सुरक्षा प्रदान करता है कि जिस एप्लिकेशन ने प्रवाह शुरू किया है वही इसे पूरा कर रहा है (जैसा कि RFC 7636 में परिभाषित है)।

{
 "value": "XoYQ...",
 "created_at": "2025-10-03T06:27:06.928Z",
 "updated_at": "2025-10-03T06:27:06.928Z"
}
<पी> सत्र डेटा (session_<...> )यह एमसीपी सत्र के लिए सभी कॉन्फ़िगरेशन और स्थिति को संग्रहीत करता है। प्रारंभ में, इसमें MCP एंडपॉइंट, OAuth कॉन्फ़िगरेशन और क्लाइंट क्रेडेंशियल शामिल हैं। उपयोगकर्ता द्वारा एक्सेस प्रदान करने के बाद, इसे एक्सेस और रिफ्रेश टोकन के साथ अपडेट किया जाता है। अंत में, एक authComplete प्रवाह समाप्त होने पर ध्वज जोड़ा जाता है।

{
 "value": {
 "mcpEndpoint": "http://localhost:3001/mcp",
 "oauthRedirectUrl": "http://localhost:3000/oauth_callback",
 "oauthScopes": "openid profile email",
 "mcpClientName": "Clerk MCP Demo",
 "mcpClientVersion": "0.0.1",
 "oauthClientUri": "http://example.com",
 "oauthPublicClient": false,
 "clientId": "8Yb2...",
 "clientSecret": "64YG..."
 },
 "created_at": "2025-10-03T06:27:06.882Z",
 "updated_at": "2025-10-03T06:27:06.882Z"
}
<पी> राज्य पैरामीटर (state_<...> )ये OAuth राज्य मापदंडों को सत्र आईडी में मैप करते हैं, जिससे राज्य आईडी का उपयोग करके सत्र डेटा प्राप्त करना संभव हो जाता है:

{
 "value": "dX61...",
 "created_at": "2025-10-03T06:27:03.585Z",
 "updated_at": "2025-10-03T06:27:03.585Z"
}
<पी> यह आर्किटेक्चर सुरक्षा और सत्र अखंडता को बनाए रखते हुए OAuth प्रवाह को वितरित सर्वर रहित कार्यों में निर्बाध रूप से काम करने की अनुमति देता है।

रेडिस एमसीपी के लिए बिल्कुल सही क्यों है

<पी> तीनों उदाहरणों में, हम सामान्य पैटर्न देखते हैं जो रेडिस को एमसीपी बुनियादी ढांचे के लिए एक आदर्श विकल्प बनाते हैं:

<पी> कम विलंबता :एमसीपी संचालन को अक्सर तेज़ होने की आवश्यकता होती है। रेडिस का इन-मेमोरी आर्किटेक्चर वास्तविक समय एआई इंटरैक्शन के लिए आवश्यक प्रतिक्रिया समय प्रदान करता है।

<पी> पब/उप क्षमताएं :जैसा कि हमने वर्सेल के कार्यान्वयन के साथ देखा, रेडिस पब/सब पूर्ण संदेश कतार की जटिलता के बिना वितरित घटकों के बीच सुरुचिपूर्ण समन्वय को सक्षम बनाता है।

<पी> समृद्ध डेटा संरचनाएं :इवेंट स्ट्रीम के लिए स्ट्रीम, सत्र डेटा के लिए हैश, और राज्य के लिए सरल कुंजी-मूल्य जोड़े। रेडिस प्रत्येक उपयोग के मामले के लिए सही डेटा संरचना प्रदान करता है।

<पी> अंतर्निहित समाप्ति :टीटीएल के माध्यम से स्वचालित सफाई। OAuth टोकन, ईवेंट स्ट्रीम और सत्र डेटा सभी मैन्युअल कचरा संग्रहण के बिना स्वचालित रूप से समाप्त हो सकते हैं।

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

एमसीपी विशिष्ट विशेषताओं से परे:व्यापक एआई पारिस्थितिकी तंत्र में रेडिस

<पी> जबकि हमने एमसीपी विनिर्देश में स्पष्ट रूप से परिभाषित सुविधाओं पर ध्यान केंद्रित किया है, जब एआई को सशक्त बनाने की बात आती है तो रेडिस की उपयोगिता हमारे द्वारा खोजे गए पैटर्न से कहीं आगे तक फैली हुई है। हमारे हालिया ब्लॉग पोस्ट इनमें से कई पैटर्न प्रदर्शित करते हैं:

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

<पी> रेडिस के साथ एमसीपी विकास में तेजी लाएं:तेज़, लागत प्रभावी समाधान

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

निष्कर्ष

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

  • गति और लचीलापन :यह गति, लचीलेपन और सर्वर रहित-अनुकूल वास्तुकला का संयोजन है
  • लागत में कमी :कैशिंग क्षमताएं जो महंगी एपीआई कॉल और गणना को कम करती हैं
<पी> यदि आप एमसीपी के साथ निर्माण कर रहे हैं, चाहे सर्वर पर या क्लाइंट साइड पर, रेडिस को एमसीपी-संचालित एआई अनुप्रयोगों के लिए सही साथी के रूप में आपके टूलकिट में होना चाहिए। अपस्टैश रेडिस के साथ, आप आज विश्व स्तर पर उपलब्ध, सर्वर रहित रेडिस के साथ कुछ ही सेकंड में शुरुआत कर सकते हैं, जो उपयोग में न होने पर शून्य हो जाता है।


  1. Django में मॉडल में डेटा आयात करना Django में मॉडल में डेटा आयात करना

    इस लेख में, हम यह देखने जा रहे हैं कि डेटा को json फॉर्मेट से मॉडल . में कैसे आयात किया जाए . हम json, csv, xlsx, yml, . से डेटा आयात कर सकते हैं आदि मॉडल के लिए। सबसे पहले, एक Django प्रोजेक्ट और एक ऐप बनाएं। यूआरएल सेट अप करें और कुछ बुनियादी चीजें करें जैसे INSTALLED_APPS में ऐप जोड़ना। एक मॉडल

  1. HTML colspan विशेषता HTML colspan विशेषता

    HTML में colspan विशेषता का उपयोग किसी तालिका में एक सेल द्वारा फैले कॉलम की संख्या निर्धारित करने के लिए किया जाता है। या तत्व पर colspan विशेषता का उपयोग करें। तत्व colspan विशेषता HTML में एलिमेंट का colspan एट्रिब्यूट यह निर्धारित करता है कि सेल में कितने कॉलम होने चाहिए निम्नलिखित वाक्य र

  1. टिंकर कैनवास में किसी ऑब्जेक्ट के निर्देशांक कैसे प्राप्त करें? टिंकर कैनवास में किसी ऑब्जेक्ट के निर्देशांक कैसे प्राप्त करें?

    टिंकर कैनवास विजेट एक एप्लिकेशन को जीयूआई सुविधाएं प्रदान करता है। इसका उपयोग आकृतियों को आकर्षित करने, वस्तुओं को चेतन करने और मौजूदा वस्तुओं को कैनवास में कॉन्फ़िगर करने के लिए किया जा सकता है। जब भी हम आकृतियाँ बनाते हैं, हमें कैनवस आइटम कंस्ट्रक्टर में आकृतियों का आकार और निर्देशांक प्रदान करना