Itan-akọọlẹ orisun ṣiṣi wa: bawo ni a ṣe ṣe iṣẹ atupale ni Go ati jẹ ki o wa ni gbangba

Lọwọlọwọ, o fẹrẹ jẹ pe gbogbo ile-iṣẹ ni agbaye n gba awọn iṣiro nipa awọn iṣe olumulo lori orisun wẹẹbu kan. Iwuri naa jẹ kedere - awọn ile-iṣẹ fẹ lati mọ bii ọja / oju opo wẹẹbu wọn ṣe lo ati loye awọn olumulo wọn dara julọ. Nitoribẹẹ, ọpọlọpọ awọn irinṣẹ wa lori ọja lati yanju iṣoro yii - lati awọn eto itupalẹ ti o pese data ni irisi dashboards ati awọn aworan (fun apẹẹrẹ. Google atupale) si Platform Data Onibara, eyiti o gba ọ laaye lati gba ati ṣajọpọ data lati awọn orisun oriṣiriṣi ni ile itaja eyikeyi (fun apẹẹrẹ apa).

Ṣugbọn a rii iṣoro kan ti a ko ti yanju sibẹsibẹ. Bayi ni a bi Iṣẹlẹ abinibi - ìmọ-orisun atupale. Ka nipa idi ti a pinnu lati ṣe idagbasoke iṣẹ ti ara wa, ohun ti o fun wa, ati kini abajade ipari jẹ (pẹlu awọn ege koodu).

Itan-akọọlẹ orisun ṣiṣi wa: bawo ni a ṣe ṣe iṣẹ atupale ni Go ati jẹ ki o wa ni gbangba

Kí nìdí tó fi yẹ ká máa ṣe iṣẹ́ ìsìn wa?

O je nineties, a si ye bi ti o dara ju a le. Ọdun 2019, a ṣe agbekalẹ Platform Data Onibara Akọkọ API kSense, eyiti o jẹ ki o ṣee ṣe lati ṣajọpọ data lati awọn orisun oriṣiriṣi (awọn ipolowo Facebook, Stripe, Salesforce, Google play, Awọn atupale Google, ati bẹbẹ lọ) fun itupalẹ data irọrun diẹ sii, idamọ awọn igbẹkẹle, ati bẹbẹ lọ. A ti ṣe akiyesi pe ọpọlọpọ awọn olumulo lo pẹpẹ wa fun itupalẹ data ni pataki Awọn atupale Google (lẹhin GA). A sọrọ si diẹ ninu awọn olumulo ati rii pe wọn nilo data atupale fun ọja wọn ti wọn gba ni lilo GA, ṣugbọn Google awọn ayẹwo data ati fun ọpọlọpọ, GA ni wiwo olumulo ni ko bošewa ti wewewe. A ni awọn ibaraẹnisọrọ to pẹlu awọn olumulo wa ati rii pe ọpọlọpọ tun nlo pẹpẹ Apakan (eyiti, nipasẹ ọna, jẹ ọjọ miiran nikan ta fun $3.2 bilionu).

Wọn fi piksẹli JavaScript Apa kan sori orisun wẹẹbu wọn ati data nipa ihuwasi ti awọn olumulo wọn ni a kojọpọ sinu ibi ipamọ data ti a sọ pato (fun apẹẹrẹ Postgres). Ṣugbọn Apa tun ni isalẹ rẹ - idiyele naa. Fun apẹẹrẹ, ti orisun wẹẹbu ba ni 90,000 MTU (awọn olumulo tọpinpin oṣooṣu), lẹhinna o nilo lati san ~ 1,000 $ fun oṣu kan si oluṣowo naa. Iṣoro kẹta tun wa - diẹ ninu awọn amugbooro ẹrọ aṣawakiri (bii AdBlock) dina ikojọpọ awọn atupale nitori… Awọn ibeere http lati ẹrọ aṣawakiri ni a fi ranṣẹ si GA ati awọn ibugbe Abala. Da lori awọn ifẹ ti awọn alabara wa, a ti ṣẹda iṣẹ atupale kan ti o gba eto pipe ti data (laisi iṣapẹẹrẹ), jẹ ọfẹ ati pe o le ṣiṣẹ lori awọn amayederun tiwa.

