న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

ఎంట్రీ

వందనాలు!

ఈ కథనంలో నేను నాడీ నెట్‌వర్క్‌లను ఉపయోగించి ప్రాజెక్ట్ కోసం మైక్రోసర్వీస్ ఆర్కిటెక్చర్‌ను నిర్మించడంలో నా అనుభవాన్ని పంచుకుంటాను.

ఆర్కిటెక్చర్ అవసరాల గురించి మాట్లాడుదాం, వివిధ నిర్మాణ రేఖాచిత్రాలను చూద్దాం, పూర్తయిన ఆర్కిటెక్చర్ యొక్క ప్రతి భాగాలను విశ్లేషించండి మరియు పరిష్కారం యొక్క సాంకేతిక కొలమానాలను కూడా విశ్లేషించండి.

మంచి పఠనం!

సమస్య మరియు దాని పరిష్కారం గురించి కొన్ని మాటలు

ఫోటో ఆధారంగా పది పాయింట్ల స్కేల్‌లో వ్యక్తి యొక్క ఆకర్షణను అంచనా వేయడం ప్రధాన ఆలోచన.

ఈ ఆర్టికల్‌లో ఉపయోగించిన న్యూరల్ నెట్‌వర్క్‌లు మరియు డేటా తయారీ మరియు శిక్షణ ప్రక్రియ రెండింటినీ వివరించకుండా మేము దూరంగా ఉంటాము. అయితే, కింది ప్రచురణల్లో ఒకదానిలో, మేము ఖచ్చితంగా లోతైన స్థాయిలో అంచనా పైప్‌లైన్‌ను విశ్లేషించడానికి తిరిగి వస్తాము.

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

ఆకర్షణీయత అంచనా పైప్‌లైన్‌పై పని చేస్తున్నప్పుడు, పని క్రింది భాగాలుగా కుళ్ళిపోయింది:

  1. ఫోటోలలో ముఖాలను ఎంచుకోవడం
  2. ప్రతి వ్యక్తి యొక్క రేటింగ్
  3. ఫలితాన్ని అందించండి

ముందుగా శిక్షణ పొందిన దళాల ద్వారా మొదటిది పరిష్కరించబడుతుంది MTCNN. రెండవది, ఒక కన్వల్యూషనల్ న్యూరల్ నెట్‌వర్క్‌ని ఉపయోగించి, పైటోర్చ్‌లో శిక్షణ పొందారు ResNet34 - బ్యాలెన్స్ నుండి "CPUపై అనుమితి నాణ్యత / వేగం"

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

మూల్యాంకన పైప్‌లైన్ యొక్క ఫంక్షనల్ రేఖాచిత్రం

ప్రాజెక్ట్ ఆర్కిటెక్చర్ అవసరాల విశ్లేషణ

జీవిత చక్రంలో ML మోడల్ డిప్లాయ్‌మెంట్ యొక్క నిర్మాణం మరియు ఆటోమేషన్‌పై పని యొక్క ప్రాజెక్ట్ దశలు తరచుగా ఎక్కువ సమయం తీసుకునే మరియు వనరులను వినియోగించేవి.

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

ML ప్రాజెక్ట్ యొక్క జీవిత చక్రం

ఈ ప్రాజెక్ట్ మినహాయింపు కాదు - అసెస్‌మెంట్ పైప్‌లైన్‌ను ఆన్‌లైన్ సేవలో చుట్టడానికి నిర్ణయం తీసుకోబడింది, దీనికి మనం ఆర్కిటెక్చర్‌లో మునిగిపోవాలి. కింది ప్రాథమిక అవసరాలు గుర్తించబడ్డాయి:

  1. ఏకీకృత లాగ్ నిల్వ - అన్ని సేవలు ఒకే చోట లాగ్‌లను వ్రాయాలి, అవి విశ్లేషించడానికి సౌకర్యవంతంగా ఉండాలి
  2. అసెస్‌మెంట్ సర్వీస్ యొక్క క్షితిజ సమాంతర స్కేలింగ్ యొక్క అవకాశం - చాలా మటుకు బాటిల్‌నెక్
  3. అనుమితి కోసం సమయం పంపిణీలో అవుట్‌లైయర్‌లను నివారించడానికి ప్రతి చిత్రాన్ని మూల్యాంకనం చేయడానికి అదే మొత్తంలో ప్రాసెసర్ వనరులను కేటాయించాలి
  4. నిర్దిష్ట సేవలు మరియు స్టాక్ మొత్తం రెండింటినీ వేగంగా (పునః) అమలు చేయడం
  5. అవసరమైతే, వివిధ సేవలలో సాధారణ వస్తువులను ఉపయోగించగల సామర్థ్యం

