रेडिस सिंगल-थ्रेडेड है, फिर यह I / O समवर्ती कैसे करता है?


169

रेडिस के कुछ मूल सिद्धांतों को समझने की कोशिश मैं एक दिलचस्प ब्लॉग पोस्ट पर आया ।

लेखक बताता है:

रेडिस एकल / पिरोया के साथ पिरोया हुआ है और आई / ओ संगति के संदर्भ में अनिश्चित काल के पैमाने पर है।

मैं निश्चित रूप से पूरी बात को गलत समझता हूं, क्योंकि मुझे यह कथन हैरान करने वाला लगता है। यदि कोई कार्यक्रम एकल-सूत्रबद्ध है, तो वह समवर्ती कुछ भी कैसे करता है? यह इतना महान क्यों है कि रेडिस ऑपरेशन परमाणु हैं, अगर सर्वर वैसे भी सिंगल-थ्रेडेड है?

किसी को भी कृपया इस मुद्दे पर कुछ प्रकाश डाला सकता है?

जवाबों:


359

वैसे यह इस बात पर निर्भर करता है कि आप कैसे संगामिति को परिभाषित करते हैं।

सर्वर-साइड सॉफ़्टवेयर में, समरूपता और समानांतरवाद को अक्सर विभिन्न अवधारणाओं के रूप में माना जाता है। एक सर्वर में, समवर्ती I / Os का समर्थन करने का मतलब है कि सर्वर केवल एक संगणना इकाई के साथ उन क्लाइंट के अनुरूप कई प्रवाह निष्पादित करके कई ग्राहकों की सेवा करने में सक्षम है। इस संदर्भ में, समानता का मतलब होगा कि सर्वर एक ही समय में (कई संगणना इकाइयों के साथ) कई चीजें करने में सक्षम है, जो अलग है।

उदाहरण के लिए, एक बारटेंडर कई ग्राहकों की देखभाल करने में सक्षम होता है, जबकि वह एक बार में केवल एक पेय तैयार कर सकता है। इसलिए वह समतावाद के बिना संगति प्रदान कर सकता है।

इस प्रश्न पर यहाँ बहस की गई है: संगामिति और समानता के बीच अंतर क्या है?

रोब पाइक की इस प्रस्तुति को भी देखें ।

एक एकल-थ्रेडेड प्रोग्राम निश्चित रूप से I / O (डी) मल्टीप्लेक्सिंग तंत्र और एक ईवेंट लूप (जो कि Redis करता है) का उपयोग करके I / O स्तर पर संक्षिप्तता प्रदान कर सकता है।

समानांतरवाद की एक लागत है: कई सॉकेट्स / एकाधिक कोर के साथ आप आधुनिक हार्डवेयर पर पा सकते हैं, थ्रेड्स के बीच सिंक्रनाइज़ेशन बेहद महंगा है। दूसरी ओर, Redis जैसे कुशल भंडारण इंजन की अड़चन बहुत बार नेटवर्क है, सीपीयू से पहले। पृथक ईवेंट लूप (जिसके लिए कोई सिंक्रनाइज़ेशन की आवश्यकता नहीं है) इसलिए कुशल, स्केलेबल, सर्वर बनाने के लिए एक अच्छे डिज़ाइन के रूप में देखे जाते हैं।

तथ्य यह है कि रेडिस ऑपरेशन परमाणु हैं केवल एकल-थ्रेडेड इवेंट लूप का परिणाम है। दिलचस्प बात यह है कि परमाणु को बिना किसी अतिरिक्त लागत पर प्रदान किया जाता है (इसे सिंक्रनाइज़ेशन की आवश्यकता नहीं होती है)। सिंक्रनाइज़ेशन ओवरहेड के लिए भुगतान किए बिना आशावादी लॉकिंग और अन्य पैटर्न को लागू करने के लिए उपयोगकर्ता द्वारा इसका फायदा उठाया जा सकता है।


135
अच्छा बारटेंडर सादृश्य :)
सर्जियो तुलेंत्सेव

3
v4 इस संबंध में एक गेम चेंजर है - stackoverflow.com/a/45374864/3160475 :) पर मेरा जवाब देखें
इटमार हैबर

1
केवल एक चीज जो मुझे वास्तव में जवाब और तुलना के बारे में पसंद नहीं है, वह यह है कि ऐसा लगता है कि समवर्ती काम नहीं करता है समानांतर में और यह सबसे निश्चित रूप से करता है जैसा कि मैं इसे चलाने के काम के साथ परीक्षण कर सकता हूं और काम हो रहा है जो अंततः है समानांतर में माना जाता है। उस लेख के संदर्भ में समानता, बहुपक्षीय धागों पर चलने में सक्षम होने की बहुविध प्रकृति का जिक्र है। यानी इसे थ्रेडसेफ़ क्यों कहा जा रहा है।
ईसाई मैथ्यू

2020 में फिर भी वैध?
रॉबर्टो मैनफ्रेडा

21

ठीक है, Redis उपयोगकर्ता-स्तर, OTOH पर एकल-थ्रेडेड है, सभी एसिंक्रोनस I / O कर्नेल थ्रेड पूल और / या स्प्लिट-स्तर ड्राइवरों द्वारा समर्थित है।

कुछ के लिए ' समवर्ती ', सॉकेट राज्य-मशीनों के लिए नेटवर्क घटनाओं को वितरित करना शामिल है। यह सिंगल-थ्रेडेड है, एक कोर (उपयोगकर्ता स्तर पर) पर चलता है, इसलिए मैं इसे समवर्ती नहीं कहूंगा। अन्य अलग हैं ..

' आई / ओ कंसीडर के संदर्भ में अनिश्चित काल के पैमाने ' सिर्फ सच के साथ किफायती है। उन्हें अधिक विश्वास हो सकता है यदि उन्होंने कहा कि 'एक-थ्रेड-प्रति-ग्राहक से बेहतर पैमाने पर हो सकता है, बशर्ते कि ग्राहक बहुत कुछ न मांगें', हालांकि वे तब अन्य async समाधान द्वारा भारी लोडिंग पर उड़ाने को जोड़ने के लिए बाध्य महसूस कर सकते हैं उपयोगकर्ता स्तर पर सभी कोर का उपयोग करें '।


संदर्भ से बाहर हो सकता है लेकिन क्या प्रत्येक अपडेट ऑपरेशन (जैसा कि INCR कमांड द्वारा किया गया है) एक ताला लगाता है? यदि 1000 समवर्ती अनुरोध हैं और एक कुंजी (प्रति अनुरोध) पर एक इंक्रीमेंट ऑपरेशन है, तो क्या यह सुनिश्चित करता है कि चर केवल 1000 गुना बढ़ जाता है?
अमांडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.