एक दृश्य और बैकएंड के बीच परिवहन के रूप में डेटाबेस / एपीआई के साथ फ्लैट फ़ाइलों का उपयोग करना


20

मुझे एक एप्लिकेशन मिला है, जो डेवलपर्स के एक जोड़े के बीच एक अधिक गर्म चर्चा उत्पन्न करता है।

असल में, यह एक वेब लेयर और बैकएंड लेयर में विभाजित है। वेब लेयर एक साधारण वेब फॉर्म द्वारा जानकारी एकत्र करता है, इस डेटा को JSON डॉक्यूमेंट (शाब्दिक रूप से .json फाइल) के रूप में बैक एंड द्वारा उपयोग किए गए वॉच फोल्डर में जमा करता है। बैक एंड इस फोल्डर को हर कुछ सेकंड में पोल ​​करता है, फाइल को उठाता है, और उसके फंक्शन्स को करता है।

फ़ाइलें बहुत ही सरल हैं (यानी सभी स्ट्रिंग डेटा, कोई नेस्टिंग), और 1-2k के आसपास उनकी सबसे बड़ी, सिस्टम अपने अधिकांश समय बेकार में खर्च करता है (लेकिन किसी भी समय 100 संदेशों तक फट)। बैकएंड प्रोसेसिंग चरण में प्रति संदेश लगभग 10 मिनट लगते हैं।

तर्क तब आता है जब एक डेवलपर सुझाव देता है कि मैसेजिंग लेयर के रूप में फाइलसिस्टम का उपयोग करना एक बुरा समाधान है, जब एक रिलेशनल डेटाबेस (MySQL), noSQL डेटाबेस (रेडिस), या यहां तक ​​कि सादे REST API कॉल जैसी किसी चीज़ का उपयोग किया जाना चाहिए।

यह ध्यान दिया जाना चाहिए कि पंक्तिबद्ध संदेश हैंडलिंग के लिए संगठन में कहीं और रेडिस का उपयोग किया जाता है।

मैंने जिन तर्कों को सुना है, वे इस प्रकार हैं


फ्लैट फ़ाइलों के पक्ष में:

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

  • फ्लैट फ़ाइलों को समझने के लिए कम तकनीकी परिष्कार की आवश्यकता होती है - बस cat। लिखने के लिए कोई प्रश्न नहीं, गलती से कतार से एक संदेश को पॉप करने और इसे हमेशा के लिए चले जाने का कोई जोखिम नहीं है।

  • फ़ाइल प्रबंधन कोड प्रोग्रामिंग दृष्टिकोण से डेटाबेस एपीआई की तुलना में सरल है, क्योंकि यह हर भाषा के मानक पुस्तकालय का हिस्सा है। यह कोड आधार की समग्र जटिलता और तीसरे पक्ष के कोड की मात्रा को कम करता है जिसे अंदर लाया जाना चाहिए।

  • YAGNI सिद्धांत कहा गया है कि फ्लैट फ़ाइलें ठीक अभी काम करते हैं, वहाँ कोई एक अधिक जटिल समाधान के लिए बदलने के लिए प्रदर्शन किया है की जरूरत है, तो यह छोड़ दें।

डेटाबेस के पक्ष में:

  • फ़ाइलों से भरी निर्देशिका की तुलना में डेटाबेस को स्केल करना आसान है

  • फ्लैट फाइलों से किसी को "किया" फाइल को "वॉच" डायरेक्टरी में वापस कॉपी करने का जोखिम होता है। इस एप्लिकेशन (वर्चुअल मशीन प्रबंधन) की प्रकृति के कारण, इससे भयावह डेटा हानि हो सकती है।

  • टी / एस के लिए अधिक तकनीकी परिष्कार की आवश्यकता होती है, इसका मतलब है कि अशिक्षित कर्मचारियों को केवल चीजों के लिए प्रहार करने से कुछ को कम करने की संभावना है।

  • डीबी कनेक्शन कोड, विशेष रूप से रेडिस जैसी किसी चीज के लिए, मानक पुस्तकालय फ़ाइल प्रबंधन कार्यों की तरह कम से कम मजबूत है।

  • डीबी कनेक्शन कोड है दिख (यदि कार्यात्मक नहीं) एक डेवलपर के दृष्टिकोण से सरल, फ़ाइल हेरफेर की तुलना में अपने उच्च स्तर के बाद से।


मैं जो देख सकता हूं, दोनों डेवलपर्स के पास बहुत सारे वैध बिंदु हैं।

तो इन दो लोगों में, प्रो-फाइल देव, या प्रो-डेटाबेस देव, जो कि सॉफ्टवेयर इंजीनियरिंग के सर्वोत्तम अभ्यास के अनुरूप है, और क्यों?


