ElasticSearchతో హైలోడ్ ప్రాజెక్ట్‌లో ఆప్టిమైజేషన్‌ని లోడ్ చేయండి

హే హబ్ర్! నా పేరు మాగ్జిమ్ వాసిలీవ్, నేను ఫిన్చ్‌లో విశ్లేషకుడిగా మరియు ప్రాజెక్ట్ మేనేజర్‌గా పని చేస్తున్నాను. ఎలాస్టిక్‌సెర్చ్‌ని ఉపయోగించి, మేము 15 నిమిషాల్లో 6 మిలియన్ అభ్యర్థనలను ఎలా ప్రాసెస్ చేయగలిగాము మరియు మా క్లయింట్‌లలో ఒకరి సైట్‌లో రోజువారీ లోడ్‌లను ఎలా ఆప్టిమైజ్ చేయగలిగామో ఈ రోజు నేను మీకు చెప్పాలనుకుంటున్నాను. దురదృష్టవశాత్తు, మేము పేర్లు లేకుండా చేయవలసి ఉంటుంది, మాకు NDA ఉన్నందున, వ్యాసంలోని కంటెంట్ దీని నుండి బాధపడదని మేము ఆశిస్తున్నాము. వెళ్దాం.

ప్రాజెక్ట్ ఎలా పనిచేస్తుంది

మా బ్యాకెండ్‌లో, మా క్లయింట్ వెబ్‌సైట్‌లు మరియు మొబైల్ అప్లికేషన్ యొక్క పనితీరును నిర్ధారించే సేవలను మేము సృష్టిస్తాము. సాధారణ నిర్మాణాన్ని రేఖాచిత్రంలో చూడవచ్చు:

ElasticSearchతో హైలోడ్ ప్రాజెక్ట్‌లో ఆప్టిమైజేషన్‌ని లోడ్ చేయండి

పని ప్రక్రియలో, మేము పెద్ద సంఖ్యలో లావాదేవీలను ప్రాసెస్ చేస్తాము: కొనుగోళ్లు, చెల్లింపులు, వినియోగదారు బ్యాలెన్స్‌లతో కార్యకలాపాలు, దీని కోసం మేము చాలా లాగ్‌లను నిల్వ చేస్తాము, అలాగే ఈ డేటాను బాహ్య సిస్టమ్‌లకు దిగుమతి మరియు ఎగుమతి చేస్తాము.

మేము క్లయింట్ నుండి డేటాను స్వీకరించినప్పుడు మరియు దానిని వినియోగదారుకు బదిలీ చేసినప్పుడు రివర్స్ ప్రక్రియలు కూడా ఉన్నాయి. అదనంగా, చెల్లింపులు మరియు బోనస్ ప్రోగ్రామ్‌లతో పని చేయడానికి ఇంకా ప్రక్రియలు ఉన్నాయి.

సంక్షిప్త నేపథ్యం

ప్రారంభంలో, మేము PostgreSQLని మాత్రమే డేటా స్టోర్‌గా ఉపయోగించాము. DBMS కోసం దాని ప్రామాణిక ప్రయోజనాలు: లావాదేవీల ఉనికి, అభివృద్ధి చెందిన డేటా నమూనా భాష, ఏకీకరణ కోసం విస్తృత శ్రేణి సాధనాలు; మంచి పనితీరుతో కలిపి చాలా కాలం పాటు మా అవసరాలను తీర్చింది.

మేము పోస్ట్‌గ్రెస్‌లో ఖచ్చితంగా మొత్తం డేటాను నిల్వ చేసాము: లావాదేవీల నుండి వార్తల వరకు. కానీ వినియోగదారుల సంఖ్య పెరిగింది మరియు దానితో అభ్యర్థనల సంఖ్య పెరిగింది.

అవగాహన కోసం, డెస్క్‌టాప్ సైట్‌లో మాత్రమే 2017లో వార్షిక సెషన్‌ల సంఖ్య 131 మిలియన్లు. 2018లో - 125 మిలియన్లు. 2019లో మళ్లీ 130 మిలియన్లు. సైట్ యొక్క మొబైల్ వెర్షన్ మరియు మొబైల్ అప్లికేషన్ నుండి మరో 100-200 మిలియన్లను జోడించండి మరియు మీరు భారీ సంఖ్యలో అభ్యర్థనలను పొందుతుంది.

