Taariikhda ishayada furan: sida aan u samaynay adeegga falanqaynta ee Go oo aan uga dhignay mid si guud loo heli karo

Waqtigan xaadirka ah, ku dhawaad ​​shirkad kasta oo adduunka ah waxay ururisaa tirakoobyada ku saabsan ficillada isticmaale ee ilaha shabakadda. Dhiirigelintu waa caddahay - shirkaduhu waxay rabaan inay ogaadaan sida badeecadooda/mareegaha loo isticmaalo oo ay si fiican u fahmaan isticmaalkooda. Dabcan, waxaa jira tiro badan oo qalab ah oo suuqa ku jira si loo xalliyo dhibaatadan - laga soo bilaabo hababka falanqaynta ee bixiya xogta qaabka dashboards iyo garaafyada (tusaale ahaan. Google Analytics) Platform-ka Macmiilka, kaas oo kuu oggolaanaya inaad ururiso oo aad ururiso xogta ilo kala duwan oo bakhaar kasta ah (tusaale ahaan. Qaybaha).

Laakiin waxaan helnay dhibaato aan wali la xalin. Sidaas ayaa ku dhalatay DhacdadaNative - adeegga falanqaynta il-furan. Ka akhriso sababta aan u go'aansanay inaan horumarino adeegeena, waxa ay na siisay, iyo waxa natiijadu ahayd (oo leh qaybo kood ah).

Taariikhda ishayada furan: sida aan u samaynay adeegga falanqaynta ee Go oo aan uga dhignay mid si guud loo heli karo

Maxaynu u horumarinaynaa adeegeena?

Waxay ahayd sagaashamaadkii, waxaan ka badbaadnay intii karaankeena ah. 2019, waxaanu samaynay API Xogta Macmiilka Koowaad kSense, taas oo suurtogal ka dhigtay in la isku geeyo xogta laga helay ilo kala duwan (Xayeysiiska Facebook, Stripe, Salesforce, Google play, Google Analytics, iwm) si loo falanqeeyo xogta ku habboon, ogaanshaha ku tiirsanaanta, iwm. Waxaan ogaanay in isticmaaleyaal badan ay u isticmaalaan madalkeena falanqaynta xogta gaar ahaan Google Analytics (hadda dambe GA). Waxaan la hadalnay qaar ka mid ah isticmaalayaasha waxaana ogaanay inay u baahan yihiin xogta falanqaynta ee alaabtooda ay helaan iyagoo isticmaalaya GA, laakiin Xogta muunada Google iyo qaar badan, interface User GA ma aha heerka ku habboonaanta. Waxaan la yeelanay wada hadal ku filan isticmaalayaashayada waxaana ogaanay in qaar badan ay sidoo kale isticmaalayaan qaybta Qaybta (taas oo, habka, ay ahayd maalin kale. waxaa lagu iibiyay $3.2 bilyan).

Waxay ku rakibeen qaybta javascript pixel ilaha shabakadooda iyo xogta ku saabsan habdhaqanka isticmaalayaashooda ayaa lagu shubay xogta la cayimay (tusaale Postgres). Laakiin Qaybta sidoo kale waxay leedahay hoos u dhaceeda - qiimaha. Tusaale ahaan, haddii ilaha webka uu leeyahay 90,000 MTU ( isticmaalayaasha la dabagalo bishiiba), markaa waxaad u baahan tahay inaad bixiso ~ 1,000 $ bishiiba khasnajiga. Waxa kale oo jirtay dhib saddexaad - kordhinta browserka qaarkood (sida AdBlock) ayaa xannibay ururinta falanqaynta sababtoo ah... Codsiyada http ee browserka ayaa loo diray GA iyo xayndaabyada Qaybta. Iyada oo ku saleysan rabitaanka macaamiisheena, waxaan abuurnay adeeg falanqeyn kaas oo aruuriya xog dhameystiran (aan la qaadin), waa bilaash oo ka shaqeyn kara kaabayaashayaga.

Sida adeeggu u shaqeeyo

