1 पॉइंट द्वारा GN⁺ 2024-09-13 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • पिछले 1 साल में SQLite का उपयोग करके Rails application को high-performance और stable तरीके से चलाने की गहरी समझ बनाने की कोशिश की गई है
  • इस प्रक्रिया में कई सबक मिले, और उन्हें साझा करने का उद्देश्य है
  • समस्या के कारण और उसके समाधान समझाए जाएंगे

SQLite और Rails की समस्याएँ

  • डिफ़ॉल्ट रूप से SQLite का उपयोग करने वाले Rails application तुरंत इस्तेमाल के लिए तैयार नहीं होते
  • थोड़े tuning और fine-tuning के जरिए high-performance और stable application बनाए जा सकते हैं
  • Rails 8 में लक्ष्य है कि सिर्फ़ default settings के साथ भी production-ready स्थिति मिल जाए

डेमो application "Lorem News"

  • "Lorem News" नाम की एक डेमो application के जरिए समस्याओं और समाधानों को समझाया जाएगा
  • यह application Hacker News का एक clone है, जिसमें users post और comment लिख सकते हैं

प्रदर्शन परीक्षण

  • oha load test CLI और application के अंदर benchmarking path का उपयोग करके प्रदर्शन का परीक्षण किया गया
  • single request और concurrent request के जरिए प्रदर्शन मापा गया

मुख्य समस्या: SQLITE_BUSY exception

  • SQLite एक समय में सिर्फ़ एक write operation की अनुमति देने के लिए write lock का उपयोग करता है
  • जब कई connections एक साथ write lock लेने की कोशिश करते हैं, तो SQLITE_BUSY exception होता है
  • इस समस्या को हल करने के लिए immediate transaction का उपयोग करना चाहिए

Immediate transaction

  • डिफ़ॉल्ट रूप से SQLite deferred transaction mode का उपयोग करता है
  • immediate transaction का उपयोग करने पर write lock तुरंत लेने की कोशिश होती है और असफल होने पर retry किया जा सकता है
  • sqlite3-ruby gem का उपयोग करके default transaction mode को immediate mode पर सेट किया जा सकता है

Timeout setting

  • database.yml फ़ाइल में timeout setting के जरिए SQLITE_BUSY exception को कम किया जा सकता है
  • SQLite की busy_timeout setting का उपयोग करके write lock के लिए retry किया जा सकता है

GVL (Global VM Lock) समस्या

  • sqlite3-ruby gem, SQLite के C code को call करते समय GVL को release नहीं करता
  • इससे concurrency performance घट जाती है
  • busy_handler का उपयोग करके GVL को release किया जा सकता है और performance बेहतर की जा सकती है

busy_timeout का पुनः कार्यान्वयन

  • busy_timeout को फिर से implement करके यह सेट किया गया कि सभी query एक ही आवृत्ति पर retry हों
  • इससे पुराने query timeout होने से बचते हैं

प्रदर्शन सुधार

  • प्रदर्शन बेहतर करने के लिए निम्न settings लागू करनी चाहिए
    • immediate transaction का उपयोग
    • timeout setting
    • busy_handler का उपयोग
    • WAL (Write-Ahead Logging) mode का उपयोग
    • read/write connection pool को अलग करना

GN⁺ का सार

  • SQLite का उपयोग करने वाले Rails application की performance समस्याओं और उनके समाधानों पर चर्चा की गई है
  • immediate transaction, timeout setting, GVL release, WAL mode, और read/write connection pool separation जैसे तरीकों से performance सुधारी जा सकती है
  • यह लेख SQLite और Rails का उपयोग करने वाले developers के लिए बहुत उपयोगी होगा
  • समान क्षमता वाले अन्य project के रूप में PostgreSQL और MySQL की सिफ़ारिश की गई है

1 टिप्पणियां

 
GN⁺ 2024-09-13
Hacker News की राय
  • Oldmoe के Litestack प्रोजेक्ट का परिचय

    • जो लोग SQLite और Rails का उपयोग करते हैं, उन्हें Oldmoe के Litestack प्रोजेक्ट को देखना चाहिए
    • Litestack एक Ruby gem है जो SQLite की ताकत का उपयोग करके web application data infrastructure प्रदान करता है
    • यह SQL database, तेज cache, शक्तिशाली job queue, भरोसेमंद message broker, full-text search engine, और metrics platform को एक ही package में प्रदान करता है
    • मैं इसे अभी एक प्रोजेक्ट में उपयोग कर रहा हूँ और इससे बहुत संतुष्ट हूँ
  • विस्तृत लेख लिखने के लिए धन्यवाद

    • यह SQLite web application को scale करने की कोशिश कर रहे लोगों के लिए उपयोगी जानकारी है
    • इसे Rails से आगे दूसरे frameworks में भी लागू किया जा सकता है
    • लेखक को धन्यवाद
  • SQLite से जुड़े काम करने वालों के लिए सिफारिश

    • आप कौन-सी भाषा या framework इस्तेमाल करते हैं, इससे फर्क नहीं पड़ता; SQLite से जुड़े काम करने वालों को यह लेख पढ़ना चाहिए
    • यह उन समस्याओं को कवर करता है जिन्हें कुछ साल पहले खुद हल करना पड़ता था
    • लेखक को धन्यवाद
  • FOSS analytics system के बारे में सवाल

    • मैं एक ऐसा FOSS analytics system बना रहा हूँ जिसे install करना आसान हो
    • मैं event data को अलग SQLite database में भेजकर उसे main app के data से अलग रखना चाहता हूँ
    • मुझे इस बात की चिंता है कि क्या यह प्रति सेकंड 1000 से अधिक events संभालने के लिए scale कर पाएगा
    • मैं events को server memory में रखकर हर सेकंड batch में write करने का तरीका सोच रहा हूँ
    • मैं राय चाहता हूँ कि क्या यह SQLite के कई DB write issues को हल करने का एक उचित तरीका है
  • sqlite3-ruby gem की GVL समस्या

    • sqlite3-ruby gem, SQLite calls के दौरान GVL release नहीं करता
    • ज़्यादातर मामलों में यह एक उचित निर्णय लगता है
    • Python extension शायद अलग तरीके से design किए गए हों
    • extralite gem blocking के दौरान GVL release करता है, आम तौर पर तेज है, और concurrency problems भी नहीं हैं
  • व्यक्तिगत webservice configuration

    • मेरी personal webservice में उपयोग की जाने वाली कुछ settings:
      • PRAGMA journal_mode = WAL
      • PRAGMA busy_timeout = 5000
      • PRAGMA synchronous = NORMAL
      • PRAGMA cache_size = 1000000000
      • PRAGMA foreign_keys = true
      • PRAGMA temp_store = memory
      • BEGIN IMMEDIATE transaction का उपयोग
  • Django के बारे में सवाल

    • यह लेख शानदार है
    • मैं सोच रहा हूँ कि क्या Django के लिए भी ऐसा कोई समान समाधान है
    • ArchiveBox, Django के जरिए SQLite का उपयोग करता है और Rails में बताई गई समस्याओं का अक्सर सामना करता है
    • अच्छा होगा अगर कोई ऐसा SQLite layer solution हो जो app के दूसरे channels के जरिए सभी writes को serialize किए बिना काम करे
  • busy_timeout की default setting पर सवाल

    • यह बहुत जानकारीपूर्ण और अच्छी तरह लिखा गया लेख है
    • मैं सोच रहा हूँ कि default busy_timeout method में ऐसा delay क्यों है जो पुराने queries को दंडित करता है
    • मैं समझना चाहता हूँ कि यह default setting के रूप में क्यों उचित मानी जाती है
  • SQLite और Rails के उपयोग पर राय

    • मुझे SQLite और Rails पसंद हैं, लेकिन यह production environment में MS Access इस्तेमाल करने जैसा लगता है
  • Rails integration issues सुलझाने के लिए धन्यवाद

    • integration issues को सुलझाकर दूसरे लोगों की मदद करना हमेशा खुशी की बात है
    • उम्मीद है कि ये fixes default Rails settings में शामिल किए जाएंगे
    • मैं Rails apps चलाता हूँ, कुछ साल पहले Postgres पर switch किया था, और उससे बहुत संतुष्ट हूँ
    • फिर भी alternatives का होना अच्छा है, और मैं दूसरे कामों में SQLite का उपयोग करता हूँ