इतना समय पहले नहीं, जब एक और सॉफ्टवेयर उत्पाद तैयार करते समय, हमारी विकास टीम को सर्वर में परिवर्तन (PUSH विधि) भेजकर वास्तविक समय में उपयोगकर्ता डेटा को सिंक्रनाइज़ करने के लिए एक पूर्ण प्रणाली को साकार करने के कार्य का सामना करना पड़ा। एप्लिकेशन में ही, डेटा की मात्रा बड़ी नहीं थी, लेकिन उन्हें कई उपयोगकर्ताओं द्वारा एक साथ देखा जा सकता था। इसलिए, हमें वेब एप्लिकेशन के ढांचे के भीतर डेटा सिंक्रनाइज़ेशन के लिए एक हल्के और काफी उत्पादक दृष्टिकोण की आवश्यकता थी। इस समस्या को हल करने के विभिन्न तरीकों पर विचार करने के बाद, हमने एक काफी लोकप्रिय WebSocket एमुलेटर - SockJS का विकल्प चुना, जो क्लाइंट और सर्वर के बीच डेटा के आदान-प्रदान के लिए विभिन्न एल्गोरिदम का उपयोग करता है, जो क्लाइंट द्वारा उपयोग किए जाने वाले ब्राउज़र पर निर्भर करता है। इस लेख के ढांचे में, मैं इस बात पर ध्यान केंद्रित नहीं करूंगा कि इस तरह का विकल्प क्यों बनाया गया (इस विषय पर कई लेख लिखे गए हैं, जिसमें हब्बर पर एक भी शामिल है), लेकिन मैं बस इतना कहूंगा कि हमें अभी तक इसका पछतावा नहीं है।
प्रारंभ में, जब ऐसे कार्यों के कार्यान्वयन के लिए मानक दृष्टिकोणों का अध्ययन किया गया, तो हमें एक समस्या का सामना करना पड़ा। यह समस्या थी कि हमारी प्रणाली के साथ बातचीत न केवल वेब इंटरफेस के माध्यम से की गई, बल्कि एपीआई द्वारा तृतीय-पक्ष उत्पादों के उपयोग के माध्यम से भी की गई जिसे हम नियंत्रित नहीं कर सकते थे। और हमारे उत्पाद का अंतिम उपयोगकर्ता, निश्चित रूप से, डेटा से संबंधित सभी जानकारी को देखने की अपेक्षा करता है जो इससे संबंधित है। Sockjs सर्वर का उपयोग करने के लिए मानक दृष्टिकोण का अर्थ है कि सिस्टम में किसी भी डेटा में परिवर्तन की सूचनाएँ उसी JS क्लाइंट का उपयोग करके भेजी जाएंगी जो इन परिवर्तनों के बारे में जानकारी प्राप्त करने के लिए उपयोग किया जाता है। इसीलिए हमारे मामले में ऐसा दृष्टिकोण लागू नहीं होगा।
इस लेख में, मैं इस बारे में बात करना चाहूंगा कि हमने इस समस्या को कैसे हल किया।
तो, स्रोत डेटा:
- पोर्टल (एपीआई में लिखा गया है)
- वेब क्लाइंट (सिंक्रनाइज़ेशन के आयोजन के लिए sockjs- क्लाइंट लाइब्रेरी के साथ)
- SockJS सर्वर (बवंडर-सॉकज के रूप में, जो एक कारण था कि हमने अपने उत्पाद के प्रति अपनी पसंद क्यों बनाई)
सामान्य कार्य को दो उप-प्रकारों में विभाजित किया जा सकता है:
- सिस्टम में परिवर्तन (एक तुच्छ कार्य) के बारे में अंतिम उपयोगकर्ता द्वारा सूचनाएं प्राप्त करने का संगठन
- Django टूल (याद रखें कि हम मानक दृष्टिकोण का उपयोग नहीं कर सकते हैं और मानक JS क्लाइंट का उपयोग करके इस तरह के संदेश नहीं बना सकते हैं) का उपयोग करते हुए सिस्टम में बदलाव के संदेश / सूचनाएँ बनाना, क्योंकि इस मामले में हम एपीआई के सेट का उपयोग करके किए गए परिवर्तनों को संसाधित करने में सक्षम नहीं होंगे। )।
उपलब्ध जानकारी का अध्ययन करने के बाद, यह स्पष्ट हो गया कि "मध्यस्थ" के बिना इस समस्या को हल नहीं किया जा सकता है। एक मध्यस्थ के रूप में, एक संदेश प्रणाली को चुना गया था, जिसका नाम ZeroMQ था। इस विशेष प्रणाली के मुख्य लाभों में यह इसकी सादगी, लपट, साथ ही पायथन भाषा के लिए समर्थन (जो हमारे लिए एक बहुत ही महत्वपूर्ण स्थिति है) को ध्यान देने योग्य है।
सामान्य तौर पर, परिणामी समाधान को नीचे प्रस्तुत योजना के रूप में दर्शाया जा सकता है।