నిర్మాణం

అవసరాలను విశ్లేషించిన తర్వాత, మైక్రోసర్వీస్ ఆర్కిటెక్చర్ దాదాపుగా సరిగ్గా సరిపోతుందని స్పష్టమైంది.

అనవసరమైన తలనొప్పులను వదిలించుకోవడానికి, టెలిగ్రామ్ APIని ఫ్రంటెండ్‌గా ఎంచుకున్నారు.

మొదట, పూర్తయిన ఆర్కిటెక్చర్ యొక్క నిర్మాణ రేఖాచిత్రాన్ని చూద్దాం, ఆపై ప్రతి భాగాల వివరణకు వెళ్లండి మరియు విజయవంతమైన ఇమేజ్ ప్రాసెసింగ్ ప్రక్రియను కూడా అధికారికం చేయండి.

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

పూర్తయిన ఆర్కిటెక్చర్ యొక్క నిర్మాణ రేఖాచిత్రం

చిత్రాల మూల్యాంకన ప్రక్రియలో వాటిని ఒకే బాధ్యతగా సూచిస్తూ, రేఖాచిత్రంలోని ప్రతి భాగాల గురించి మరింత వివరంగా మాట్లాడుదాం.

మైక్రోసర్వీస్ “అట్రై-టెలిగ్రామ్-బోట్”

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

చిత్రంతో అనుకూల సందేశాన్ని స్వీకరించినప్పుడు:

  1. వడపోత క్రింది తనిఖీలను కలిగి ఉంటుంది:
    • సరైన చిత్ర పరిమాణం లభ్యత
    • ఇప్పటికే క్యూలో ఉన్న వినియోగదారు చిత్రాల సంఖ్య
  2. ప్రారంభ వడపోతను దాటినప్పుడు, చిత్రం డాకర్ వాల్యూమ్‌లో సేవ్ చేయబడుతుంది
  3. "to_estimate" క్యూలో ఒక టాస్క్ ఉత్పత్తి చేయబడుతుంది, ఇందులో ఇతర విషయాలతోపాటు, మా వాల్యూమ్‌లో ఉన్న ఇమేజ్‌కి మార్గం ఉంటుంది
  4. ఎగువ దశలను విజయవంతంగా పూర్తి చేసినట్లయితే, వినియోగదారు క్యూలో ఉన్న టాస్క్‌ల సంఖ్య ఆధారంగా లెక్కించబడే సుమారు ఇమేజ్ ప్రాసెసింగ్ సమయంతో సందేశాన్ని అందుకుంటారు. లోపం సంభవించినట్లయితే, ఏమి తప్పు జరిగి ఉండవచ్చు అనే సమాచారంతో సందేశాన్ని పంపడం ద్వారా వినియోగదారుకు స్పష్టంగా తెలియజేయబడుతుంది.

అలాగే, ఈ మైక్రోసర్వీస్, సెలెరీ వర్కర్ లాగా, మూల్యాంకన పైప్‌లైన్ గుండా వెళ్ళిన పనుల కోసం ఉద్దేశించబడిన “ఆఫ్టర్_ఎస్టిమేట్” క్యూను వింటుంది.

“after_estimate” నుండి కొత్త టాస్క్‌ను స్వీకరించినప్పుడు:

  1. చిత్రం విజయవంతంగా ప్రాసెస్ చేయబడితే, మేము ఫలితాన్ని వినియోగదారుకు పంపుతాము; లేకపోతే, మేము లోపం గురించి తెలియజేస్తాము.
  2. మూల్యాంకన పైప్‌లైన్ ఫలితంగా ఉన్న చిత్రాన్ని తీసివేయడం

మూల్యాంకనం మైక్రోసర్వీస్ “అట్రై-ఎస్టిమేటర్”

ఈ మైక్రోసర్వీస్ సెలెరీ వర్కర్ మరియు ఇమేజ్ ఎవాల్యుయేషన్ పైప్‌లైన్‌కు సంబంధించిన ప్రతిదానిని కలుపుతుంది. ఇక్కడ ఒక పని అల్గోరిథం మాత్రమే ఉంది - దానిని విశ్లేషిద్దాం.

“to_estimate” నుండి కొత్త టాస్క్‌ను స్వీకరించినప్పుడు:

  1. మూల్యాంకన పైప్‌లైన్ ద్వారా చిత్రాన్ని అమలు చేద్దాం:
    1. చిత్రాన్ని మెమరీలోకి లోడ్ చేస్తోంది
    2. మేము చిత్రాన్ని అవసరమైన పరిమాణానికి తీసుకువస్తాము
    3. అన్ని ముఖాలను కనుగొనడం (MTCNN)
    4. మేము అన్ని ముఖాలను మూల్యాంకనం చేస్తాము (చివరి దశలో కనుగొనబడిన ముఖాలను మేము బ్యాచ్‌గా మరియు అనుమితి ResNet34లోకి చుట్టాము)
    5. చివరి చిత్రాన్ని రెండర్ చేయండి
      1. సరిహద్దు పెట్టెలను గీయండి
      2. రేటింగ్‌లను గీయడం
  2. అనుకూల (అసలు) చిత్రాన్ని తొలగిస్తోంది
  3. మూల్యాంకన పైప్‌లైన్ నుండి అవుట్‌పుట్‌ను సేవ్ చేస్తోంది
  4. మేము టాస్క్‌ను "after_estimate" క్యూలో ఉంచాము, ఇది పైన చర్చించబడిన "attrai-telegram-bot" మైక్రోసర్వీస్ ద్వారా వినబడుతుంది.

గ్రేలాగ్ (+ mongoDB + సాగే శోధన)

గ్రేలాగ్ కేంద్రీకృత లాగ్ నిర్వహణకు ఒక పరిష్కారం. ఈ ప్రాజెక్ట్‌లో, ఇది దాని ఉద్దేశించిన ప్రయోజనం కోసం ఉపయోగించబడింది.

ఎంపిక అతనిపై పడింది మరియు సాధారణమైనది కాదు ELK స్టాక్, పైథాన్ నుండి దానితో పని చేసే సౌలభ్యం కారణంగా. గ్రేలాగ్‌కి లాగిన్ అవ్వడానికి మీరు చేయాల్సిందల్లా ప్యాకేజీ నుండి GELFTCPHandlerని జోడించడం బూడిదరంగు మా పైథాన్ మైక్రోసర్వీస్ యొక్క మిగిలిన రూట్ లాగర్ హ్యాండ్లర్‌లకు.

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

RabbitMQ

RabbitMQ AMQP ప్రోటోకాల్ ఆధారంగా సందేశ బ్రోకర్.

ఈ ప్రాజెక్ట్‌లో దీనిని ఉపయోగించారు అత్యంత స్థిరమైన మరియు సమయం-పరీక్షించబడినది Celery కోసం బ్రోకర్ మరియు మన్నికైన రీతిలో పనిచేశారు.

Redis

Redis కీ-విలువ డేటా నిర్మాణాలతో పనిచేసే NoSQL DBMS

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

ఉదాహరణకు, Redis "telegram_user_id => క్యూలో ఉన్న సక్రియ టాస్క్‌ల సంఖ్య" ఫారమ్ యొక్క హ్యాష్‌మ్యాప్‌ను నిల్వ చేస్తుంది, ఇది ఒక వినియోగదారు నుండి అభ్యర్థనల సంఖ్యను నిర్దిష్ట విలువకు పరిమితం చేయడానికి మరియు తద్వారా DoS దాడులను నిరోధించడానికి మిమ్మల్ని అనుమతిస్తుంది.