ప్రాజెక్ట్ యొక్క పెరుగుదలతో, పోస్ట్‌గ్రెస్ లోడ్‌ను ఎదుర్కోవడం ఆపివేసింది, మాకు సమయం లేదు - పెద్ద సంఖ్యలో వివిధ ప్రశ్నలు కనిపించాయి, దీని కోసం మేము తగిన సంఖ్యలో సూచికలను సృష్టించలేము.

మా అవసరాలను అందించే మరియు PostgreSQL నుండి భారాన్ని తగ్గించే ఇతర డేటా స్టోర్‌ల అవసరం ఉందని మేము అర్థం చేసుకున్నాము. సాగే శోధన మరియు మొంగోడిబి సాధ్యమైన ఎంపికలుగా పరిగణించబడ్డాయి. తరువాతి పాయింట్లను కోల్పోయింది:

  1. ఇండెక్స్‌లలో డేటా మొత్తం పెరిగే కొద్దీ ఇండెక్సింగ్ వేగం తగ్గుతుంది. ఎలాస్టిక్‌తో, వేగం డేటా మొత్తంపై ఆధారపడి ఉండదు.
  2. పూర్తి వచన శోధన లేదు

కాబట్టి మేము మా కోసం ఎలాస్టిక్‌ను ఎంచుకున్నాము మరియు పరివర్తనకు సిద్ధమయ్యాము.

సాగే పరివర్తన

1. మేము పాయింట్ ఆఫ్ సేల్ శోధన సేవ నుండి పరివర్తనను ప్రారంభించాము. మా క్లయింట్ మొత్తం 70 పాయింట్ల విక్రయాలను కలిగి ఉంది మరియు దీనికి సైట్‌లో మరియు అప్లికేషన్‌లో అనేక రకాల శోధనలు అవసరం:

  • నగరం పేరు ద్వారా టెక్స్ట్ శోధన
  • కొంత పాయింట్ నుండి ఇచ్చిన వ్యాసార్థంలో జియోసెర్చ్. ఉదాహరణకు, వినియోగదారు తన ఇంటికి దగ్గరగా ఉన్న విక్రయ కేంద్రాలను చూడాలనుకుంటే.
  • ఇచ్చిన స్క్వేర్ ద్వారా శోధించండి - వినియోగదారు మ్యాప్‌లో ఒక చతురస్రాన్ని గీస్తారు మరియు ఈ వ్యాసార్థంలో ఉన్న అన్ని పాయింట్లు అతనికి చూపబడతాయి.
  • అదనపు ఫిల్టర్‌ల ద్వారా శోధించండి. విక్రయ పాయింట్లు కలగలుపులో ఒకదానికొకటి భిన్నంగా ఉంటాయి

మేము సంస్థ గురించి మాట్లాడినట్లయితే, పోస్ట్‌గ్రెస్‌లో మ్యాప్ మరియు వార్తల కోసం డేటా మూలాన్ని కలిగి ఉంటాము మరియు సాగే స్నాప్‌షాట్‌లలో అసలు డేటా నుండి తీసుకోబడుతుంది. వాస్తవం ఏమిటంటే, మొదట పోస్ట్‌గ్రెస్ అన్ని ప్రమాణాల ద్వారా శోధనను ఎదుర్కోలేకపోయాడు. అనేక సూచికలు ఉండటమే కాకుండా, అవి అతివ్యాప్తి చెందుతాయి, కాబట్టి పోస్ట్‌గ్రెస్ షెడ్యూలర్ కోల్పోయింది మరియు ఏ సూచికను ఉపయోగించాలో అర్థం కాలేదు.

