Eachdraidh ar stòr fosgailte: mar a rinn sinn seirbheis anailis ann an Go agus a chuir sinn air adhart e gu poblach

An-dràsta, bidh cha mhòr a h-uile companaidh san t-saoghal a’ cruinneachadh staitistig mu ghnìomhan luchd-cleachdaidh air goireas lìn. Tha am brosnachadh soilleir - tha companaidhean airson faighinn a-mach mar a tha an toradh / làrach-lìn aca air a chleachdadh agus an luchd-cleachdaidh a thuigsinn nas fheàrr. Gu dearbh, tha àireamh mhòr de dh ’innealan air a’ mhargaidh gus an duilgheadas seo fhuasgladh - bho shiostaman anailitigeach a bheir seachad dàta ann an cruth dashboards agus ghrafaichean (mar eisimpleir Google Analytics) gu Àrd-ùrlar Dàta Luchd-ceannach, a leigeas leat dàta a chruinneachadh agus a chruinneachadh bho dhiofar stòran ann an taigh-bathair sam bith (mar eisimpleir Segment).

Ach lorg sinn duilgheadas nach deach fhuasgladh fhathast. Mar sin rugadh e TachartasNative - seirbheis anailis stòr fosgailte. Leugh mu dheidhinn carson a chuir sinn romhainn an t-seirbheis againn fhèin a leasachadh, na thug e dhuinn, agus dè an toradh deireannach (le pìosan còd).

Eachdraidh ar stòr fosgailte: mar a rinn sinn seirbheis anailis ann an Go agus a chuir sinn air adhart e gu poblach

Carson a bu chòir dhuinn ar seirbheis fhìn a leasachadh?

B’ e na naochadan a bh’ ann, thàinig sinn beò mar a b’ fheàrr a b’ urrainn dhuinn. 2019, leasaich sinn an API Ciad Àrd-ùrlar Dàta Luchd-ceannach kSense, a rinn e comasach dàta a chruinneachadh bho dhiofar thùsan (sanasan Facebook, Stripe, Salesforce, Google play, Google Analytics, msaa) airson mion-sgrùdadh dàta nas goireasaiche, a’ comharrachadh eisimeileachd, msaa. Tha sinn air mothachadh gu bheil mòran de luchd-cleachdaidh a 'cleachdadh ar n-àrd-ùrlar airson mion-sgrùdadh dàta gu sònraichte Google Analytics (an dèidh seo GA). Bhruidhinn sinn ri cuid de luchd-cleachdaidh agus fhuair sinn a-mach gu bheil feum aca air an dàta anailis airson an toradh a gheibh iad a’ cleachdadh GA, ach Google eisimpleirean dàta agus dha mòran, chan e eadar-aghaidh cleachdaiche GA an ìre de ghoireasachd. Bha còmhraidhean gu leòr againn leis an luchd-cleachdaidh againn agus thuig sinn gu robh mòran cuideachd a’ cleachdadh an àrd-ùrlar Segment (a bha, leis an t-slighe, dìreach an latha eile a reic airson $3.2 billean).

Chuir iad a-steach piogsail javascript Segment air an goireas lìn aca agus chaidh dàta mu ghiùlan an luchd-cleachdaidh aca a luchdachadh a-steach don stòr-dàta ainmichte (mar eisimpleir Postgres). Ach tha an eas-bhuannachd aig Segment cuideachd - a’ phrìs. Mar eisimpleir, ma tha 90,000 MTU aig goireas lìn (luchd-cleachdaidh tracadh mìosail), feumaidh tu ~ 1,000 $ a phàigheadh ​​​​gach mìos don ionmhasair. Bha an treas duilgheadas ann cuideachd - chuir cuid de leudachaidhean brobhsair (leithid AdBlock) bacadh air cruinneachadh anailitigeach oir... Chaidh iarrtasan http bhon bhrobhsair a chuir gu raointean GA agus Segment. Stèidhichte air miann ar luchd-dèiligidh, tha sinn air seirbheis anailis a chruthachadh a bhios a’ tional seata iomlan de dhàta (gun samplachadh), an-asgaidh agus as urrainn obrachadh air a’ bhun-structar againn fhèin.

Mar a tha an t-seirbheis ag obair

