ఐదుగురు విద్యార్థులు మరియు ముగ్గురు కీ-విలువ దుకాణాలను పంపిణీ చేశారు

లేదా మేము ZooKeeper, etcd మరియు కాన్సుల్ KV కోసం క్లయింట్ C++ లైబ్రరీని ఎలా వ్రాసాము

పంపిణీ చేయబడిన వ్యవస్థల ప్రపంచంలో, అనేక సాధారణ పనులు ఉన్నాయి: క్లస్టర్ యొక్క కూర్పు గురించి సమాచారాన్ని నిల్వ చేయడం, నోడ్‌ల కాన్ఫిగరేషన్‌ను నిర్వహించడం, తప్పు నోడ్‌లను గుర్తించడం, నాయకుడిని ఎంచుకోవడం మరియు ఇతరులు. ఈ సమస్యలను పరిష్కరించడానికి, ప్రత్యేక పంపిణీ వ్యవస్థలు సృష్టించబడ్డాయి - సమన్వయ సేవలు. ఇప్పుడు మేము వాటిలో మూడింటిపై ఆసక్తి కలిగి ఉంటాము: ZooKeeper, etcd మరియు Consul. కాన్సుల్ యొక్క అన్ని గొప్ప కార్యాచరణలలో, మేము కాన్సుల్ KV పై దృష్టి పెడతాము.

ఐదుగురు విద్యార్థులు మరియు ముగ్గురు కీ-విలువ దుకాణాలను పంపిణీ చేశారు

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

ఈ సమస్యను పరిష్కరించాలనే ఆలోచన ఆస్ట్రేలియన్ కన్సల్టింగ్ ఏజెన్సీలో ఉద్భవించింది మరియు దానిని అమలు చేయడానికి ఒక చిన్న విద్యార్థుల బృందం మాకు వచ్చింది, దాని గురించి నేను మాట్లాడబోతున్నాను.

మేము ZooKeeper, etcd మరియు కాన్సుల్ KVతో పని చేయడానికి ఒక సాధారణ ఇంటర్‌ఫేస్‌ను అందించే లైబ్రరీని సృష్టించగలిగాము. లైబ్రరీ C++లో వ్రాయబడింది, కానీ దానిని ఇతర భాషలకు పోర్ట్ చేయడానికి ప్రణాళికలు ఉన్నాయి.

డేటా మోడల్స్

మూడు వేర్వేరు సిస్టమ్‌ల కోసం ఒక సాధారణ ఇంటర్‌ఫేస్‌ను అభివృద్ధి చేయడానికి, అవి ఉమ్మడిగా మరియు అవి ఎలా విభిన్నంగా ఉన్నాయో మీరు అర్థం చేసుకోవాలి. దాన్ని గుర్తించండి.

జూకీపర్

ఐదుగురు విద్యార్థులు మరియు ముగ్గురు కీ-విలువ దుకాణాలను పంపిణీ చేశారు

కీలు చెట్టుగా నిర్వహించబడతాయి మరియు వాటిని నోడ్స్ అంటారు. దీని ప్రకారం, ఒక నోడ్ కోసం మీరు దాని పిల్లల జాబితాను పొందవచ్చు. znode (సృష్టించు) మరియు విలువను మార్చడం (setData) యొక్క కార్యకలాపాలు వేరు చేయబడతాయి: ఇప్పటికే ఉన్న కీలు మాత్రమే చదవబడతాయి మరియు మార్చబడతాయి. నోడ్ ఉనికిని తనిఖీ చేయడం, విలువను చదవడం మరియు పిల్లలను పొందడం వంటి కార్యకలాపాలకు గడియారాలు జోడించబడతాయి. వాచ్ అనేది సర్వర్‌లోని సంబంధిత డేటా యొక్క సంస్కరణ మారినప్పుడు మంటలను సృష్టించే వన్-టైమ్ ట్రిగ్గర్. వైఫల్యాలను గుర్తించడానికి ఎఫెమెరల్ నోడ్స్ ఉపయోగించబడతాయి. వాటిని సృష్టించిన క్లయింట్ యొక్క సెషన్‌తో అవి ముడిపడి ఉంటాయి. క్లయింట్ సెషన్‌ను మూసివేసినప్పుడు లేదా జూకీపర్‌కు దాని ఉనికి గురించి తెలియజేయడం ఆపివేసినప్పుడు, ఈ నోడ్‌లు స్వయంచాలకంగా తొలగించబడతాయి. సాధారణ లావాదేవీలకు మద్దతు ఉంది - వాటిలో కనీసం ఒకదానికి ఇది సాధ్యం కాకపోతే అన్నీ విజయవంతం లేదా విఫలమయ్యే కార్యకలాపాల సమితి.