1
ये दस्तावेज़ कितने बड़े हैं और आपको इन्हें कब तक रखने की आवश्यकता है?
जेफ ओ

1
K का एक जोड़ा सबसे खराब है, और कुछ महीने (लॉगिंग / अनुपालन उद्देश्यों के लिए)
मिकी TK

2
क्या मैसेजिंग सर्विस के रूप में डेटाबेस का इस्तेमाल फाइल-सिस्टम की तरह खराब नहीं है? दोनों ही मामलों में आप किसी ऐसी चीज का उपयोग करते हैं जिसका वह इरादा नहीं है।
पीटर बी

फ़ाइल को लिखने में प्रोसेसिंग में कितना समय लगता है? यदि आपको "रिक्वेस्ट" फाइलों को कतारबद्ध करने की आवश्यकता नहीं है, तो आप उन्हें रेस्ट अपी के माध्यम से तुरंत प्रोसेस कर सकते हैं और केवल उन्हें "किए गए" फोल्डर (कोई फाइल मूविंग / पोलिंग नहीं) में लिख सकते हैं। फ्रंटएंड एक js ऐप बन जाएगा, और जिस दिन इसकी ज़रूरत होगी, आप आपी और बैकएंड के बीच एक उचित कतार लगा सकते हैं।
19st16

Redis 'के स्पष्ट विक्रय बिंदुओं में से एक @PieterB
मिकी TK

जवाबों:


16

डेटाबेस या इवान द्वारा उल्लिखित कतार प्रणाली से जुड़े समाधान पर स्विच करना होगा

  • बैकएंड और फ्रंटएंड दोनों में एक नई, जटिल प्रणाली पर निर्भरता बनाएं
  • अनावश्यक जटिलता का परिचय और असफलता के नए बिंदुओं का श * तान
  • लागत में वृद्धि (स्वामित्व की लागत सहित)

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

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


मेगा-dittos। और सुनिश्चित करें कि आप फ़ाइल प्रारूप (दस्तावेज़ों) को दस्तावेज बनाते हैं, इसे बनाए रखते हैं, और इसे वितरित करते हैं। अगला: "अशिक्षित कर्मचारियों के बारे में ओपी बुलेट ... चारों ओर से घूरना"; अगर यह एक सच्ची चिंता है तो y'all को प्रणालीगत समस्याएं हैं। हमारी "लोन डेवलपर" संस्कृति में हमारे साथ हुआ सबसे बुरा कोडिंग और सामूहिक अज्ञानता थी क्योंकि मूल कोडर समय के साथ बचे थे। मैं वहाँ 20-ish साल बाद शुरू हुआ और हम एक रखरखाव दुःस्वप्न था।
राडारबॉब

1
जैसा कि फ़ाइल आधारित समाधान काम कर रहा है, मैं मानता हूं कि स्विचिंग आपके द्वारा सूचीबद्ध कारणों के लिए व्यर्थ है। एक साफ शीट से शुरू करके, फ़ाइलों का उपयोग करने के लिए मामला बनाना कठिन होगा।
इयान

10

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

मुझे विश्वास नहीं है कि यदि आप स्केल के साथ काम कर रहे हैं तो YAGNI प्रिंसिपल यहाँ लागू होता है। "कार्य करना" सापेक्ष है, यदि आपके पास भयावह डेटा हानि और पैमाने पर कम क्षमता है, तो मैं वास्तव में उस काम पर विचार नहीं करूंगा। मुझे यकीन नहीं है कि आप जिस पैमाने के साथ काम कर रहे हैं, लेकिन अगर आपके पास इन प्रविष्टियों की एक बड़ी मात्रा है, तो यह केवल एक नए सिस्टम पर स्विच करने के लिए प्रत्येक के साथ कठिन हो जाता है। तो अगर यह मामला है, तो मैं कहूंगा कि एक डेटाबेस सबसे अच्छा अभ्यास है।

MongoDB या रेडिस (मुझे रेडिस के साथ कोई अनुभव नहीं है, केवल अच्छी चीजों को पढ़ें) को ठीक करना चाहिए क्योंकि आपके डेटा को पहले से ही इसमें अच्छी तरह से फिट होना चाहिए (json दस्तावेज अक्सर MongoDB के लिए BSON दस्तावेजों में बदल जाते हैं)। इसका एक अतिरिक्त फायदा यह भी है कि हर समय डिस्क पर संभावित रूप से पढ़ने / लिखने के बजाय मेमोरी में बहुत सारा डेटा रखने के लिए। यह भी सुनिश्चित करता है कि समवर्ती पाठ / लेखन भ्रष्टाचार या अवरोध का कारण न बने।

