SQL Yako ni ya Haraka Lakini API ni Polepole
Maswali yako ya hifadhidata (database queries) ni ya haraka. Caching yako inafanya kazi. Kazi zako za nyuma (background jobs) ziko sawa.
Hata hivyo, API yako bado ni polepole. Matumizi ya CPU yako ni makubwa.
Tatizo siyo hifadhidata yako. Tatizo ni tabaka la Ruby (Ruby layer).
Kizuizi (bottleneck) mara nyingi hutokea baada ya data kutoka kwenye hifadhidata na kuingia kwenye programu yako. Hii hutokea kupitia matatizo makuu matatu:
- Serialization iliyozidi (Bloated serialization)
- Ugawaji wa vitu (object allocation) uliopitiliza
- Mahesabu yanayojirudia
Hivi ndivyo unavyoweza kuyarekebisha.
- Acha Serialization Iliyozidi
Waendelezaji wengi hugeuza mifumo (models) nzima kuwa JSON.
render json: @shipments
Ikiwa shehena (shipment) ina safu (columns) 40 lakini upande wako wa mbele (frontend) unahitaji 5 tu, unapoteza nguvu ya CPU. Pia unahatarisha kuvuja kwa data za siri kama funguo za API (API keys) au gharama.
Suluhisho: rudisha tu nyanja (fields) unazohitaji.
render json: @shipments.as_json(only: [:id, :tracking_no, :status])
Kwa kasi bora zaidi, tumia pluck ili kupata data kama array. Hii inazuia kabisa ujenzi wa vitu vizito vya ActiveRecord.
- Punguza Ugawaji wa Vitu (Object Allocation)
Kila kitu (object) ambacho Ruby inatengeneza kinatumia kumbukumbu (memory). Kutengeneza maelfu ya vitu wakati wa ombi moja (single request) kunaulazimisha Mkusanyaji wa Takataka (Garbage Collector - GC) kufanya kazi kwa bidii zaidi. Hii inafanya mfumo wako wote kuwa polepole.
Epuka kutengeneza hash au string mpya ndani ya mizunguko (loops).
Mbaya:
@shipments.map do |s|
{ label: "#{s.tracking_no} - #{s.status.upcase}" }
end
Nzuri: Hamisha data zisizobadilika (static data) nje ya mzunguko. Fanya kazi zaidi kwenye hifadhidata badala ya kwenye Ruby.
- Epuka Mahesabu Yanayojirudia
Ikiwa unaita njia (method) ile ile mara nyingi katika ombi moja, unapoteza muda.
Mfano:
def total_weight
shipments.sum(&:weight)
end
Ikiwa view yako, helper, na serializer vyote vinaita hii, unatafuta jumla mara tatu.
Suluhisho: tumia memoization.
def total_weight
@total_weight ||= shipments.sum(&:weight)
end
Hii inahakikisha hesabu inafanyika mara moja tu kwa kila ombi.
Jedwali la Muhtasari:
- Serialization iliyozidi: Rudisha nyanja zinazohitajika tu au tumia
pluck. - Ugawaji mkubwa: Tengeneza vitu vichache zaidi kwenye mizunguko.
- Mahesabu yanayojirudia: Tumia memoization ili kutumia matokeo upya.
Uboreshaji wa hifadhidata unamaanisha kuomba data kidogo zaidi. Uboreshaji wa programu unamaanisha kufanya kazi ndogo ndogo (busywork) mara baada ya kupata data.
Chanzo: https://dev.to/danewu/your-sql-is-fast-but-the-api-is-slow-its-the-ruby-layer-2fno