Adeeggu waxa uu ka kooban yahay saddex qaybood oo kala ah:-pixel javascript (oo aan markii dambe dib ugu qornay far-qorista), qaybta server-ka waxa lagu hirgeliyay luqadda GO-ga, waxaana la qorsheeyay in Redshift iyo BigQuery loo isticmaalo kayd ahaan gudaha guriga (kadibna waxay ku biiriyeen taageero. Postgres, ClickHouse iyo Snowflake).

Waxaa la go'aansaday in laga tago qaab-dhismeedka GA iyo dhacdooyinka Qaybta aan isbeddelin. Waxa kaliya ee loo baahnaa waxay ahayd in dhammaan dhacdooyinka laga soo min guuriyo ilaha shabakadda ee pixel-ku ku rakiban yahay dhabarkayaga dambe. Sida ay soo baxday, tani ma adka in la sameeyo. pixel-ka Javascript-ku waxa uu ka saaray habkii asalka ahaa ee maktabadda GA mid cusub, kaas oo ku koobiyay dhacdada nidaamkeena.

//'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);
        });
    });
}

Qaybta pixel-ka wax walba way ka fudud yihiin; waxay leedahay habab dhexdhexaad ah, mid ka mid ah oo aan isticmaalnay.


//'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.');
}

Marka laga soo tago koobiyeynta dhacdooyinka, waxaanu ku darnay awooda lagu diro json gardarrada:


//Отправка событий с произвольным 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'
});

Marka xigta, aan ka hadalno qaybta server-ka. Dhabarka dambe waa inuu aqbalaa codsiyada http, ka buuxi macluumaad dheeraad ah, tusaale ahaan, xogta geo (mahadsanid maxmin tan) oo ku duub kaydka xogta. Waxaan rabnay inaan ka dhigno adeegga sida ugu habboon ee suurtogalka ah si loogu isticmaalo qaabeynta ugu yar. Waxaan hirgelinay shaqeynta go'aaminta qorshaha xogta ee ku saleysan qaab dhismeedka dhacdada json ee soo socota. Noocyada xogta waxaa lagu qeexaa qiyamka. Walxaha buulka leh waa ay jajabaan oo waxaa loo dhimay qaab dhismeed siman:

//входящий 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"
}

Si kastaba ha ahaatee, arrays ayaa hadda si fudud loogu beddelaa xargaha sababtoo ah Dhammaan kaydadka xogta ee xidhiidhka ahi ma taageeraan meelaha soo noqnoqda. Waxa kale oo suurtogal ah in la beddelo magacyada goobta ama la tirtiro iyada oo la adeegsanayo xeerarka khariidaynta ikhtiyaariga ah. Waxay kuu oggolaanayaan inaad beddesho nidaamka xogta haddii loo baahdo ama u beddelo nooc xog oo kale. Tusaale ahaan, haddii goobta json ay ka kooban tahay xadhig leh timestampgaroonka_3_sub_goob_1_sub_sub_goob_1 laga bilaabo tusaalaha kore), ka dib si aad u abuurto goob ku jirta xogta xogta oo leh nooca timestamp, waxaad u baahan tahay inaad ku qorto xeerka khariidadda qaabeynta. Si kale haddii loo dhigo, nooca xogta ee goobta ayaa marka hore lagu go'aamiyaa qiimaha json, ka dibna nooca qaanuunka tuurista (haddii la habeeyo) ayaa lagu dabaqaa. Waxaan aqoonsannay 4 nooc oo xog ah: STRING, FLOAT64, INT64 iyo TIMESTAMP. Xeerarka qaabaynta iyo nooca wax shubista ayaa u eg sidan:

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

Algorithm ee go'aaminta nooca xogta:

  • u beddel qaab dhismeedka json qaab dhismeed siman
  • go'aaminta nooca xogta ee goobaha qiyamka
  • ku dhaqanka qariirada iyo nooca qawaaniinta

Ka dib qaab dhismeedka json ee soo socda:

{
    "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"
    }
}

qorshaha xogta ayaa la heli doonaa:

"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

