మా ఓపెన్ సోర్స్ చరిత్ర: మేము Goలో ఒక విశ్లేషణ సేవను ఎలా తయారు చేసాము మరియు దానిని పబ్లిక్‌గా అందుబాటులో ఉంచాము

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

కానీ మేము ఇంకా పరిష్కరించని సమస్యను కనుగొన్నాము. అలా పుట్టింది ఈవెంట్ స్థానిక - ఓపెన్ సోర్స్ అనలిటిక్స్ సర్వీస్. మేము మా స్వంత సేవను అభివృద్ధి చేయడానికి ఎందుకు వెళ్లాము, అది మాకు ఏమి ఇచ్చింది మరియు చివరికి ఏమి జరిగింది (కోడ్ ముక్కలతో), కట్ కింద చదవండి.

మా ఓపెన్ సోర్స్ చరిత్ర: మేము Goలో ఒక విశ్లేషణ సేవను ఎలా తయారు చేసాము మరియు దానిని పబ్లిక్‌గా అందుబాటులో ఉంచాము

మన స్వంత సేవను మనం ఎందుకు అభివృద్ధి చేసుకోవాలి?

ఇది తొంభైల కాలం, మేము సాధ్యమైనంత ఉత్తమంగా జీవించాము. 2019, మేము మొదటి కస్టమర్ డేటా ప్లాట్‌ఫారమ్ APIని అభివృద్ధి చేసాము kSense, ఇది మరింత సౌకర్యవంతమైన డేటా విశ్లేషణ, డిపెండెన్సీలను గుర్తించడం మొదలైన వాటి కోసం వివిధ మూలాల (ఫేస్‌బుక్ ప్రకటనలు, గీతలు, సేల్స్‌ఫోర్స్, Google ప్లే, Google Analytics మొదలైనవి) నుండి డేటాను సమగ్రపరచడాన్ని అనుమతించింది. చాలా మంది వినియోగదారులు మా డేటా అనలిటిక్స్ ప్లాట్‌ఫారమ్‌ను ఉపయోగిస్తున్నారని మేము గమనించాము, ప్రత్యేకంగా Google Analytics (ఇకపై GAగా సూచిస్తారు). మేము కొంతమంది వినియోగదారులతో మాట్లాడాము మరియు వారికి వారి ఉత్పత్తి విశ్లేషణల డేటా అవసరమని కనుగొన్నాము, వారు GAని ఉపయోగించి స్వీకరిస్తారు, కానీ Google నమూనాల డేటా మరియు చాలా మందికి GA యూజర్ ఇంటర్‌ఫేస్ సౌలభ్యం యొక్క ప్రమాణం కాదు. మేము మా వినియోగదారులతో తగినంత సంభాషణలు చేసాము మరియు చాలామంది సెగ్మెంట్ ప్లాట్‌ఫారమ్‌ను కూడా ఉపయోగించారని గ్రహించాము (ఇది కొన్ని రోజుల క్రితం జరిగింది $3.2 బిలియన్లకు విక్రయించబడింది).

వారు తమ వెబ్ రిసోర్స్‌లో సెగ్మెంట్ జావాస్క్రిప్ట్ పిక్సెల్‌ను ఇన్‌స్టాల్ చేసారు మరియు వారి వినియోగదారు ప్రవర్తన డేటా పేర్కొన్న డేటాబేస్‌లోకి లోడ్ చేయబడింది (ఉదా. పోస్ట్‌గ్రెస్). కానీ సెగ్మెంట్ కూడా దాని మైనస్ కలిగి ఉంది - ధర. ఉదాహరణకు, ఒక వెబ్ వనరు 90,000 MTU (నెలవారీ ట్రాక్ చేయబడిన వినియోగదారులు) కలిగి ఉంటే, మీరు క్యాషియర్‌కు నెలకు ~ $ 1,000 చెల్లించాలి. మూడవ సమస్య కూడా ఉంది - కొన్ని బ్రౌజర్ పొడిగింపులు (AdBlock వంటివి) విశ్లేషణల సేకరణను బ్లాక్ చేశాయి. బ్రౌజర్ నుండి http అభ్యర్థనలు GA మరియు సెగ్మెంట్ డొమైన్‌లకు పంపబడ్డాయి. మా క్లయింట్‌ల కోరిక ఆధారంగా, మేము పూర్తి డేటా సెట్‌ను (నమూనా లేకుండా) సేకరిస్తున్న అనలిటిక్స్ సేవను సృష్టించాము, ఉచితంగా మరియు మా స్వంత మౌలిక సదుపాయాలపై పని చేయవచ్చు.

సేవ ఎలా పనిచేస్తుంది

సేవ మూడు భాగాలను కలిగి ఉంటుంది: జావాస్క్రిప్ట్ పిక్సెల్ (దీనిని మేము తరువాత టైప్‌స్క్రిప్ట్‌కి తిరిగి వ్రాసాము), GO భాషలో అమలు చేయబడిన సర్వర్ భాగం మరియు Redshift మరియు BigQueryని అంతర్గత డేటాబేస్‌గా ఉపయోగించాలని ప్రణాళిక చేయబడింది (తరువాత వారు పోస్ట్‌గ్రెస్‌కు మద్దతును జోడించారు. , క్లిక్‌హౌస్ మరియు స్నోఫ్లేక్).

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