మొదలైనవి

ఐదుగురు విద్యార్థులు మరియు ముగ్గురు కీ-విలువ దుకాణాలను పంపిణీ చేశారు

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

etcdకి స్టాండర్డ్ కంపేర్ అండ్ సెట్ ఆపరేషన్ లేదు, కానీ దానిలో మెరుగ్గా ఉంది: లావాదేవీలు. వాస్తవానికి, అవి మూడు సిస్టమ్‌లలో ఉన్నాయి, అయితే etcd లావాదేవీలు చాలా మంచివి. అవి మూడు బ్లాక్‌లను కలిగి ఉంటాయి: చెక్, విజయం, వైఫల్యం. మొదటి బ్లాక్ షరతుల సమితిని కలిగి ఉంటుంది, రెండవ మరియు మూడవ - కార్యకలాపాలు. లావాదేవీ అటామిక్‌గా అమలు చేయబడుతుంది. అన్ని షరతులు నిజమైతే, సక్సెస్ బ్లాక్ అమలు చేయబడుతుంది, లేకపోతే వైఫల్యం బ్లాక్ అమలు చేయబడుతుంది. API 3.3లో, విజయం మరియు వైఫల్యం బ్లాక్‌లు సమూహ లావాదేవీలను కలిగి ఉంటాయి. అంటే, దాదాపు ఏకపక్ష గూడు స్థాయి యొక్క షరతులతో కూడిన నిర్మాణాలను పరమాణుపరంగా అమలు చేయడం సాధ్యపడుతుంది. మీరు ఏ తనిఖీలు మరియు కార్యకలాపాల నుండి ఉన్నారనే దాని గురించి మరింత తెలుసుకోవచ్చు డాక్యుమెంటేషన్.

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

కాన్సుల్ కె.వి.

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

ఐదుగురు విద్యార్థులు మరియు ముగ్గురు కీ-విలువ దుకాణాలను పంపిణీ చేశారు
వాచ్‌లకు బదులుగా, కాన్సుల్ HTTP అభ్యర్థనలను బ్లాక్ చేస్తున్నారు. సారాంశంలో, ఇవి డేటా రీడింగ్ పద్ధతికి సాధారణ కాల్‌లు, దీని కోసం, ఇతర పారామితులతో పాటు, డేటా యొక్క చివరిగా తెలిసిన వెర్షన్ సూచించబడుతుంది. సర్వర్‌లోని సంబంధిత డేటా యొక్క ప్రస్తుత వెర్షన్ పేర్కొన్న దానికంటే ఎక్కువగా ఉంటే, ప్రతిస్పందన వెంటనే తిరిగి వస్తుంది, లేకపోతే - విలువ మారినప్పుడు. ఏ సమయంలోనైనా కీలకు జోడించబడే సెషన్‌లు కూడా ఉన్నాయి. సెషన్‌లను తొలగించడం అనుబంధ కీల తొలగింపుకు దారితీసే etcd మరియు ZooKeeper వలె కాకుండా, సెషన్ వాటి నుండి అన్‌లింక్ చేయబడే మోడ్ ఉంది. అందుబాటులో ఉంది లావాదేవీలు, శాఖలు లేకుండా, కానీ అన్ని రకాల తనిఖీలతో.

అన్నిటినీ కలిపి చూస్తే