Waxaan sidoo kale u maleynay in isticmaaluhu uu awood u leeyahay inuu habeeyo qaybinta ama u qaybiyo xogta database-ka iyadoo loo eegayo shuruudaha kale oo la hirgeliyay awoodda lagu dejiyo magaca miiska oo joogto ah ama muujinta qaabeynta. Tusaalaha hoose, dhacdada waxaa lagu keydin doonaa miis leh magac lagu xisaabiyay iyadoo lagu salaynayo qiyamka nooca alaabta iyo _timestamp (tusaale ahaan sahayda_2020_10):

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

Si kastaba ha ahaatee, qaab dhismeedka dhacdooyinka soo socda ayaa isbedeli kara wakhtiga runtime. Waxaan hirgelinay algorithm si loo hubiyo faraqa u dhexeeya qaab dhismeedka miiska jira iyo qaab dhismeedka dhacdo soo socota. Haddii farqi la helo, shaxda waxaa lagu cusboonaysiin doonaa goobo cusub. Si tan loo sameeyo, isticmaal patch SQL weydiinta:

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

naqshadaha

Taariikhda ishayada furan: sida aan u samaynay adeegga falanqaynta ee Go oo aan uga dhignay mid si guud loo heli karo

Maxaad ugu baahan tahay inaad dhacdooyinka u qorto nidaamka faylka, oo aadan si toos ah ugu qorin kaydka xogta? Database-yada had iyo jeer si fiican uma shaqeeyaan marka la macaamilayo tiro badan oo la gelinayo (Talooyinka Postgres). Si tan loo sameeyo, Logger wuxuu u qoraa dhacdooyinka soo gelaya faylka iyo goroutine (thread) gaar ah oo akhriyaha faylka akhriya faylka, ka dibna xogta waa la beddelaa oo la go'aamiyaa. Ka dib markii maamulaha miiska uu hubiyo in qorshaha miiska uu yahay mid casri ah, xogta waxaa lagu qori doonaa xogta hal dufcood. Ka dib, waxaan ku darnay awoodda si toos ah loogu qoro xogta database-ka, laakiin habkan waxaan u isticmaalnaa dhacdooyinka aan badnayn - tusaale ahaan, beddelaad.

Isha furan iyo qorshayaasha mustaqbalka

Waqtiga qaar, adeeggu wuxuu bilaabay inuu u ekaado badeecad dhamaystiran waxaanan go'aansanay inaan u sii deyno Isha Furan. Hadda, isdhexgalka Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake ayaa la hirgeliyay. Dhammaan isku xidhka waxa ay taageeraan labada dufcadood iyo hababka baahinta xogta. Taageero lagu daray codsiyada API

Nidaamka isdhexgalka hadda wuxuu u eg yahay sidan:

Taariikhda ishayada furan: sida aan u samaynay adeegga falanqaynta ee Go oo aan uga dhignay mid si guud loo heli karo

In kasta oo adeegga loo isticmaali karo si madax bannaan (tusaale ahaan adeegsiga Docker), waxaan sidoo kale haysanaa nooca martigelinaya, kaas oo aad ku rakibi karto la dhexgalka bakhaarka xogta, ku dar CNAME boggaaga oo arag tirokoobyada tirada dhacdooyinka. Qorshayaashayada degdega ah ayaa ah in aan ku darno awoodda aan ku ururin karno tirakoobyada ilaha shabakadda, laakiin sidoo kale xogta laga helo ilaha xogta dibadda oo aan ku keydinno kayd kasta oo aad doorato!

→ GitHub
→ Dukumentiyada
→ debcin

Waan ku farxi doonaa haddii EventNative ay kaa caawiso xallinta dhibaatooyinkaaga!

Isticmaalayaasha diiwaangashan oo keliya ayaa ka qaybqaadan kara sahanka. Soo gal, soo dhawoow.

Waa maxay nidaamka ururinta tirakoobka ee shirkaddaada lagu isticmaalo?

  • 48,0%Google Analytics12

  • 4,0%Qaybta1

  • 16,0%Mid kale (ku qor faallooyinka)4

  • 32,0%Hirgeliyey adeeggaaga8

25 isticmaale ayaa u codeeyay. 6 isticmaale ayaa ka aamusay.

Source: www.habr.com

Add a comment