Таърихи манбаи кушодаи мо: чӣ гуна мо хидмати таҳлилиро дар Go сохтаем ва онро дастраси умум гардонидем

Дар айни замон, қариб ҳар як ширкат дар ҷаҳон оморро дар бораи амалҳои корбарон дар манбаи веб ҷамъоварӣ мекунад. Ҳавасмандӣ равшан аст - ширкатҳо мехоҳанд бидонанд, ки маҳсулот / вебсайти онҳо чӣ гуна истифода мешавад ва корбарони худро беҳтар фаҳманд. Албатта, дар бозор шумораи зиёди абзорҳо барои ҳалли ин мушкилот мавҷуданд - аз системаҳои таҳлилӣ, ки маълумотро дар шакли панелҳо ва графикҳо пешниҳод мекунанд (масалан Google Analytics) ба Платформаи маълумоти муштариён, ки ба шумо имкон медиҳад, ки маълумотро аз манбаъҳои гуногун дар ҳама гуна анбор ҷамъоварӣ ва ҷамъоварӣ кунед (масалан Сегмент).

Вале мо проблемаеро ёфтем, ки то хол хал нашудааст. Ҳамин тавр таваллуд шудааст EventNative — хадамоти таҳлилии кушодаасос. Дар бораи он, ки чаро мо тасмим гирифтем, ки хидмати шахсии худро таҳия кунем, он ба мо чӣ дод ва натиҷаи ниҳоӣ чӣ гуна буд (бо қисмҳои код) хонед.

Таърихи манбаи кушодаи мо: чӣ гуна мо хидмати таҳлилиро дар Go сохтаем ва онро дастраси умум гардонидем

Чаро мо бояд хидмати худро инкишоф диҳем?

Солҳои навадум буд, мо то ҳадди имкон зинда мондем. 2019, мо платформаи аввалини маълумоти муштариёнро таҳия кардем kSense, ки имкон дод, ки маълумот аз манбаъҳои гуногун (рекламаҳои Facebook, Stripe, Salesforce, Google play, Google Analytics ва ғайра) барои таҳлили қулайтар маълумот, муайян кардани вобастагӣ ва ғ. Мо мушоҳида кардем, ки бисёр корбарон платформаи моро барои таҳлили додаҳо махсусан Google Analytics (минбаъд GA) истифода мебаранд. Мо бо баъзе корбарон сӯҳбат кардем ва фаҳмидем, ки онҳо ба маълумоти таҳлилӣ барои маҳсулоти худ, ки бо истифода аз GA мегиранд, лозиманд, аммо Намунаҳои маълумотҳои Google ва барои бисёриҳо, интерфейси корбари GA стандарти роҳат нест. Мо бо корбарони худ сӯҳбатҳои кофӣ доштем ва фаҳмидем, ки бисёриҳо инчунин аз платформаи Segment истифода мебурданд (ки дар омади гап, рӯзи дигар буд) ба 3.2 миллиард доллар фурухта шуд).

Онҳо дар манбаи веби худ як пиксели Javascript Segment насб карданд ва маълумот дар бораи рафтори корбарони онҳо ба махзани муайяншуда бор карда шуд (масалан Postgres). Аммо Сегмент инчунин як нуқсони худро дорад - нарх. Масалан, агар як манбаи веб 90,000 MTU (корбарони ҳармоҳа пайгирӣ) дошта бошад, шумо бояд ба хазинадор дар як моҳ ~ 1,000 доллар пардохт кунед. Мушкилоти сеюм низ вуҷуд дошт - баъзе васеъшавии браузерҳо (ба монанди AdBlock) ҷамъоварии таҳлилҳоро маҳкам карданд, зеро... Дархостҳои http аз браузер ба доменҳои GA ва Segment фиристода шуданд. Дар асоси хоҳишҳои мизоҷони худ, мо як хидмати таҳлилиро таъсис додем, ки маҷмӯи пурраи маълумотро (бидуни интихоб) ҷамъоварӣ мекунад, ройгон аст ва метавонад дар инфрасохтори худамон кор кунад.

Чӣ тавр хидмат кор мекунад

Хидмат аз се қисм иборат аст: пиксели javascript (ки мо онро баъдтар дар хатти чопӣ аз нав навиштем), қисми сервер бо забони GO амалӣ карда мешавад ва ба нақша гирифта шудааст, ки Redshift ва BigQuery ҳамчун пойгоҳи додаҳои дохилӣ истифода шаванд (баъдтар онҳо барои Postgres, ClickHouse ва Snowflake).

Қарор дода шуд, ки сохтори рӯйдодҳои GA ва Segment бетағйир монад. Ҳама чизе, ки лозим буд, такрор кардани ҳама рӯйдодҳоро аз манбаи веб, ки пиксел дар пушти мо насб шудааст, буд. Чунон ки маълум мешавад, ин корро кардан душвор нест. Пиксели 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);
        });
    });
}

Бо Pixel Segment ҳама чиз соддатар аст; он дорои усулҳои миёнаравӣ мебошад, ки яке аз онҳоро мо истифода мебарем.