Tha trì pàirtean san t-seirbheis: piogsail javascript (a rinn sinn ath-sgrìobhadh nas fhaide air adhart ann an clò-sgrìobhadh), tha pàirt an fhrithealaiche air a chuir an gnìomh sa chànan GO, agus bhathas an dùil Redshift agus BigQuery a chleachdadh mar stòr-dàta a-staigh (an dèidh sin chuir iad taic ris. Postgres, ClickHouse agus maoim-sneachda).

Chaidh co-dhùnadh structar tachartasan GA agus Segment fhàgail gun atharrachadh. Cha robh a dhìth ach a h-uile tachartas a dhùblachadh bhon ghoireas lìn far a bheil am piogsail air a chuir a-steach don backend againn. Mar a thionndaidh e, chan eil seo duilich a dhèanamh. Chuir am piogsail Javascript thairis an dòigh leabharlainn GA tùsail le fear ùr, a dhùblaich an tachartas a-steach don t-siostam againn.

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

Leis an Segment pixel tha a h-uile dad nas sìmplidh; tha dòighean meadhan-bathair ann, a chleachd sinn aon dhiubh.


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

A bharrachd air a bhith a’ dèanamh lethbhreac de thachartasan, tha sinn air comas json neo-riaghailteach a chuir gu:


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

An ath rud, bruidhnidh sinn mu phàirt an fhrithealaiche. Bu chòir don backend gabhail ri iarrtasan http, lìon iad le fiosrachadh a bharrachd, mar eisimpleir, dàta geo (taing max inntinn airson seo) agus clàraich e san stòr-dàta. Bha sinn airson an t-seirbheis a dhèanamh cho goireasach sa ghabhas gus an gabh a chleachdadh le glè bheag de rèiteachadh. Tha sinn air comas-gnìomh a bhith a’ dearbhadh an sgeama dàta stèidhichte air structar an tachartais json a tha a’ tighinn a-steach. Tha seòrsachan dàta air an comharrachadh le luachan. Bidh stuthan neadachaidh air an lobhadh agus air an lughdachadh gu structar còmhnard:

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

Ach, tha arrays an-dràsta dìreach air an tionndadh gu sreangan oir Chan eil a h-uile stòr-dàta dàimheach a’ toirt taic do raointean a tha air an ath-aithris. Tha e comasach cuideachd ainmean achaidhean atharrachadh no an sguabadh às le bhith a’ cleachdadh riaghailtean mapaidh roghnach. Leigidh iad leat an sgeama dàta atharrachadh ma tha sin riatanach no aon seòrsa dàta a thionndadh gu fear eile. Mar eisimpleir, ma tha sreang ann an raon json le stampa-ama (raon_3_sub_field_1_sub_sub_field_1 bhon eisimpleir gu h-àrd), an uairsin gus raon a chruthachadh anns an stòr-dàta leis an t-seòrsa stampa-ama, feumaidh tu riaghailt mapaidh a sgrìobhadh anns an rèiteachadh. Ann am faclan eile, tha an seòrsa dàta den raon air a dhearbhadh an toiseach leis an luach json, agus an uairsin thèid an riaghailt tilgeadh seòrsa (ma tha e air a rèiteachadh) a chuir an sàs. Tha sinn air 4 prìomh sheòrsan dàta a chomharrachadh: STRING, FLOAT64, INT64 agus TIMESTAMP. Tha na riaghailtean mapaidh agus seòrsa tilgeadh a’ coimhead mar seo:

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

Algorithm airson co-dhùnadh an t-seòrsa dàta:

  • tionndaidh structar json gu structar còmhnard
  • a’ dearbhadh an seòrsa dàta de raointean a rèir luachan
  • cur an sàs riaghailtean mapaidh agus seòrsa tilgeadh

An uairsin bhon structar json a tha a’ tighinn a-steach:

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

gheibhear an sgeama dàta:

"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

Bha sinn cuideachd den bheachd gum bu chòir gum biodh an neach-cleachdaidh comasach air sgaradh no roinneadh dàta san stòr-dàta a rèiteachadh a rèir slatan-tomhais eile agus chuir sinn an gnìomh an comas ainm a’ bhùird a shuidheachadh le cunbhalach no faireachdainn anns an rèiteachadh. Anns an eisimpleir gu h-ìosal, thèid an tachartas a shàbhaladh gu clàr le ainm air a thomhas a rèir luachan nan raointean product_type agus _timestamp (mar eisimpleir solar_2020_10):

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