Bawo ni iṣẹ naa ṣe n ṣiṣẹ

Iṣẹ naa ni awọn ẹya mẹta: piksẹli javascript (eyiti a tun tun kọwe nigbamii ni iruwewewe), apakan olupin ti wa ni imuse ni ede GO, ati pe o ti gbero lati lo Redshift ati BigQuery gẹgẹbi ibi ipamọ data inu ile (lẹhinna wọn ṣafikun atilẹyin fun Postgres, ClickHouse ati Snowflake).

O pinnu lati lọ kuro ni eto ti GA ati awọn iṣẹlẹ Abala ko yipada. Gbogbo ohun ti o nilo ni lati dapọ gbogbo awọn iṣẹlẹ lati orisun wẹẹbu nibiti a ti fi piksẹli sori ẹhin wa. Bi o ti wa ni jade, eyi ko nira lati ṣe. Piksẹli Javascript bori ọna ikawe GA atilẹba pẹlu ọkan tuntun, eyiti o ṣe ẹda iṣẹlẹ naa sinu eto wa.

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

Pẹlu piksẹli Apa ohun gbogbo jẹ rọrun; o ni awọn ọna agbedemeji, ọkan ninu eyiti a lo.


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

Ni afikun si didakọ awọn iṣẹlẹ, a ti ṣafikun agbara lati firanṣẹ json lainidii:


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

Nigbamii, jẹ ki a sọrọ nipa apakan olupin naa. Afẹyinti yẹ ki o gba awọn ibeere http, fọwọsi wọn pẹlu alaye afikun, fun apẹẹrẹ, data geo (o ṣeun maxmind fun eyi) ki o gbasilẹ ni ibi ipamọ data. A fẹ lati jẹ ki iṣẹ naa rọrun bi o ti ṣee ṣe ki o le ṣee lo pẹlu iṣeto ni iwonba. A ti ṣe imuse iṣẹ ṣiṣe ti ipinnu ero data ti o da lori eto ti iṣẹlẹ json ti nwọle. Awọn iru data jẹ asọye nipasẹ awọn iye. Awọn nkan ti itẹ-ẹiyẹ jẹ ibajẹ ati dinku si ọna alapin kan:

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

Sibẹsibẹ, awọn akojọpọ ti wa ni larọwọto ni iyipada si awọn gbolohun ọrọ nitori Kii ṣe gbogbo awọn apoti isura infomesonu ti o ni ibatan ṣe atilẹyin awọn aaye atunwi. O tun ṣee ṣe lati yi awọn orukọ aaye pada tabi paarẹ wọn nipa lilo awọn ofin iyaworan yiyan. Wọn gba ọ laaye lati yi eto data pada ti o ba jẹ dandan tabi yi iru data kan pada si omiiran. Fun apẹẹrẹ, ti aaye json kan ba ni okun kan pẹlu timestamp (aaye_3_sub_field_1_sub_sub_field_1 lati apẹẹrẹ ti o wa loke), lẹhinna lati ṣẹda aaye kan ninu aaye data pẹlu oriṣi timestamp, o nilo lati kọ ofin maapu kan ninu iṣeto. Ni awọn ọrọ miiran, iru data ti aaye jẹ ipinnu akọkọ nipasẹ iye json, ati lẹhinna iru ofin simẹnti (ti o ba tunto) ti lo. A ti ṣe idanimọ awọn oriṣi data akọkọ mẹrin: STRING, FLOAT4, INT64 ati TIMESTAMP. Awọn aworan agbaye ati iru awọn ofin simẹnti dabi eyi:

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

Algorithm fun ipinnu iru data:

  • iyipada json si ọna alapin
  • npinnu iru data ti awọn aaye nipasẹ awọn iye
  • fifi maapu ati iru awọn ofin simẹnti

Lẹhinna lati ọna json ti nwọle:

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

Eto data yoo gba:

"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

A tun ro pe olumulo yẹ ki o ni anfani lati tunto ipin tabi pin data ninu aaye data ni ibamu si awọn ibeere miiran ati imuse agbara lati ṣeto orukọ tabili pẹlu igbagbogbo tabi ikosile ninu iṣeto ni. Ninu apẹẹrẹ ti o wa ni isalẹ, iṣẹlẹ naa yoo wa ni fipamọ si tabili pẹlu iṣiro orukọ ti o da lori awọn iye ọja_type ati awọn aaye _timestamp (fun apẹẹrẹ. awọn ohun elo_2020_10):

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