2. తదుపరి వరుసలో వార్తల విభాగం ఉంది. ప్రచురణలు ప్రతిరోజూ సైట్‌లో కనిపిస్తాయి, తద్వారా వినియోగదారు సమాచార ప్రవాహంలో కోల్పోరు, డేటా జారీ చేయడానికి ముందు తప్పనిసరిగా క్రమబద్ధీకరించబడాలి. దీని కోసం శోధన ఉంది: మీరు టెక్స్ట్ మ్యాచ్ ద్వారా సైట్‌ను శోధించవచ్చు మరియు అదే సమయంలో అదనపు ఫిల్టర్‌లను కనెక్ట్ చేయవచ్చు, ఎందుకంటే అవి సాగే ద్వారా కూడా తయారు చేయబడతాయి.

3. తర్వాత మేము లావాదేవీ ప్రాసెసింగ్‌ని తరలించాము. వినియోగదారులు సైట్‌లో నిర్దిష్ట ఉత్పత్తిని కొనుగోలు చేయవచ్చు మరియు బహుమతి డ్రాలో పాల్గొనవచ్చు. అటువంటి కొనుగోళ్ల తర్వాత, మేము పెద్ద మొత్తంలో డేటాను ప్రాసెస్ చేస్తాము, ముఖ్యంగా వారాంతాల్లో మరియు సెలవు దినాల్లో. పోలిక కోసం, సాధారణ రోజుల్లో కొనుగోళ్ల సంఖ్య ఎక్కడో 1,5-2 మిలియన్ల మధ్య ఉంటే, సెలవు దినాల్లో ఈ సంఖ్య 53 మిలియన్లకు చేరుకుంటుంది.

అదే సమయంలో, డేటా సాధ్యమైనంత తక్కువ సమయంలో ప్రాసెస్ చేయబడాలి - వినియోగదారులు చాలా రోజులు ఫలితం కోసం వేచి ఉండటానికి ఇష్టపడరు. Postgres ద్వారా అటువంటి గడువులను సాధించడానికి మార్గం లేదు - మేము తరచుగా లాక్‌లను అందుకుంటాము మరియు మేము అన్ని అభ్యర్థనలను ప్రాసెస్ చేస్తున్నప్పుడు, వినియోగదారులు బహుమతులు అందుకున్నారా లేదా అని తనిఖీ చేయలేరు. వ్యాపారానికి ఇది అంత ఆహ్లాదకరమైనది కాదు, కాబట్టి మేము ప్రాసెసింగ్‌ని ఎలాస్టిక్‌సెర్చ్‌కి తరలించాము.

ఆవర్తకత

ఇప్పుడు నవీకరణలు క్రింది షరతుల ప్రకారం ఈవెంట్-ఆధారితంగా కాన్ఫిగర్ చేయబడ్డాయి:

  1. సేల్స్ పాయింట్లు. మేము బాహ్య మూలం నుండి డేటాను స్వీకరించిన వెంటనే, మేము వెంటనే నవీకరణను ప్రారంభిస్తాము.
  2. వార్తలు. సైట్‌లో ఏదైనా వార్తను సవరించిన వెంటనే, అది స్వయంచాలకంగా ఎలాస్టిక్‌కు పంపబడుతుంది.

ఇక్కడ మళ్లీ సాగే ప్రయోజనాలను ప్రస్తావించడం విలువ. పోస్ట్‌గ్రెస్‌లో, అభ్యర్థనను పంపేటప్పుడు, అది అన్ని రికార్డులను నిజాయితీగా ప్రాసెస్ చేసే వరకు మీరు వేచి ఉండాలి. మీరు 10 రికార్డ్‌లను ఎలాస్టిక్‌కి పంపవచ్చు మరియు రికార్డ్‌లు అన్ని షార్డ్‌లలో పంపిణీ చేయబడే వరకు వేచి ఉండకుండా వెంటనే పని చేయడం ప్రారంభించవచ్చు. వాస్తవానికి, కొన్ని షార్డ్ లేదా రెప్లికా డేటాను వెంటనే చూడకపోవచ్చు, కానీ ప్రతిదీ అతి త్వరలో అందుబాటులోకి వస్తుంది.

ఇంటిగ్రేషన్ పద్ధతులు