//'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 дорои сатр бо тамғаи вақт (field_3_sub_field_1_sub_sub_field_1 аз мисоли дар боло овардашуда), пас барои эҷод кардани майдон дар пойгоҳи додаҳо бо навъи тамғаи вақт, шумо бояд дар конфигуратсия қоидаи харитасозӣ нависед. Ба ибораи дигар, навъи додаҳои майдон аввал бо арзиши json муайян карда мешавад ва сипас қоидаи casting навъи (агар танзим карда шуда бошад) татбиқ карда мешавад. Мо 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 ба сохтори ҳамвор
  • муайян кардани намуди маълумотҳои майдонҳо аз рӯи арзишҳо
  • татбиқи қоидаҳои харитасозӣ ва навъи рехтагарӣ

Пас аз сохтори 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

Мо инчунин фикр мекардем, ки корбар бояд тақсимотро дар пойгоҳи додаҳо мувофиқи дигар меъёрҳо танзим кунад ё тақсим кунад ва қобилияти муқаррар кардани номи ҷадвалро бо доимӣ ё ифода дар конфигуратсия. Дар мисоли зер, ҳодиса дар ҷадвал бо ном сабт карда мешавад, ки дар асоси арзишҳои майдонҳои маҳсулот_type ва _timestamp ҳисоб карда мешавад (масалан таъминот_2020_10):

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

Аммо, сохтори рӯйдодҳои воридотӣ метавонад дар вақти иҷро тағйир ёбад. Мо алгоритмеро барои санҷидани фарқияти байни сохтори ҷадвали мавҷуда ва сохтори ҳодисаи воридотӣ амалӣ кардем. Агар фарқият пайдо шавад, ҷадвал бо майдонҳои нав нав карда мешавад. Барои ин, дархости SQL-ро истифода баред:

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

меъморӣ

Таърихи манбаи кушодаи мо: чӣ гуна мо хидмати таҳлилиро дар Go сохтаем ва онро дастраси умум гардонидем

Чаро шумо бояд рӯйдодҳоро ба системаи файлӣ нависед, на танҳо онҳоро мустақиман ба пойгоҳи додаҳо нависед? Пойгоҳи додаҳо ҳангоми кор бо миқдори зиёди воридотҳо на ҳамеша хуб кор мекунанд (Тавсияҳои Postgres). Барои ин, Logger рӯйдодҳои воридшударо ба файл менависад ва дар як горутини (риштаи) алоҳидаи файл хонандаи файл файлро мехонад, сипас маълумот табдил ва муайян карда мешавад. Пас аз он ки менеҷери Ҷадвал боварӣ ҳосил кунад, ки схемаи ҷадвал навсозӣ мешавад, маълумот дар як партия ба пойгоҳи додаҳо навишта мешавад. Баъдан, мо қобилияти навиштани маълумотро мустақиман ба пойгоҳи додаҳо илова кардем, аммо мо ин режимро барои рӯйдодҳои сершумор истифода мебарем - масалан, табдилдиҳӣ.

Сарчашмаи кушода ва нақшаҳо барои оянда

Дар баъзе лаҳзаҳо, хидмат ба маҳсулоти мукаммал табдил ёфт ва мо тасмим гирифтем, ки онро ба кушодаасос нашр кунем. Дар айни замон, ҳамгироӣ бо Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake амалӣ карда шудааст. Ҳамаи интегратсияҳо ҳам шеваҳои партия ва ҳам ҷараёнҳои боркунии маълумотро дастгирӣ мекунанд. Дастгирии дархостҳо тавассути API илова карда шуд.

Нақшаи кунунии ҳамгироӣ чунин менамояд:

Таърихи манбаи кушодаи мо: чӣ гуна мо хидмати таҳлилиро дар Go сохтаем ва онро дастраси умум гардонидем

Гарчанде ки хидмат метавонад мустақилона истифода шавад (масалан бо истифодаи Docker), мо низ дорем версияи ҷойгиршуда, ки дар он шумо метавонед ҳамгироиро бо анбори додаҳо танзим кунед, ба домени худ CNAME илова кунед ва омори шумораи рӯйдодҳоро бубинед. Нақшаҳои фаврии мо ин аст, ки қобилияти ҷамъоварӣ кардани на танҳо омор аз манбаи веб, балки маълумотро аз манбаъҳои додаҳои беруна ва захира кардани онҳо ба ҳама гуна анбори интихоби шумо!

→ GitHub
→ сабт
→ суст

Агар EventNative дар ҳалли мушкилоти шумо кӯмак кунад, мо хурсанд хоҳем шуд!

Танҳо корбарони сабтиномшуда метавонанд дар пурсиш иштирок кунанд. даромад, Лутфан.

Дар ширкати шумо кадом системаи ҷамъоварии омор истифода мешавад?

  • 48,0%Google Analytics 12

  • 4,0%Сегмент 1

  • 16,0%Дигар (дар шарҳҳо нависед)4

  • 32,0%Хизматрасонии шуморо ба амал овард8

25 корбар овоз доданд. 6 корбар худдорӣ карданд.

Манбаъ: will.com

Илова Эзоҳ