वेब इंटरफेस या एपीआई का उपयोग करके अंत उपयोगकर्ता द्वारा किए गए सिस्टम डेटा में परिवर्तन अंततः हमारे Django सर्वर पर जाते हैं, जहां वे ZeroMQ के माध्यम से SockJS सर्वर को प्रेषित होते हैं, जो बदले में, इस तथ्य के उपयोगकर्ताओं को सूचित करता है कि प्रदर्शित ऑब्जेक्ट का डेटा बदल गया है।
कोड के लिए चलो
वेब क्लाइंट
सूचनाएं प्राप्त करने के लिए, हमें sockjs- क्लाइंट लाइब्रेरी को कनेक्ट करने, सर्वर से कनेक्शन स्थापित करने और आवश्यक घटनाओं की सदस्यता लेने की आवश्यकता है। आप इसे लगभग इस प्रकार कर सकते हैं:
<script src="/js/sockjs-0.3.4.min.js"></script> <script> var SyncServer = new SockJS("http://example.com/echo"); SyncServer.onmessage = function(e) {
ZeroMQ सर्वर
इस हिस्से को लागू करने के लिए, हमें ZeroMQ और इसके साथ काम करने के लिए पायथन लाइब्रेरी की आवश्यकता है - pyzmq। उसके बाद, आपको प्रॉक्सी मोड में सर्वर को कॉन्फ़िगर करने और शुरू करने की आवश्यकता है (यह मोड फॉरवर्ड कहा जाता है)। आप इसे कोड की कुछ पंक्तियों में कर सकते हैं:
import zmq def main(): try: context = zmq.Context(1)
एक समान स्क्रिप्ट चलाने से, आपको एक प्रॉक्सी सर्वर मिलेगा जो पोर्ट XXXX पर संदेशों की प्रतीक्षा करता है और उन्हें YYYY को पोर्ट करने के लिए भेजता है।
SockJS सर्वर
SockJS सर्वर के रूप में, मानक SockJS-tornado को कुछ छोटे बदलावों के साथ चुना गया था जो इसे ZeroMQ सर्वर से संदेश प्राप्त करने की अनुमति देते हैं (आप SockJSyRouter कक्षा के __init__ विधि में ये परिवर्तन पा सकते हैं)
from sockjs.tornado import SockJSConnection, SockJSRouter from tornado import ioloop as tornado_ioloop, web import zmq from zmq.eventloop import ioloop from zmq.eventloop.zmqstream import ZMQStream ioloop.install() io_loop = tornado_ioloop.IOLoop.instance() class SyncConnection(SockJSConnection): _connected = set() stream = None def __init__(self, session): super(SyncConnection, self).__init__(session) self.stream.on_recv(self.on_server_message) def on_open(self, request): self._connected.add(self) def on_message(self, data): pass def on_server_message(self, data): message = "your message" self.broadcast(self._connected, {'message': message}) def on_close(self): self._connected.remove(self) class SockJSMyRouter(SockJSRouter): def __init__(self, *args, **kw): super(SockJSMyRouter, self).__init__(*args, **kw) socket = context.socket(zmq.SUB) socket.setsockopt(zmq.SUBSCRIBE, "") socket.connect("tcp://127.0.0.1:YYYY") self._connection.stream = ZMQStream(socket, self.io_loop) if __name__ == '__main__': context = zmq.Context() EchoRouter = SockJSMyRouter(SyncConnection, '/echo') app = web.Application(EchoRouter.urls) app.listen("ZZZZ") io_loop.start()
Django सर्वर
Django सर्वर के भाग के रूप में, हमें सूचनाएं बनाने और उन्हें हमारे ZeroMQ सर्वर पर भेजने के लिए जिम्मेदार केवल कुछ पंक्तियों को जोड़ने की आवश्यकता है। आप इस प्रकार कर सकते हैं:
import zmq context = zmq.Context() socket = context.socket(zmq.PUB) socket.connect("XXX") socket.send("your message") socket.close()
बस इतना ही! Django, Sockjs सर्वर और क्लाइंट में संदेश बनाने और संसाधित करने के लिए जिम्मेदार तरीकों को जोड़कर, आपको अपने आवेदन के लिए एक पूर्ण-कार्यशील रीयल-टाइम सिंक्रनाइज़ेशन सिस्टम मिलेगा।
अपडेट:टाइमस्टोगो के अनुरोध पर
, मैं परिणामी कार्य सूची प्रबंधन प्रणाली के लिए एक लिंक पोस्ट करता
हूं :
क्लाउड चेकलिस्टइंटरनेट ब्राउज़र के दो अलग-अलग सत्रों में एक ही कार्य पत्रक खोलने पर सिस्टम के संचालन को देखा जा सकता है। इस परिदृश्य में, ज़ाहिर है, दो मॉनिटर होना एक बहुत बड़ा धन है।