Ach, faodaidh structar thachartasan a tha a’ tighinn a-steach atharrachadh aig àm ruith. Tha sinn air algorithm a chuir an gnìomh gus sgrùdadh a dhèanamh air an eadar-dhealachadh eadar structar clàr a tha ann mar-thà agus structar tachartas a tha a’ tighinn a-steach. Ma lorgar eadar-dhealachadh, thèid an clàr ùrachadh le raointean ùra. Gus seo a dhèanamh, cleachd an ceist SQL paiste:

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

ailtireachd

Eachdraidh ar stòr fosgailte: mar a rinn sinn seirbheis anailis ann an Go agus a chuir sinn air adhart e gu poblach

Carson a dh’fheumas tu tachartasan a sgrìobhadh chun t-siostam faidhle, agus chan ann dìreach gan sgrìobhadh gu dìreach chun stòr-dàta? Cha bhi stòran-dàta an-còmhnaidh a’ coileanadh gu math nuair a thathar a’ dèiligeadh ri àireamh mhòr de chuir-a-steach (Molaidhean postgres). Gus seo a dhèanamh, bidh Logger a’ sgrìobhadh tachartasan a tha a’ tighinn a-steach gu faidhle agus ann an goroutine air leth (snàithlean) Leughaidh leughadair faidhle am faidhle, agus an uairsin bidh an dàta air a thionndadh agus air a dhearbhadh. Às deidh don mhanaidsear Clàr dèanamh cinnteach gu bheil sgeama a’ bhùird ùraichte, thèid an dàta a sgrìobhadh chun stòr-dàta ann an aon bhaidse. Às deidh sin, chuir sinn an comas dàta a sgrìobhadh gu dìreach chun stòr-dàta, ach bidh sinn a’ cleachdadh am modh seo airson tachartasan nach eil iomadach - mar eisimpleir, atharrachaidhean.

Open Source agus planaichean airson an ama ri teachd

Aig àm air choreigin, thòisich an t-seirbheis a’ coimhead coltach ri toradh làn-chuimseach agus chuir sinn romhainn a leigeil ma sgaoil gu Open Source. An-dràsta, tha aonachadh le Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake air an cur an gnìomh. Bidh a h-uile aonachadh a’ toirt taic do gach cuid modhan baidse is sruthadh de luchdachadh dàta. Taic a bharrachd airson iarrtasan tro API.

Tha an sgeama amalachaidh gnàthach a’ coimhead mar seo:

Eachdraidh ar stòr fosgailte: mar a rinn sinn seirbheis anailis ann an Go agus a chuir sinn air adhart e gu poblach

Ged a ghabhas an t-seirbheis a chleachdadh gu neo-eisimeileach (mar eisimpleir a’ cleachdadh Docker), tha againn cuideachd dreach aoigheachd, anns an urrainn dhut amalachadh a stèidheachadh le taigh-bathair dàta, cuir CNAME ris an àrainn agad agus coimhead air staitistig air an àireamh de thachartasan. Is e na planaichean againn sa bhad an comas a chuir ri chèile chan e a-mhàin staitistig bho ghoireas lìn, ach cuideachd dàta bho stòran dàta bhon taobh a-muigh agus an sàbhaladh gu stòradh sam bith de do roghainn!

→ GitHub
→ Sgrìobhainnean
→ Slack

Bidh sinn toilichte ma tha EventNative a’ cuideachadh le fuasgladh fhaighinn air na duilgheadasan agad!

Chan fhaod ach luchd-cleachdaidh clàraichte pàirt a ghabhail san sgrùdadh. Soidhnig a-steach, mas e do thoil e.

Dè an siostam cruinneachadh staitistig a thathas a’ cleachdadh sa chompanaidh agad?

  • 48,0%Google Analytics 12

  • 4,0%Earrann1

  • 16,0%Fear eile (sgrìobh anns na beachdan)4

  • 32,0%Chuir thu do sheirbheis an gnìomh8

Bhòt 25 neach-cleachdaidh. Sheall 6 neach-cleachdaidh.

Source: www.habr.com

Cuir beachd ann