ఎలాస్టిక్‌తో ఏకీకృతం చేయడానికి 2 మార్గాలు ఉన్నాయి:

  1. TCP ద్వారా స్థానిక క్లయింట్ ద్వారా. స్థానిక డ్రైవర్ క్రమంగా చనిపోతోంది: దీనికి మద్దతు లేదు, ఇది చాలా అసౌకర్య వాక్యనిర్మాణాన్ని కలిగి ఉంది. అందువల్ల, మేము దానిని ఆచరణాత్మకంగా ఉపయోగించము మరియు దానిని పూర్తిగా వదిలివేయడానికి ప్రయత్నిస్తాము.
  2. JSON అభ్యర్థనలు మరియు లూసీన్ సింటాక్స్ రెండింటినీ ఉపయోగించగల HTTP ఇంటర్‌ఫేస్ ద్వారా. చివరిది సాగే టెక్స్ట్ ఇంజిన్. ఈ సంస్కరణలో, మేము HTTP ద్వారా JSON అభ్యర్థనల ద్వారా బ్యాచ్ చేయగల సామర్థ్యాన్ని పొందుతాము. ఇది మేము ఉపయోగించడానికి ప్రయత్నిస్తున్న ఎంపిక.

HTTP ఇంటర్‌ఫేస్‌కు ధన్యవాదాలు, మేము HTTP క్లయింట్ యొక్క అసమకాలిక అమలును అందించే లైబ్రరీలను ఉపయోగించవచ్చు. మేము బ్యాచ్ మరియు అసమకాలిక API యొక్క ప్రయోజనాన్ని పొందవచ్చు, ఇది అధిక పనితీరును కలిగిస్తుంది, ఇది పెద్ద ప్రమోషన్ రోజులలో చాలా సహాయపడింది (క్రింద ఉన్న వాటిపై మరిన్ని)

పోలిక కోసం కొన్ని సంఖ్యలు:

  • గ్రూపింగ్ లేకుండా 20 థ్రెడ్‌లలో పోస్ట్‌గ్రెస్ బౌంటీ వినియోగదారులను సేవ్ చేస్తోంది: 460713 సెకన్లలో 42 రికార్డ్‌లు
  • 10 థ్రెడ్‌ల కోసం సాగే + రియాక్టివ్ క్లయింట్ + 1000 మూలకాల కోసం బ్యాచ్: 596749 సెకన్లలో 11 రికార్డ్‌లు
  • 10 థ్రెడ్‌ల కోసం సాగే + రియాక్టివ్ క్లయింట్ + 1000 మూలకాల కోసం బ్యాచ్: 23801684 నిమిషాల్లో 4 ఎంట్రీలు

ఇప్పుడు మేము JSONని బ్యాచ్/కాట్ బ్యాచ్‌గా రూపొందించే HTTP అభ్యర్థన నిర్వాహకుడిని వ్రాసాము మరియు లైబ్రరీతో సంబంధం లేకుండా ఏదైనా HTTP క్లయింట్ ద్వారా పంపుతాము. మీరు అభ్యర్థనలను సమకాలిక లేదా అసమకాలికంగా పంపడాన్ని కూడా ఎంచుకోవచ్చు.

కొన్ని ఇంటిగ్రేషన్‌లలో, మేము ఇప్పటికీ అధికారిక రవాణా క్లయింట్‌ని ఉపయోగిస్తాము, అయితే ఇది తదుపరి రీఫ్యాక్టరింగ్‌కు సంబంధించిన విషయం. ఈ సందర్భంలో, ప్రాసెసింగ్ కోసం స్ప్రింగ్ వెబ్‌క్లయింట్ ఆధారంగా నిర్మించిన అనుకూల క్లయింట్ ఉపయోగించబడుతుంది.

ElasticSearchతో హైలోడ్ ప్రాజెక్ట్‌లో ఆప్టిమైజేషన్‌ని లోడ్ చేయండి

పెద్ద ప్రమోషన్

సంవత్సరానికి ఒకసారి, ప్రాజెక్ట్ వినియోగదారుల కోసం పెద్ద ప్రమోషన్‌ను హోస్ట్ చేస్తుంది - ఇది అదే హైలోడ్, ఎందుకంటే ఈ సమయంలో మేము ఒకేసారి పది లక్షల మంది వినియోగదారులతో పని చేస్తాము.