ZooKeeper అత్యంత కఠినమైన డేటా మోడల్‌ను కలిగి ఉంది. etcdలో అందుబాటులో ఉన్న వ్యక్తీకరణ శ్రేణి ప్రశ్నలను ZooKeeper లేదా Consulలో సమర్థవంతంగా అనుకరించడం సాధ్యం కాదు. అన్ని సేవల నుండి ఉత్తమమైన వాటిని చేర్చడానికి ప్రయత్నిస్తూ, మేము క్రింది ముఖ్యమైన మినహాయింపులతో ZooKeeper ఇంటర్‌ఫేస్‌కు దాదాపు సమానమైన ఇంటర్‌ఫేస్‌తో ముగించాము:

  • క్రమం, కంటైనర్ మరియు TTL నోడ్స్ మద్దతు ఇవ్వ లేదు
  • ACLలకు మద్దతు లేదు
  • సెట్ పద్ధతి ఉనికిలో లేకుంటే ఒక కీని సృష్టిస్తుంది (ZK సెట్‌డేటా ఈ సందర్భంలో లోపాన్ని అందిస్తుంది)
  • సెట్ మరియు కాస్ పద్ధతులు వేరు చేయబడతాయి (ZKలో అవి తప్పనిసరిగా ఒకే విషయం)
  • ఎరేస్ మెథడ్ దాని సబ్‌ట్రీతో పాటు నోడ్‌ను తొలగిస్తుంది (ZKలో డిలీట్ నోడ్‌కు పిల్లలు ఉన్నట్లయితే లోపాన్ని అందిస్తుంది)
  • ప్రతి కీకి ఒక వెర్షన్ మాత్రమే ఉంటుంది - విలువ వెర్షన్ (ZKలో వాటిలో మూడు ఉన్నాయి)

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

శీర్షాన్ని తొలగించేటప్పుడు ZooKeeper మాదిరిగానే ప్రవర్తనను అమలు చేయడానికి etcd మరియు కాన్సుల్‌లోని ప్రతి కీకి ప్రత్యేక చైల్డ్ కౌంటర్‌ను నిర్వహించడం అవసరం. మేము మెటా సమాచారాన్ని నిల్వ చేయడాన్ని నివారించడానికి ప్రయత్నించాము కాబట్టి, మొత్తం సబ్‌ట్రీని తొలగించాలని నిర్ణయించారు.

అమలు యొక్క సూక్ష్మబేధాలు

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

మొదలైన వాటిలో సోపానక్రమం

etcdలో క్రమానుగత వీక్షణను నిర్వహించడం అత్యంత ఆసక్తికరమైన పనిగా మారింది. శ్రేణి ప్రశ్నలు పేర్కొన్న ఉపసర్గతో కీల జాబితాను తిరిగి పొందడాన్ని సులభతరం చేస్తాయి. ఉదాహరణకు, మీకు ప్రారంభమయ్యే ప్రతిదీ అవసరమైతే "/foo", మీరు పరిధి కోసం అడుగుతున్నారు ["/foo", "/fop"). కానీ ఇది కీ యొక్క మొత్తం సబ్‌ట్రీని తిరిగి ఇస్తుంది, సబ్‌ట్రీ పెద్దది అయితే ఇది ఆమోదయోగ్యం కాదు. మొదట మేము కీలకమైన అనువాద యంత్రాంగాన్ని ఉపయోగించాలని అనుకున్నాము, zetcdలో అమలు చేయబడింది. ఇది చెట్టులోని నోడ్ యొక్క లోతుకు సమానమైన కీ ప్రారంభంలో ఒక బైట్‌ను జోడించడం. నేను మీకు ఒక ఉదాహరణ చెబుతాను.

"/foo" -> "u01/foo"
"/foo/bar" -> "u02/foo/bar"

అప్పుడు కీ యొక్క అన్ని తక్షణ పిల్లలను పొందండి "/foo" పరిధిని అభ్యర్థించడం ద్వారా సాధ్యమవుతుంది ["u02/foo/", "u02/foo0"). అవును, ASCIIలో "0" వెంటనే నిలుస్తుంది "/".

కానీ ఈ సందర్భంలో ఒక శీర్షం యొక్క తొలగింపును ఎలా అమలు చేయాలి? మీరు రకం యొక్క అన్ని పరిధులను తొలగించాల్సిన అవసరం ఉందని ఇది మారుతుంది ["uXX/foo/", "uXX/foo0") XX కోసం 01 నుండి FF వరకు. ఆపై మేము పరిగెత్తాము ఆపరేషన్ సంఖ్య పరిమితి ఒక లావాదేవీ లోపల.

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

"/very" -> "/u00very"
"/very/long" -> "/very/u00long"
"/very/long/path" -> "/very/long/u00path"

ఆపై కీని తొలగిస్తోంది "/very" తొలగింపుగా మారుతుంది "/u00very" మరియు పరిధి ["/very/", "/very0"), మరియు పిల్లలందరినీ పొందడం - పరిధి నుండి కీల కోసం అభ్యర్థనలో ["/very/u00", "/very/u01").

ZooKeeperలో కీని తీసివేస్తోంది

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

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

జూకీపర్‌లో సెట్ చేయబడింది

ZooKeeperలో ట్రీ స్ట్రక్చర్‌తో పనిచేసే ప్రత్యేక పద్ధతులు ఉన్నాయి (క్రియేట్, డిలీట్, గెట్‌చైల్డ్రెన్) మరియు నోడ్‌లలోని డేటాతో (సెట్‌డేటా, గెట్‌డేటా) పని చేస్తాయి. అంతేకాకుండా, అన్ని పద్ధతులకు కఠినమైన ముందస్తు షరతులు ఉంటాయి: క్రియేట్ నోడ్ ఇప్పటికే ఉన్నట్లయితే ఎర్రర్‌ను అందిస్తుంది. సృష్టించబడింది, తొలగించండి లేదా సెట్డేటా - ఇది ఇప్పటికే ఉనికిలో లేకుంటే. కీ ఉనికి గురించి ఆలోచించకుండా పిలవబడే సెట్ పద్ధతి మాకు అవసరం.

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

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

మరిన్ని సాంకేతిక వివరాలు

ఈ విభాగంలో మేము పంపిణీ చేయబడిన వ్యవస్థల నుండి విరామం తీసుకుంటాము మరియు కోడింగ్ గురించి మాట్లాడుతాము.
కస్టమర్ యొక్క ప్రధాన అవసరాలలో ఒకటి క్రాస్-ప్లాట్‌ఫారమ్: కనీసం ఒక సేవలకు Linux, MacOS మరియు Windowsలో తప్పనిసరిగా మద్దతు ఇవ్వాలి. ప్రారంభంలో, మేము Linux కోసం మాత్రమే అభివృద్ధి చేసాము మరియు తరువాత ఇతర సిస్టమ్‌లలో పరీక్షించడం ప్రారంభించాము. ఇది చాలా సమస్యలను కలిగించింది, ఇది కొంతకాలం ఎలా చేరుకోవాలో పూర్తిగా అస్పష్టంగా ఉంది. ఫలితంగా, మూడు కోఆర్డినేషన్ సేవలకు ఇప్పుడు Linux మరియు MacOSలో మద్దతు ఉంది, అయితే Windowsలో Consul KVకి మాత్రమే మద్దతు ఉంది.

మొదటి నుండి, మేము సేవలను యాక్సెస్ చేయడానికి రెడీమేడ్ లైబ్రరీలను ఉపయోగించడానికి ప్రయత్నించాము. ZooKeeper విషయంలో, ఎంపిక పడింది ZooKeeper C++, ఇది చివరికి Windowsలో కంపైల్ చేయడంలో విఫలమైంది. అయితే ఇది ఆశ్చర్యం కలిగించదు: లైబ్రరీ linux-మాత్రమేగా ఉంచబడింది. కాన్సుల్‌కు ఏకైక ఎంపిక ppconsul. దానికి మద్దతు జోడించాల్సి వచ్చింది సెషన్లు и లావాదేవీలు. etcd కోసం, ప్రోటోకాల్ యొక్క తాజా సంస్కరణకు మద్దతు ఇచ్చే పూర్తి స్థాయి లైబ్రరీ కనుగొనబడలేదు, కాబట్టి మేము కేవలం ఉత్పత్తి చేయబడిన grpc క్లయింట్.

ZooKeeper C++ లైబ్రరీ యొక్క అసమకాలిక ఇంటర్‌ఫేస్ ప్రేరణతో, మేము అసమకాలిక ఇంటర్‌ఫేస్‌ను కూడా అమలు చేయాలని నిర్ణయించుకున్నాము. ZooKeeper C++ దీని కోసం భవిష్యత్తు/ప్రామిస్ ప్రిమిటివ్‌లను ఉపయోగిస్తుంది. STL లో, దురదృష్టవశాత్తు, అవి చాలా నిరాడంబరంగా అమలు చేయబడతాయి. ఉదాహరణకు, లేదు అప్పుడు పద్ధతి, ఇది ఆమోదించబడిన ఫంక్షన్‌ని అందుబాటులోకి వచ్చినప్పుడు భవిష్యత్తు ఫలితానికి వర్తింపజేస్తుంది. మా విషయంలో, ఫలితాన్ని మా లైబ్రరీ ఫార్మాట్‌లోకి మార్చడానికి అటువంటి పద్ధతి అవసరం. ఈ సమస్యను అధిగమించడానికి, మేము మా స్వంత సాధారణ థ్రెడ్ పూల్‌ని అమలు చేయాల్సి వచ్చింది, ఎందుకంటే కస్టమర్ అభ్యర్థన మేరకు మేము బూస్ట్ వంటి భారీ థర్డ్-పార్టీ లైబ్రరీలను ఉపయోగించలేము.

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

మేము etcd మరియు కాన్సుల్‌కి ప్రశ్నలను అమలు చేయడానికి అదే థ్రెడ్ పూల్‌ని ఉపయోగించాము. దీని అర్థం అంతర్లీన లైబ్రరీలను బహుళ విభిన్న థ్రెడ్‌ల ద్వారా యాక్సెస్ చేయవచ్చు. ppconsul థ్రెడ్ సురక్షితం కాదు, కాబట్టి దానికి చేసే కాల్‌లు లాక్‌ల ద్వారా రక్షించబడతాయి.
మీరు బహుళ థ్రెడ్‌ల నుండి grpcతో పని చేయవచ్చు, కానీ సూక్ష్మబేధాలు ఉన్నాయి. etcd లో గడియారాలు grpc స్ట్రీమ్‌ల ద్వారా అమలు చేయబడతాయి. ఇవి ఒక నిర్దిష్ట రకం సందేశాల కోసం ద్విదిశాత్మక ఛానెల్‌లు. లైబ్రరీ అన్ని గడియారాల కోసం ఒకే థ్రెడ్‌ను మరియు ఇన్‌కమింగ్ సందేశాలను ప్రాసెస్ చేసే ఒకే థ్రెడ్‌ను సృష్టిస్తుంది. కాబట్టి grpc స్ట్రీమ్‌కు సమాంతర వ్రాతలను నిషేధిస్తుంది. దీనర్థం వాచ్‌ను ప్రారంభించేటప్పుడు లేదా తొలగించేటప్పుడు, మీరు తదుపరి అభ్యర్థనను పంపే ముందు పంపడం పూర్తయ్యే వరకు వేచి ఉండాలి. మేము సమకాలీకరణ కోసం ఉపయోగిస్తాము షరతులతో కూడిన వేరియబుల్స్.

ఫలితం

మీ కోసం చూడండి: liboffkv.

మా జట్టు: రేడ్ రోమనోవ్, ఇవాన్ గ్లుషెంకోవ్, డిమిత్రి కమల్డినోవ్, విక్టర్ క్రాపివెన్స్కీ, విటాలీ ఇవానిన్.

మూలం: www.habr.com

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