यदि YAGNI प्रिंसिपल यहां लागू होता है और फाइलें एक अड़चन नहीं हैं, तो वे दायरे के भीतर पैमाने पर हैं, और भयावह मुद्दे नहीं हैं, मैं कहूंगा कि फाइलों के साथ चिपके रहना "सबसे अच्छा अभ्यास" है। अगर कोई समस्या नहीं है तो कुछ भी बदलने का कोई कारण नहीं है, हो सकता है कि कुछ परीक्षण लिखें, इसे तनाव दें और देखें कि आपकी सीमाएं और अड़चनें कहां हैं।

मुझे यकीन नहीं है कि डेटाबेस इस संदर्भ में वैसे भी समाधान है। यदि आप एक ही सर्वर पर चीजों के साथ संचार कर रहे हैं, तो किसी प्रकार का आईपीसी किया जा सकता है, नहीं?


5

जबकि अच्छा 'ol एक फाइल को सेव करता है और इसे एक किए गए डायर पर कॉपी करता है, जो कई कम्युनिकेशन लेयर्स की स्टेपल है। पुराने मुख्य फ्रेम सिस्टम और पसंद के साथ। 'विरोधी' लोगों के पास एक बिंदु है; इसमें कई समस्याएं और किनारे मामले हैं। अगर आपको 100% रिलेबेलिटी की आवश्यकता है, तो इससे निपटना कठिन है, और फाइलों की आवृत्ति और मात्रा को मापते समय अधिक बार होता है।

यदि आप लेन-देन के दोनों पक्षों को नियंत्रित करते हैं, तो मैं आपको सुझाव दूंगा कि उपलब्ध कई सरल कतार प्रणाली में से कुछ को देखें। ZeroMQ, RabbitMQ, MSMQ आदि डेटाबेस के बजाय। लेकिन जैसा कि आप का मतलब है, अगर यह टूट गया ...


-3

डेटाबेस समाधान सही है। यह एक विशेष मेजबान या सीमा की स्थितियों पर बहुत अधिक निर्भरता को हल करता है।

दोनों समान समाधान हैं सिवाय इसके कि डेटाबेस को किसी विशेष होस्ट में होस्ट नहीं किया गया है। यह यूनिक्स प्रणाली के साथ फ़ायरवॉल / एक्सेस मुद्दों से छुटकारा दिलाता है। हमारे पास फाइल सिस्टम पर "आकस्मिक" डिलीट करने के मामले हैं और किसी को दोष नहीं दिया गया है।

डेटाबेस के साथ, आपके पास एक ही समस्या हो सकती है लेकिन आप ऑडिट को हटा सकते हैं या हटाए जाने से छुटकारा पाने के लिए केवल तर्क डाल सकते हैं।

फ़ाइल सिस्टम में भी अगर आपको फ़ाइल नाम जैसे OASIS में एप्लिकेशन डालना है, तो आपको OASIS.john_doe.system1.20160202 फाइलें बनाने की आवश्यकता होगी। यह थकाऊ हो जाता है और डेटाबेस में अधिक आसानी से प्रतिनिधित्व किया जा सकता है। तुम भी डेटाबेस और उस पर आधारित तर्क में अशक्त फ़ील्ड हो सकता है

डेटाबेस को अपडेट करना भी आसान है, बल्कि किसी भी पैच या फिक्स के मामले में पूरी फाइल डायरेक्टरी जो आप टेबल पर करना चाहते हैं। बेशक आप इसे फाइल सिस्टम पर कर सकते हैं लेकिन डेटाबेस अपडेट अधिक इंटुओनल है।

उदाहरण के लिए आप एक रेरन चाहते हैं, लेकिन OASIS की तुलना में एक अलग प्रणाली के साथ DESERT और john_doe को doe_smith और दिनांक 20160101 से 20151231 तक

मूल सेट से DESERT / doe_smith / 20151231 के लिए पंक्तियों को उत्पन्न करना आसान है बजाय शेल स्क्रिप्ट के साथ उन फ़ाइल को बनाने के लिए।

इसलिए पठनीयता से, दृश्य डेटाबेस समाधान का विस्तार बिंदु बेहतर है।


1
कृपया बताएं कि आपका क्या मतलब है ... जहां से मैं बैठता हूं, एक डेटाबेस समाधान केवल बहुत अधिक निर्भरता पैदा करेगा और विफलता की नई सीमाओं / बिंदुओं को पेश करेगा।
डेरथिज्का

1
संदेश सेवा के रूप में डेटाबेस का उपयोग करना फ़ाइलों के उपयोग के समान ही बुरा है।
पीटर बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.