సాధారణంగా సెలవుల సమయంలో గరిష్ట లోడ్లు సంభవిస్తాయి, అయితే ఈ ప్రమోషన్ పూర్తిగా భిన్నమైన స్థాయిలో ఉంటుంది. గత సంవత్సరం, ప్రమోషన్ రోజున, మేము 27 యూనిట్ల వస్తువులను విక్రయించాము. డేటా అరగంటకు పైగా ప్రాసెస్ చేయబడింది, ఇది వినియోగదారులకు అసౌకర్యాన్ని కలిగించింది. వినియోగదారులు పాల్గొనడం కోసం బహుమతులు అందుకున్నారు, అయితే ప్రక్రియను వేగవంతం చేయాల్సిన అవసరం ఉందని స్పష్టమైంది.

2019 ప్రారంభంలో, మాకు సాగే శోధన అవసరమని మేము నిర్ణయించుకున్నాము. మొత్తం సంవత్సరం పాటు, మేము ఎలాస్టిక్‌లో స్వీకరించిన డేటా యొక్క ప్రాసెసింగ్ మరియు మొబైల్ అప్లికేషన్ మరియు వెబ్‌సైట్ యొక్క APIలో వాటి జారీని నిర్వహించాము. ఫలితంగా, మరుసటి సంవత్సరం ప్రచార సమయంలో, మేము ప్రాసెస్ చేసాము 15 నిమిషాల్లో 131 ఎంట్రీలు.

వస్తువులను కొనుగోలు చేయాలనుకునే మరియు ప్రమోషన్‌లలో బహుమతుల డ్రాయింగ్‌లో పాల్గొనాలనుకునే వారు చాలా మంది ఉన్నందున, ఇది తాత్కాలిక చర్య. ఇప్పుడు మేము తాజా సమాచారాన్ని ఎలాస్టిక్‌కి పంపుతున్నాము, అయితే భవిష్యత్తులో మేము గత నెలల్లో ఆర్కైవ్ చేసిన సమాచారాన్ని శాశ్వత నిల్వగా Postgresకి బదిలీ చేయాలని ప్లాన్ చేస్తున్నాము. సాగే సూచికను అడ్డుకోకుండా ఉండటానికి, దాని పరిమితులు కూడా ఉన్నాయి.

ముగింపు/ముగింపులు

ప్రస్తుతానికి, మేము కోరుకున్న అన్ని సేవలను ఎలాస్టిక్‌కి బదిలీ చేసాము మరియు ప్రస్తుతానికి దీనిపై పాజ్ చేసాము. ఇప్పుడు మేము పోస్ట్‌గ్రెస్‌లోని ప్రధాన నిరంతర నిల్వ పైన ఎలాస్టిక్‌లో సూచికను రూపొందిస్తున్నాము, ఇది వినియోగదారు లోడ్‌ను తీసుకుంటుంది.

భవిష్యత్తులో, డేటా అభ్యర్థన చాలా వైవిధ్యంగా మారిందని మరియు అపరిమిత సంఖ్యలో నిలువు వరుసల కోసం శోధించబడిందని మేము అర్థం చేసుకున్నట్లయితే మేము సేవలను బదిలీ చేయడానికి ప్లాన్ చేస్తాము. పోస్ట్‌గ్రెస్‌కి ఇది ఇకపై పని కాదు.

మనకు కార్యాచరణలో పూర్తి-వచన శోధన అవసరమైతే లేదా మనకు చాలా విభిన్న శోధన ప్రమాణాలు ఉంటే, ఇది సాగే భాషలోకి అనువదించాల్సిన అవసరం ఉందని మాకు ఇప్పటికే తెలుసు.

⌘⌘⌘

చదివినందుకు ధన్యవాదములు. మీ కంపెనీ కూడా ElasticSearchని ఉపయోగిస్తుంటే మరియు దాని స్వంత అమలు కేసులు ఉంటే, మాకు చెప్పండి. ఇతరులు ఎలా ఉన్నారో తెలుసుకోవడం ఆసక్తికరంగా ఉంటుంది 🙂

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి