தொகுதி பாடங்கள் (4/4)
N+1 பிரச்சனை
பின்தள மேம்பாட்டில், API செயல்திறனை பேரழிவு தரும் வகையில் அடிக்கடி செய்யும் தவறுகளில் ஒன்று பிரபலமற்ற "N + 1 வினவல்கள்" பிரச்சனை.
Node.js இலிருந்து தரவுத்தளத்துடன் பேச, "ORMs" (பொருள்-தொடர்புடைய வரைபடங்கள்: எ.கா. Prisma அல்லது Sequelize) போன்ற லைப்ரரி சுருக்கங்களைப் பயன்படுத்தும் டெவலப்பருக்கு இது பொதுவாகத் தெரியவில்லை.
பேரழிவின் உடற்கூறியல்
ஒரு பயன்பாடு முழு ஈ-காமர்ஸ் முகப்புப் பட்டியலையும் திரும்பப் பெற விரும்புகிறது என்று கற்பனை செய்து பாருங்கள்: அனைத்து தயாரிப்புகளும் ஒவ்வொன்றும் சேர்ந்த வகைப் பெயரின் சரத்துடன். Node.js பக்கத்திலிருந்து பார்த்தால், ஒரு அனுபவமற்ற ப்ரோக்ராமர் மறுசுழற்சி வளையத்தை எழுதுவார்:
products = await db.query("SELECT * FROM products");(ஒரு பெரிய, பருமனான செயல்பாடு 1)- டெவெலப்பர் கண்டறியப்பட்ட 100 வரிசையில் ஒவ்வொரு
productக்கும் (for..of) மீண்டும் செய்கிறார் - ஒவ்வொரு அடியிலும், Node.js இல் அவர்கள்
categoryName = await db.query("SELECT name FROM categories WHERE id = " + product.category_id);மீண்டும் ஒரு துணை வினவலுக்காக காத்திருக்கிறார்கள் மற்றும் அதை முடிவில் உட்பொதிக்கிறார்கள் (N மெதுவான, சிறிய வினவல்களின் இரண்டாம் மறு செய்கைகள்!)
** Postgres டீமானுக்கான மொத்த கோரிக்கைகள்:** 1 + 100 உள்ளூர் மறு செய்கைகள் = 101 Node.js மற்றும் DB க்கு இடையே மைக்ரோ நெட்வொர்க் சுற்றுப் பயணங்கள். 101 சுற்று பயணங்கள் பயங்கரமான நெட்வொர்க் மேல்நிலை மற்றும் அசிங்கமான தாமதத்தை ஏற்படுத்துகின்றன. உண்மையான அளவில், N ஆனது 100 ஆக இல்லாமல் 10,000 வரிசைகளாக இருக்கலாம். 5xx நேரம் முடிவடைவதற்கு முன்பு API திரும்பாது.
உண்மையான பூர்வீக பதில்: ஒரே வினவலில் சேர் அல்லது ஒருங்கிணைத்தல்
முனையில் உள்ள அற்பமான ORM கட்டளைகளுக்குப் பதிலாக, கையால் எழுதப்பட்ட DBMS சுருக்கங்களைத் திறமையாகப் பயன்படுத்தி, "N+1" குழப்பத்தைத் தீர்க்கும் ஒற்றை, தோற்கடிக்க முடியாத வினவலில் செயல்படுத்தல்களை மில்லி விநாடிகளில் ஒன்றாக இணைக்கிறது:
SELECT
p.id,
p.name,
c.name AS category_name
FROM products p
JOIN categories c ON p.category_id = c.id;மொத்த API/DB சுற்றுப் பயணங்கள்: 1 தனிப்பட்ட வினவல், இணைக்கப்பட்டது, போஸ்ட்கிரெஸின் சொந்தக் குறியீடுகளால் கணித ரீதியாக மேம்படுத்தப்பட்டது, 0 மில்லி விநாடிகள் கூடுதல் நெட்வொர்க் தாமதத்துடன் முழுமையாகக் கையாளப்படுகிறது.
JSON திரட்டல் மாற்று
நவீன போஸ்ட்கிரெஸ் பதிப்புகள், json_agg உடன் JSON ஆக உள்ளமைக்கப்பட்ட முழு தொகுப்பையும் திரும்பப் பெற உங்களை அனுமதிக்கின்றன, மேலும் உள்ளூர் ஸ்கிரிப்ட் பசை இல்லாமல் வடிவமைக்கப்பட்ட மதிப்புரைகளின் துணை வரிசை உட்பட products வரிசையைப் பெற உங்கள் JavaScript ஐ அனுமதிக்கிறது! (மேம்பட்ட பாதைகள் மற்றும் சவால்களில் நீங்கள் Postgres இன் JSONb விதியைப் படிப்பீர்கள்.)
உங்கள் முறை
தயாரிப்பில் உள்ள உண்மையான N+1 சிக்கலைத் தீர்ப்போம்.\nஇன்று காலை அனுப்பப்பட்ட ஆர்டர்களை மறுபரிசீலனை செய்ய விரும்பினால், ஒவ்வொரு வாடிக்கையாளருக்கும் அவர்களின் பெயர்களைக் கண்டறிய முனை உலகளாவிய தேர்வை இயக்கியிருக்கும்.\n'வாடிக்கையாளர்கள்' (அசல் டெக்ஸ்ட்வல் 'c' மற்றும் 'ஆல்எக்ஸ்டோ' எனப் பயன்படுத்தவும். அற்பமான புலங்கள் (முறையான மாற்றுப்பெயர் முன்னொட்டை கட்டாயப்படுத்துதல்): 'c.first_name' (வாடிக்கையாளரிடமிருந்து) மற்றும் 'o.status' (நிலுவையில் உள்ள வரிசையில் இருந்து).
குறிப்பைக் காட்டு
தொடரியல்: c.first_name, o.status from வாடிக்கையாளர்கள் c. ON c.id = o.customer_id;
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
செயல்திறன் மூலம் குழுவை ஆராய்தல்
ஒரு வரிசை மற்றும் வகைக்கான மொத்த எண்ணிக்கையைப் பெற தரவுத்தளத்தில் தருக்கக் குழு-Bys பயன்படுத்தப்படவில்லை எனில், Node.js ஆனது DBயை முடிவில்லாமல் N+1 ஆக அழைக்கும்.\n'வாடிக்கையாளர்கள்' என்பதிலிருந்து 'நகரம்' புலத்தைத் தேர்ந்தெடுக்கும் ஒரு வினவலையும் டெர்மினல் கீவேர்ட் மூலம் தனித்துவமான குறிச்சொல்லைப் பயன்படுத்தி 'COUNT(id)' என்ற நிலையான Postgres எண்ணையும் எழுதவும்.
குறிப்பைக் காட்டு
அற்பமானது: நகரத்தைத் தேர்ந்தெடு, வாடிக்கையாளர்களின் எண்ணிக்கை (ஐடி) நகரத்தின் அடிப்படையில்;
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்