Sibẹsibẹ, eto ti awọn iṣẹlẹ ti nwọle le yipada ni akoko asiko. A ti ṣe imuse algorithm kan lati ṣayẹwo iyatọ laarin eto ti tabili ti o wa ati eto iṣẹlẹ ti nwọle. Ti a ba rii iyatọ, tabili yoo ni imudojuiwọn pẹlu awọn aaye tuntun. Lati ṣe eyi, lo ibeere patch SQL:

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

faaji

Itan-akọọlẹ orisun ṣiṣi wa: bawo ni a ṣe ṣe iṣẹ atupale ni Go ati jẹ ki o wa ni gbangba

Kini idi ti o nilo lati kọ awọn iṣẹlẹ si eto faili, kii ṣe kọ wọn taara si ibi ipamọ data? Awọn apoti isura infomesonu ko nigbagbogbo ṣiṣẹ daradara nigbati o ba n ba awọn nọmba nla ti awọn ifibọ sii (Awọn iṣeduro Postgres). Lati ṣe eyi, Logger kọ awọn iṣẹlẹ ti nwọle si faili kan ati ni goroutine lọtọ (o tẹle ara) Oluka faili ka faili naa, lẹhinna data ti yipada ati pinnu. Lẹhin ti oluṣakoso tabili rii daju pe eto tabili ti wa ni imudojuiwọn, data naa yoo kọ si ibi ipamọ data ni ipele kan. Lẹhinna, a ṣafikun agbara lati kọ data taara si ibi ipamọ data, ṣugbọn a lo ipo yii fun awọn iṣẹlẹ ti ko lọpọlọpọ - fun apẹẹrẹ, awọn iyipada.

Ṣii Orisun ati awọn ero fun ọjọ iwaju

Ni aaye kan, iṣẹ naa bẹrẹ si dabi ọja ti o ni kikun ati pe a pinnu lati tu silẹ si Orisun Ṣii. Lọwọlọwọ, awọn iṣọpọ pẹlu Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake ti ni imuse. Gbogbo awọn iṣọpọ ṣe atilẹyin ipele mejeeji ati awọn ipo ṣiṣanwọle ti ikojọpọ data. Atilẹyin ti a ṣafikun fun awọn ibeere nipasẹ API.

Eto isọpọ lọwọlọwọ dabi eyi:

Itan-akọọlẹ orisun ṣiṣi wa: bawo ni a ṣe ṣe iṣẹ atupale ni Go ati jẹ ki o wa ni gbangba

Botilẹjẹpe iṣẹ naa le ṣee lo ni ominira (fun apẹẹrẹ lilo Docker), a tun ni ti gbalejo version, ninu eyiti o le ṣeto iṣọpọ pẹlu ile-ipamọ data, ṣafikun CNAME kan si agbegbe rẹ ki o wo awọn iṣiro lori nọmba awọn iṣẹlẹ. Awọn ero wa lẹsẹkẹsẹ ni lati ṣafikun agbara lati ṣajọpọ kii ṣe awọn iṣiro nikan lati orisun orisun wẹẹbu, ṣugbọn data lati awọn orisun data ita ati fi wọn pamọ si ibi ipamọ eyikeyi ti o fẹ!

→ GitHub
→ Iwe akosilẹ
→ Ọlẹ

A yoo ni idunnu ti EventNative ba ṣe iranlọwọ lati yanju awọn iṣoro rẹ!

Awọn olumulo ti o forukọsilẹ nikan le kopa ninu iwadi naa. wọle, Jowo.

Eto ikojọpọ awọn iṣiro wo lo ni ile-iṣẹ rẹ?

  • 48,0%Google Analytics12

  • 4,0%Apa 1

  • 16,0%Omiiran (kọ ninu awọn asọye)4

  • 32,0%Ṣiṣẹ iṣẹ rẹ8

25 olumulo dibo. 6 olumulo abstained.

orisun: www.habr.com

Fi ọrọìwòye kun