//'ga' - стандартное название переменной Google Analytics
if (window.ga) {
    ga(tracker => {
        var originalSendHitTask = tracker.get('sendHitTask');
        tracker.set('sendHitTask', (model) => {
            var payLoad = model.get('hitPayload');
            //отправка оригинального события в GA
            originalSendHitTask(model);
            let jsonPayload = this.parseQuery(payLoad);
            //отправка события в наш сервис
            this.send3p('ga', jsonPayload);
        });
    });
}

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


//'analytics' - стандартное название переменной Segment
if (window.analytics) {
    if (window.analytics.addSourceMiddleware) {
        window.analytics.addSourceMiddleware(chain => {
            try {
		//дублирование события в наш сервис
                this.send3p('ajs', chain.payload);
            } catch (e) {
                LOG.warn('Failed to send an event', e)
            }
	    //отправка оригинального события в Segment
            chain.next(chain.payload);
        });
    } else {
        LOG.warn("Invalid interceptor state. Analytics js initialized, but not completely");
    }
} else {
    LOG.warn('Analytics.js listener is not set.');
}

ఈవెంట్‌లను కాపీ చేయడంతో పాటు, మేము ఏకపక్ష jsonని పంపగల సామర్థ్యాన్ని జోడించాము:


//Отправка событий с произвольным json объектом
eventN.track('product_page_view', {
    product_id: '1e48fb70-ef12-4ea9-ab10-fd0b910c49ce',
    product_price: 399.99,
    price_currency: 'USD'
    product_release_start: '2020-09-25T12:38:27.763000Z'
});

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

//входящий json
{
  "field_1":  {
    "sub_field_1": "text1",
    "sub_field_2": 100
  },
  "field_2": "text2",
  "field_3": {
    "sub_field_1": {
      "sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
    }
  }
}

//результат
{
  "field_1_sub_field_1":  "text1",
  "field_1_sub_field_2":  100,
  "field_2": "text2",
  "field_3_sub_field_1_sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
}

అయినప్పటికీ, శ్రేణులు ప్రస్తుతం స్ట్రింగ్‌లుగా మార్చబడ్డాయి. అన్ని రిలేషనల్ డేటాబేస్‌లు పునరావృత ఫీల్డ్‌లకు మద్దతు ఇవ్వవు. ఐచ్ఛిక మ్యాపింగ్ నియమాలను ఉపయోగించి ఫీల్డ్ పేర్లను మార్చడం లేదా వాటిని తీసివేయడం కూడా సాధ్యమే. అవసరమైతే, డేటా స్కీమాను మార్చడానికి లేదా ఒక డేటా రకాన్ని మరొకదానికి ప్రసారం చేయడానికి అవి మిమ్మల్ని అనుమతిస్తాయి. ఉదాహరణకు, json ఫీల్డ్ టైమ్‌స్టాంప్‌తో స్ట్రింగ్‌ని కలిగి ఉంటే (ఫీల్డ్_3_సబ్_ఫీల్డ్_1_సబ్_సబ్_ఫీల్డ్_1 పై ఉదాహరణ నుండి), ఆపై టైమ్‌స్టాంప్ రకంతో డేటాబేస్‌లో ఫీల్డ్‌ను సృష్టించడానికి, మీరు కాన్ఫిగరేషన్‌లో మ్యాపింగ్ నియమాన్ని వ్రాయాలి. మరో మాటలో చెప్పాలంటే, ఫీల్డ్ యొక్క డేటా రకం మొదట json విలువ ద్వారా నిర్ణయించబడుతుంది, ఆపై టైప్ కాస్టింగ్ నియమం (కాన్ఫిగర్ చేయబడి ఉంటే) వర్తించబడుతుంది. మేము 4 ప్రధాన డేటా రకాలను గుర్తించాము: STRING, FLOAT64, INT64 మరియు TIMESTAMP. మ్యాపింగ్ మరియు కాస్టింగ్ నియమాలు ఇలా ఉన్నాయి:

rules:
  - "/field_1/subfield_1 -> " #правило удаления поля
  - "/field_2/subfield_1 -> /field_10/subfield_1" #правило переноса поля
  - "/field_3/subfield_1/subsubfield_1 -> (timestamp) /field_20" #правило переноса поля и приведения типа

డేటా రకాన్ని నిర్ణయించడానికి అల్గోరిథం:

  • json struct ను flat struct గా మార్చండి
  • విలువల ద్వారా ఫీల్డ్‌ల డేటా రకాన్ని నిర్ణయించడం
  • మ్యాపింగ్ మరియు టైప్ కాస్టింగ్ నియమాలను వర్తింపజేయడం

