Zero-downtime डिप्लॉय Swift सर्विसेज: बिना डाउनटाइम अपडेट कैसे करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Zero-downtime डिप्लॉय क्यों ज़रूरी है Swift डेवलपर के लिए

\n

सोचिए: आपकी Swift-सर्विस Vapor पर हर सेकंड हज़ारों रिक्वेस्ट प्रोसेस कर रही है। आप एक नई फीचर रिलीज़ करते हैं — और यूज़र्स को 502 Bad Gateway दिखने लगता है, लॉग्स में SIGTERM और टूटे हुए कनेक्शन। परिचित लग रहा है? अगर आप बैकएंड के लिए Swift लिखते हैं, तो देर-सबेर यह समस्या आएगी: एक भी रिक्वेस्ट खोए बिना सर्विस को कैसे अपडेट करें?

\n

Zero-downtime डिप्लॉय कोई जादू नहीं, बल्कि सिद्ध तकनीकों का सेट है जो आपको एक्टिव कनेक्शन को तोड़े बिना Swift बाइनरी को बदलने देता है। इस आर्टिकल में मैं दिखाऊंगा कि graceful shutdown कैसे सेट करें, प्रोसेस को हॉट-स्वैप कैसे करें, और Swift-सर्विस को Nginx से कैसे जोड़ें। सब कुछ — रियल Swift कोड के साथ, बिना बकवास के।

\n\n

Zero-downtime क्या है और Swift प्रोजेक्ट्स के लिए क्यों ज़रूरी

\n

Zero-downtime deployment (बिना डाउनटाइम डिप्लॉय) का मतलब है कि आप एप्लिकेशन को अपडेट करें और यूज़र्स को एक मिलीसेकंड का भी रुकावट न दिखे। Swift-सर्विसेज के लिए यह खासतौर पर महत्वपूर्ण है क्योंकि:

\n
    \n
  • क्लाइंट गलतियाँ बर्दाश्त नहीं करते — टूटी हुई रिक्वेस्ट = डेटा या पैसे का नुकसान।
  • \n
  • Swift सर्वर अक्सर हाई लोड पर काम करते हैं (फिनटेक, चैट, real-time API)।
  • \n
  • बाइनरी को रीस्टार्ट करने में सेकंड लग सकते हैं — जो एक्टिव कनेक्शन के लिए अनंत काल है।
  • \n
\n

पारंपरिक तरीका — पुराने प्रोसेस को मारकर नया शुरू करना — काम नहीं करता। Vapor या Hummingbird पर Swift एप्लिकेशन को मौजूदा रिक्वेस्ट को सुचारू रूप से पूरा करना चाहिए, फिर नए इंस्टेंस को जगह देनी चाहिए। बाकी सारा कोड इसी पर आधारित है।

\n\n

चरण 1. Swift में Graceful Shutdown: सही तरीके से बंद करना

\n

Zero-downtime की पहली ईंट है graceful shutdown। आपकी Swift-सर्विस को SIGTERM सिग्नल पकड़ना चाहिए और कनेक्शन को बीच में नहीं तोड़ना चाहिए। Vapor 4+ यह पहले से करता है, लेकिन चलिए जाँच करते हैं और ज़रूरत पड़ने पर कस्टम लॉजिक जोड़ते हैं।

\n\n

Vapor में Graceful Shutdown की बेसिक सेटिंग

\n
import Vapor\n\nlet app = Application()\n\n// सिग्नल हैंडलर रजिस्टर करें\napp.lifecycle.use(ShutdownSignalHandler())\n\n// स्टैंडर्ड Vapor कोड\napp.get("health") { req in\n    return "OK"\n}\n\ntry app.run()\n
\n

लेकिन क्या होगा अगर आपको लंबे कार्यों (जैसे फ़ाइल प्रोसेसिंग या ईमेल भेजना) के पूरा होने का इंतज़ार करना है? चलिए कस्टम ShutdownSignalHandler जोड़ते हैं:

\n\n
import Vapor\nimport NIOCore\n\nfinal class ShutdownSignalHandler: LifecycleHandler {\n    private var runningTasks: [EventLoopFuture<Void>] = []\n    \n    func willBoot(_ app: Application) throws {\n        // SIGTERM पर सब्सक्राइब करें\n        app.running?.onStop = {\n            print("⏳ स्टॉप सिग्नल मिला। एक्टिव टास्क पूरे कर रहे हैं...")\n            return self.runningTasks.flatten(on: app.eventLoopGroup.next())\n        }\n    }\n    \n    func registerTask(_ task: EventLoopFuture<Void>) {\n        runningTasks.append(task)\n    }\n}\n
\n

अब जब SIGTERM आएगा, सर्वर सभी रजिस्टर्ड टास्क के पूरा होने का इंतज़ार करेगा। Swift-सर्विसेज के zero-downtime डिप्लॉय के लिए यह महत्वपूर्ण है: पुराना प्रोसेस उन रिक्वेस्ट को नहीं मारेगा जो पहले से प्रोसेस हो रही हैं।

\n\n

कंसोल में जाँच करें

\n

सर्वर चलाएँ और उसे सिग्नल भेजें:

\n
kill -SIGTERM <PID>\n
\n

लॉग्स में आपको सुचारू समाप्ति का संदेश दिखेगा। अगर सब ठीक है — अगले चरण पर चलते हैं।

\n\n

चरण 2. Swift पर Blue-Green डिप्लॉय: दो बाइनरी — एक भी डाउनटाइम नहीं

\n

Graceful shutdown कनेक्शन टूटने की समस्या तो हल करता है, लेकिन अपडेट के समय की समस्या नहीं। जब तक पुराना प्रोसेस बंद होता है, नए को रिक्वेस्ट लेनी शुरू कर देनी चाहिए। आदर्श तरीका है blue-green डिप्लॉय।

\n

सिद्धांत सरल है: आपके पास Swift-सर्विस के दो इंस्टेंस हैं (blue और green)। एक एक्टिव है, दूसरा स्टैंडबाय मोड में। जब आप कोड अपडेट करते हैं, तो:

\n
    \n

ब्लॉग

पुस्तक अनुशंसाएँ