విజయవంతమైన ఇమేజ్ ప్రాసెసింగ్ ప్రక్రియను అధికారికం చేద్దాం

  1. వినియోగదారు టెలిగ్రామ్ బాట్‌కు చిత్రాన్ని పంపుతారు
  2. "attrai-telegram-bot" టెలిగ్రామ్ API నుండి సందేశాన్ని అందుకుంటుంది మరియు దానిని అన్వయిస్తుంది
  3. చిత్రంతో టాస్క్ అసమకాలిక క్యూ “to_estimate”కి జోడించబడింది
  4. ప్రణాళికాబద్ధమైన మూల్యాంకన సమయంతో వినియోగదారు సందేశాన్ని అందుకుంటారు
  5. “attrai-estimator” “to_estimate” క్యూ నుండి ఒక పనిని తీసుకుంటుంది, పైప్‌లైన్ ద్వారా అంచనాలను అమలు చేస్తుంది మరియు పనిని “after_estimate” క్యూలో ఉత్పత్తి చేస్తుంది
  6. "attrai-telegram-bot" "after_estimate" క్యూను వింటూ, ఫలితాన్ని వినియోగదారుకు పంపుతుంది

DevOps

చివరగా, నిర్మాణాన్ని సమీక్షించిన తర్వాత, మీరు సమానమైన ఆసక్తికరమైన భాగానికి వెళ్లవచ్చు - DevOps

డాకర్ సమూహం

 

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

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

"స్వార్మ్" ఉపయోగించి, మా క్లస్టర్‌లోని అన్ని నోడ్‌లను 2 రకాలుగా విభజించవచ్చు - వర్కర్ మరియు మేనేజర్. మొదటి రకం యంత్రాలపై, కంటైనర్ల సమూహాలు (స్టాక్స్) అమర్చబడతాయి, రెండవ రకం యంత్రాలు స్కేలింగ్, బ్యాలెన్సింగ్ మరియు ఇతర అద్భుతమైన లక్షణాలు. నిర్వాహకులు కూడా డిఫాల్ట్‌గా కార్మికులు.

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

ఒక లీడర్ మేనేజర్ మరియు ముగ్గురు వర్కర్లతో కూడిన క్లస్టర్

సాధ్యమయ్యే కనీస క్లస్టర్ పరిమాణం 1 నోడ్; ఒకే యంత్రం ఏకకాలంలో లీడర్ మేనేజర్‌గా మరియు వర్కర్‌గా పని చేస్తుంది. ప్రాజెక్ట్ పరిమాణం మరియు తప్పు సహనం కోసం కనీస అవసరాలు ఆధారంగా, ఈ విధానాన్ని ఉపయోగించాలని నిర్ణయించారు.

ముందుకు చూస్తే, జూన్ మధ్యలో జరిగిన మొదటి ఉత్పత్తి డెలివరీ నుండి, ఈ క్లస్టర్ సంస్థకు సంబంధించి ఎటువంటి సమస్యలు లేవని నేను చెబుతాను (కానీ అటువంటి సంస్థ ఏ మీడియం-లార్జ్‌లోనైనా ఆమోదయోగ్యంగా ఉంటుందని దీని అర్థం కాదు. ప్రాజెక్ట్‌లు, తప్పు సహనం అవసరాలకు లోబడి ఉంటాయి).

డాకర్ స్టాక్

సమూహ మోడ్‌లో, అతను స్టాక్‌లను (డాకర్ సేవల సెట్‌లు) అమలు చేయడానికి బాధ్యత వహిస్తాడు. డాకర్ స్టాక్

ఇది డాకర్-కంపోజ్ కాన్ఫిగర్‌లకు మద్దతిస్తుంది, అదనంగా డిప్లాయ్ ఎంపికలను ఉపయోగించడానికి మిమ్మల్ని అనుమతిస్తుంది.  

ఉదాహరణకు, ఈ పారామితులను ఉపయోగించి, ప్రతి మూల్యాంకన మైక్రోసర్వీస్ ఇన్‌స్టాన్స్‌లకు వనరులు పరిమితం చేయబడ్డాయి (మేము N సందర్భాలకు N కోర్లను కేటాయిస్తాము, మైక్రోసర్వీస్‌లోనే మేము PyTorch ఉపయోగించే కోర్ల సంఖ్యను ఒకదానికి పరిమితం చేస్తాము)

attrai_estimator:
  image: 'erqups/attrai_estimator:1.2'
  deploy:
    replicas: 4
    resources:
      limits:
        cpus: '4'
    restart_policy:
      condition: on-failure
      …