అప్పుడు ఇన్‌కమింగ్ json నిర్మాణం నుండి:

{
    "product_id":  "1e48fb70-ef12-4ea9-ab10-fd0b910c49ce",
    "product_price": 399.99,
    "price_currency": "USD",
    "product_type": "supplies",
    "product_release_start": "2020-09-25T12:38:27.763000Z",
    "images": {
      "main": "picture1",
      "sub":  "picture2"
    }
}

డేటా స్కీమా పొందబడుతుంది:

"product_id" character varying,
"product_price" numeric (38,18),
"price_currency" character varying,
"product_type" character varying,
"product_release_start" timestamp,
"images_main" character varying,
"images_sub" character varying

వినియోగదారు ఇతర ప్రమాణాల ప్రకారం డేటాబేస్‌లో విభజన లేదా స్ప్లిట్ డేటాను సెటప్ చేయగలరని మేము భావించాము మరియు పట్టిక పేరును స్థిరంగా సెట్ చేసే సామర్థ్యాన్ని అమలు చేయడం లేదా వ్యక్తీకరణ ఆకృతీకరణలో. దిగువ ఉదాహరణలో, ఈవెంట్ ఉత్పత్తి_రకం మరియు _టైమ్‌స్టాంప్ ఫీల్డ్‌ల విలువల ఆధారంగా లెక్కించబడిన పేరుతో ఒక టేబుల్‌కి సేవ్ చేయబడుతుంది (ఉదాహరణకు సరఫరా_2020_10):

tableName: '{{.product_type}}_{{._timestamp.Format "2006_01"}}'

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

#Пример для Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varying

నిర్మాణం

మా ఓపెన్ సోర్స్ చరిత్ర: మేము Goలో ఒక విశ్లేషణ సేవను ఎలా తయారు చేసాము మరియు దానిని పబ్లిక్‌గా అందుబాటులో ఉంచాము

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

ఓపెన్ సోర్స్ మరియు భవిష్యత్తు ప్రణాళికలు

ఏదో ఒక సమయంలో, సేవ పూర్తి స్థాయి ఉత్పత్తి లాగా మారింది మరియు మేము దానిని ఓపెన్ సోర్స్‌లో ఉంచాలని నిర్ణయించుకున్నాము. ప్రస్తుతానికి, Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflakeతో అనుసంధానాలు అమలు చేయబడ్డాయి. అన్ని ఇంటిగ్రేషన్‌లు బ్యాచ్ మరియు స్ట్రీమింగ్ డేటా లోడింగ్ మోడ్‌లు రెండింటికి మద్దతు ఇస్తాయి. API ద్వారా అభ్యర్థనలకు మద్దతు జోడించబడింది.

ప్రస్తుత ఇంటిగ్రేషన్ పథకం ఇలా కనిపిస్తుంది:

మా ఓపెన్ సోర్స్ చరిత్ర: మేము Goలో ఒక విశ్లేషణ సేవను ఎలా తయారు చేసాము మరియు దానిని పబ్లిక్‌గా అందుబాటులో ఉంచాము

సేవను స్వతంత్రంగా ఉపయోగించగలిగినప్పటికీ (ఉదాహరణకు, డాకర్ ఉపయోగించి), మేము కూడా కలిగి ఉన్నాము హోస్ట్ చేసిన వెర్షన్, ఇక్కడ మీరు డేటా వేర్‌హౌస్‌తో ఏకీకరణను సెటప్ చేయవచ్చు, మీ డొమైన్‌కు CNAMEని జోడించవచ్చు మరియు ఈవెంట్‌ల సంఖ్యపై గణాంకాలను వీక్షించవచ్చు. మా తక్షణ ప్రణాళికలు వెబ్ వనరు నుండి గణాంకాలను మాత్రమే కాకుండా, బాహ్య డేటా మూలాల నుండి డేటాను కూడా సమగ్రపరచగల సామర్థ్యాన్ని జోడించడం మరియు వాటిని మీకు నచ్చిన ఏదైనా నిల్వలో సేవ్ చేయడం!

→ గ్యాలరీలు
→ డాక్యుమెంటేషన్
→ మందగింపు

మీ సమస్యలను పరిష్కరించడంలో EventNative మీకు సహాయం చేస్తే మేము సంతోషిస్తాము!

నమోదు చేసుకున్న వినియోగదారులు మాత్రమే సర్వేలో పాల్గొనగలరు. సైన్ ఇన్ చేయండిదయచేసి.

మీ కంపెనీలో ఏ గణాంకాల సేకరణ వ్యవస్థ ఉపయోగించబడుతుంది

  • 48,0%గూగుల్ అనలిటిక్స్ 12

  • 4,0%సెగ్మెంట్ 1

  • 16,0%ఇతర (కామెంట్లలో వ్రాయండి) 4

  • 32,0%మీ సేవను అమలు చేసారు8

25 మంది వినియోగదారులు ఓటు వేశారు. 6 మంది వినియోగదారులు దూరంగా ఉన్నారు.

మూలం: www.habr.com

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