तुमचा SQL जलद आहे पण API संथ आहे

तुमचे डेटाबेस क्वेरीज (queries) जलद आहेत. तुमचे कॅशिंग (caching) व्यवस्थित काम करत आहे. तुमचे बॅकग्राउंड जॉब्स (background jobs) देखील ठीक आहेत.

तरीही, तुमचा API अजूनही संथ आहे. तुमचा CPU वापर (usage) जास्त आहे.

समस्या तुमच्या डेटाबेसमध्ये नाही. समस्या Ruby लेयरमध्ये (layer) आहे.

बॉटलनेक (bottleneck) अनेकदा डेटा डेटाबेस मधून बाहेर पडल्यानंतर आणि तुमच्या ॲप्लिकेशनमध्ये प्रवेश केल्यानंतर उद्भवतो. हे तीन मुख्य कारणांमुळे घडते:

  • Bloated serialization (अनावश्यक डेटाचे रूपांतर)
  • Excessive object allocation (अत्यधिक ऑब्जेक्ट अलोकेशन)
  • Repeated computation (वारंवार होणारी गणना)

ते कसे सुधारावे ते खाली दिले आहे.

  1. Bloated Serialization थांबवा

अनेक डेव्हलपर्स संपूर्ण मॉडेल्सना JSON मध्ये रूपांतरित करतात.

render json: @shipments

जर एखाद्या shipment मध्ये ४० कॉलम्स असतील पण तुमच्या frontend ला फक्त ५ ची गरज असेल, तर तुम्ही CPU सायकल वाया घालवता. तसेच, API keys किंवा खर्च यांसारखा खाजगी डेटा लीक होण्याचा धोकाही असतो.

उपाय: तुम्हाला आवश्यक असलेले फक्त फील्ड्स (fields) परत करा.

render json: @shipments.as_json(only: [:id, :tracking_no, :status])

अधिक चांगल्या वेगासाठी, डेटा arrays स्वरूपात मिळवण्यासाठी pluck वापरा. यामुळे जड ActiveRecord objects तयार करण्याची गरज पूर्णपणे टळते.

  1. Object Allocation कमी करा

Ruby ने तयार केलेला प्रत्येक object मेमरी खर्च करतो. एकाच रिक्वेस्ट दरम्यान हजारो objects तयार केल्यामुळे Garbage Collector (GC) ला जास्त काम करावे लागते. यामुळे तुमची संपूर्ण सिस्टीम संथ होते.

Loops च्या आत नवीन hashes किंवा strings तयार करणे टाळा.

चुकीचे:

@shipments.map do |s|
  { label: "#{s.tracking_no} - #{s.status.upcase}" }
end

बरोबर: Static डेटा लूपच्या बाहेर हलवा. Ruby ऐवजी डेटाबेसमध्ये अधिक काम करा.

  1. वारंवार होणारी गणना (Repeated Computation) टाळा

जर तुम्ही एकाच रिक्वेस्टमध्ये एकाच मेथडला (method) अनेक वेळा कॉल करत असाल, तर तुमचा वेळ वाया जातो.

उदाहरण:

def total_weight
  shipments.sum(&:weight)
end

जर तुमचे view, helper आणि serializer हे सर्व याला कॉल करत असतील, तर तुम्ही तीन वेळा बेरीज (sum) करता.

उपाय: memoization वापरा.

def total_weight
  @total_weight ||= shipments.sum(&:weight)
end

यामुळे प्रत्येक रिक्वेस्टमध्ये गणित फक्त एकदाच होते याची खात्री मिळते.

सारांश तक्ता:

  • Bloated serialization: फक्त आवश्यक फील्ड्स परत करा किंवा pluck वापरा.
  • High allocation: लूपमध्ये कमी objects तयार करा.
  • Repeated computation: निकाल पुन्हा वापरण्यासाठी memoization वापरा.

डेटाबेस ऑप्टिमायझेशन (optimization) म्हणजे कमी डेटा मागवणे. ॲप्लिकेशन ऑप्टिमायझेशन म्हणजे डेटा मिळाल्यानंतर कमी अनावश्यक कामे करणे.

स्रोत: https://dev.to/danewu/your-sql-is-fast-but-the-api-is-slow-its-the-ruby-layer-2fno