زموږ د خلاصې سرچینې تاریخ: څنګه موږ په Go کې تحلیلي خدمت رامینځته کړی او په عامه توګه یې چمتو کړی

اوس مهال، په نړۍ کې نږدې هر شرکت د ویب سرچینې په اړه د کاروونکو کړنو په اړه احصایې راټولوي. انګیزه روښانه ده - شرکتونه غواړي پوه شي چې د دوی محصول / ویب پاڼه څنګه کارول کیږي او د دوی کاروونکي ښه پوهیږي. البته، د دې ستونزې د حل لپاره په بازار کې ډیری وسایل شتون لري - د تحلیلي سیسټمونو څخه چې د ډشبورډونو او ګرافونو په بڼه ډاټا چمتو کوي (د بیلګې په توګه Google Analyticsد پیرودونکي ډیټا پلیټ فارم ته ، کوم چې تاسو ته اجازه درکوي په هر ګودام کې د مختلف سرچینو څخه ډاټا راټول او راټول کړئ (د مثال په توګه برخه).

مګر موږ یوه ستونزه وموندله چې لاهم حل شوې نه ده. په دې توګه زیږیدلی EventNative - د خلاصې سرچینې تحلیلي خدمت. د دې په اړه ولولئ چې ولې موږ پریکړه وکړه چې خپل خدمت ته وده ورکړو، دا موږ ته څه راکړل، او د پای پایله څه وه (د کوډ ټوټو سره).

زموږ د خلاصې سرچینې تاریخ: څنګه موږ په Go کې تحلیلي خدمت رامینځته کړی او په عامه توګه یې چمتو کړی

ولې موږ باید خپل خدمت ته وده ورکړو؟

دا نولسمه وه، موږ څومره چې کولی شو ژوندي پاتې شو. 2019، موږ د API لومړی پیرودونکي ډیټا پلیټ فارم جوړ کړ kSense، کوم چې دا ممکنه کړې چې د مختلف سرچینو څخه ډیټا راټول کړي (د فیسبوک اعلانونه ، سټریپ ، سیلز فورس ، ګوګل پلی ، ګوګل انلایټیکس ، او نور) د ډیرو اسانه ډیټا تحلیلونو لپاره ، د انحصار پیژندلو او داسې نورو لپاره. موږ ولیدل چې ډیری کاروونکي زموږ پلیټ فارم د ډیټا تحلیل لپاره کاروي په ځانګړي توګه د ګوګل انلاینټس (له دې وروسته GA). موږ د ځینو کاروونکو سره خبرې وکړې او وموندله چې دوی د دوی محصول لپاره تحلیلي معلوماتو ته اړتیا لري چې دوی د GA په کارولو سره ترلاسه کوي، مګر د ګوګل سیمالټ ډاټا او د ډیری لپاره، د GA کارن انٹرفیس د اسانتیا معیار ندی. موږ د خپلو کاروونکو سره کافي خبرې اترې درلودې او پوه شو چې ډیری هم د برخې پلیټ فارم کاروي (کوم چې په لاره کې، بله ورځ وه په 3.2 ملیارد ډالرو پلورل شوی).

دوی د دوی په ویب سرچینو کې د برخې جاوا سکرپٹ پکسل نصب کړی او د دوی د کاروونکو چلند په اړه معلومات په ټاکل شوي ډیټابیس کې بار شوي (د مثال په توګه پوسټګریس). مګر برخه هم خپل منفي اړخ لري - قیمت. د مثال په توګه، که یوه ویب سرچینه 90,000 MTU ولري (په میاشتنۍ توګه تعقیب شوي کاروونکي)، نو تاسو اړتیا لرئ چې کیشیر ته هره میاشت $ 1,000 تادیه کړئ. دریمه ستونزه هم وه - د براوزر ځینې توسیعونه (لکه اډ بلاک) د تحلیلونو راټولول بند کړي ځکه چې ... د براوزر څخه http غوښتنې د GA او Segment ډومینونو ته لیږل شوي. زموږ د پیرودونکو د هیلو پراساس ، موږ یو تحلیلي خدمت رامینځته کړی چې د معلوماتو بشپړ سیټ راټولوي (پرته له نمونې اخیستلو) ، وړیا دی او کولی شي زموږ په خپل زیربنا کار وکړي.

خدمت څنګه کار کوي

خدمت درې برخې لري: د جاوا سکریپټ پکسل (کوم چې موږ وروسته په ټایپ سکریپټ کې بیا لیکلی)، د سرور برخه په GO ژبه کې پلي کیږي، او دا پالن شوی و چې Redshift او BigQuery د کور دننه ډیټابیس په توګه وکاروي (وروسته دوی د دې لپاره ملاتړ اضافه کړ. پوسټګریس، کلیک هاوس او سنو فلیک).

پریکړه وشوه چې د GA او سیګمینټ پیښو جوړښت بدل نه شي. ټول هغه څه ته اړتیا وه چې د ویب سرچینې څخه ټولې پیښې نقل کړي چیرې چې پکسل زموږ شاته کې نصب شوی. لکه څنګه چې دا معلومه شوه، دا کار کول ستونزمن ندي. جاواسکریپټ پکسل د اصلي 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 غوښتنې ومني، دوی د اضافي معلوماتو سره ډک کړي، د بیلګې په توګه، جیو ډاټا (مننه maxmind د دې لپاره) او دا په ډیټابیس کې ثبت کړئ. موږ غوښتل چې خدمت د امکان تر حده اسانه کړو ترڅو دا د لږترلږه ترتیب سره وکارول شي. موږ د راتلونکي 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_sub_field_1_sub_sub_field_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 جوړښت فلیټ جوړښت ته بدل کړئ
  • د ارزښتونو په واسطه د ساحو د معلوماتو ډول ټاکل
  • د نقشه کولو او ډول ډول کاسټ کولو قواعد پلي کول

بیا د راتلونکی 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

موږ دا هم فکر کاوه چې کارونکي باید د نورو معیارونو سره سم په ډیټابیس کې د ډیټا ویش تنظیم یا ویشلو وړتیا ولري او دا وړتیا پلي کړي چې د میز نوم د ثابت یا ثابت سره تنظیم کړي. اظهار په ترتیب کې. په لاندې مثال کې، پیښه به د یو نوم سره میز ته خوندي شي چې د محصول_ ډول او _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 کې تحلیلي خدمت رامینځته کړی او په عامه توګه یې چمتو کړی

که څه هم خدمت په خپلواکه توګه کارول کیدی شي (د مثال په توګه د ډاکر کارول)، موږ هم لرو کوربه شوی نسخه، په کوم کې چې تاسو کولی شئ د ډیټا ګودام سره ادغام تنظیم کړئ ، خپل ډومین ته CNAME اضافه کړئ او د پیښو شمیره احصایې وګورئ. زموږ سمدستي پلانونه دا دي چې نه یوازې د ویب سرچینې څخه احصایې راټولولو وړتیا اضافه کړئ ، بلکه د بهرني ډیټا سرچینو څخه ډیټا هم او ستاسو د خوښې هرې ذخیره کې خوندي کړئ!

→ GitHub
→ لاسوند
→ پوځيان له

موږ به خوښ یو که EventNative ستاسو د ستونزو په حل کې مرسته وکړي!

یوازې راجستر شوي کاروونکي کولی شي په سروې کې برخه واخلي. ننوزئمهرباني وکړئ

ستاسو په شرکت کې د احصایې راټولولو کوم سیسټم کارول کیږي؟

  • ۸۵٪د ګوګل انلایز ایکس اینوم ایکس

  • ۸۵٪برخه 1

  • ۸۵٪بل (په نظرونو کې ولیکئ) 4

  • ۸۵٪ستاسو خدمتونه پلي کول8

25 کاروونکو رایه ورکړه. 6 کاروونکي منع شوي.

سرچینه: www.habr.com

Add a comment