రెడిస్, రాబిట్‌ఎమ్‌క్యూ మరియు గ్రేలాగ్ స్టేట్‌ఫుల్ సేవలు మరియు వాటిని “అట్రై-ఎస్టిమేటర్” అంత సులభంగా స్కేల్ చేయడం సాధ్యం కాదని గమనించడం ముఖ్యం.

ప్రశ్నకు ముందుచూపు - కుబెర్నెట్స్ ఎందుకు కాదు?

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

మౌలిక

ఇవన్నీ క్రింది లక్షణాలతో VDSలో అమలు చేయబడ్డాయి:

  • CPU: 4 కోర్ Intel® Xeon® Gold 5120 CPU @ 2.20GHz
  • RAM: X GB GB
  • SSD: 160GB

స్థానిక లోడ్ పరీక్ష తర్వాత, వినియోగదారుల యొక్క తీవ్రమైన ప్రవాహంతో, ఈ యంత్రం సరిపోతుందని అనిపించింది.

కానీ, విస్తరణ జరిగిన వెంటనే, నేను CISలోని అత్యంత జనాదరణ పొందిన ఇమేజ్‌బోర్డ్‌లలో ఒకదానికి లింక్‌ను పోస్ట్ చేసాను (అవును, అదే ఒకటి), దాని తర్వాత వ్యక్తులు ఆసక్తి కనబరిచారు మరియు కొన్ని గంటల్లో సేవ విజయవంతంగా పదివేల చిత్రాలను ప్రాసెస్ చేసింది. అదే సమయంలో, పీక్ మూమెంట్లలో, CPU మరియు RAM వనరులు సగం కూడా ఉపయోగించబడలేదు.

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం
న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

మరికొన్ని గ్రాఫిక్స్

అమలు చేసినప్పటి నుండి రోజును బట్టి ప్రత్యేక వినియోగదారుల సంఖ్య మరియు మూల్యాంకన అభ్యర్థనలు

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

మూల్యాంకనం పైప్‌లైన్ అనుమితి సమయ పంపిణీ

న్యూరల్ నెట్‌వర్క్‌ల ఆధారంగా ప్రదర్శన అంచనా కోసం సర్వీస్ ఆర్కిటెక్చర్ యొక్క సాధారణ అవలోకనం

కనుగొన్న

సంగ్రహంగా చెప్పాలంటే, ఆర్కిటెక్చర్ మరియు కంటైనర్ల ఆర్కెస్ట్రేషన్ యొక్క విధానం తమను తాము పూర్తిగా సమర్థించుకున్నాయని నేను చెప్పగలను - పీక్ క్షణాలలో కూడా ప్రాసెసింగ్ సమయంలో చుక్కలు లేదా కుంగిపోవడం లేదు. 

వారి ప్రక్రియలో CPUపై న్యూరల్ నెట్‌వర్క్‌ల యొక్క నిజ-సమయ అనుమితిని ఉపయోగించే చిన్న మరియు మధ్య తరహా ప్రాజెక్ట్‌లు ఈ కథనంలో వివరించిన పద్ధతులను విజయవంతంగా అవలంబించగలవని నేను భావిస్తున్నాను.

మొదట్లో వ్యాసం పొడవుగా ఉందని నేను జోడిస్తాను, కానీ ఎక్కువసేపు చదవకుండా ఉండేందుకు, ఈ వ్యాసంలోని కొన్ని అంశాలను వదిలివేయాలని నిర్ణయించుకున్నాను - మేము వాటిని భవిష్యత్ ప్రచురణలలో తిరిగి ఇస్తాము.

మీరు టెలిగ్రామ్‌లో బోట్‌ను పొక్ చేయవచ్చు - @AttraiBot, ఇది కనీసం 2020 శరదృతువు చివరి వరకు పని చేస్తుంది. వినియోగదారు డేటా ఏదీ నిల్వ చేయబడదని నేను మీకు గుర్తు చేస్తాను - అసలు చిత్రాలు లేదా మూల్యాంకన పైప్‌లైన్ ఫలితాలు - ప్రాసెస్ చేసిన తర్వాత ప్రతిదీ కూల్చివేయబడుతుంది.

మూలం: www.habr.com

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