எங்களின் ஓப்பன் சோர்ஸின் வரலாறு: Goவில் ஒரு பகுப்பாய்வு சேவையை எப்படி உருவாக்கினோம் மற்றும் அதை பொதுவில் கிடைக்கச் செய்தோம்

தற்போது, ​​உலகில் உள்ள ஒவ்வொரு நிறுவனமும் இணைய வளத்தில் பயனர் நடவடிக்கைகள் பற்றிய புள்ளிவிவரங்களை சேகரிக்கிறது. உந்துதல் தெளிவாக உள்ளது - நிறுவனங்கள் தங்கள் தயாரிப்பு/இணையதளம் எவ்வாறு பயன்படுத்தப்படுகிறது என்பதை அறியவும், தங்கள் பயனர்களை நன்கு புரிந்துகொள்ளவும் விரும்புகின்றன. நிச்சயமாக, இந்தச் சிக்கலைத் தீர்க்க சந்தையில் ஏராளமான கருவிகள் உள்ளன - டாஷ்போர்டுகள் மற்றும் வரைபடங்களின் வடிவத்தில் தரவை வழங்கும் பகுப்பாய்வு அமைப்புகளிலிருந்து (எடுத்துக்காட்டாக கூகுள் அனலிட்டிக்ஸ்) வாடிக்கையாளர் தரவு தளத்திற்கு, எந்தக் கிடங்கிலும் (உதாரணமாக பிரிவு).

ஆனால் இன்னும் தீர்க்கப்படாத ஒரு சிக்கலைக் கண்டுபிடித்தோம். இவ்வாறு பிறந்தது நிகழ்வு நேட்டிவ் - திறந்த மூல பகுப்பாய்வு சேவை. நாங்கள் ஏன் எங்கள் சொந்த சேவையை உருவாக்க முடிவு செய்தோம், அது எங்களுக்கு என்ன கொடுத்தது மற்றும் இறுதி முடிவு என்ன (குறியீடு துண்டுகளுடன்) பற்றி படிக்கவும்.

எங்களின் ஓப்பன் சோர்ஸின் வரலாறு: Goவில் ஒரு பகுப்பாய்வு சேவையை எப்படி உருவாக்கினோம் மற்றும் அதை பொதுவில் கிடைக்கச் செய்தோம்

நாம் ஏன் எங்கள் சொந்த சேவையை உருவாக்க வேண்டும்?

இது தொண்ணூறுகள், நாங்கள் எங்களால் முடிந்தவரை பிழைத்தோம். 2019, நாங்கள் API முதல் வாடிக்கையாளர் தரவு தளத்தை உருவாக்கினோம் kSense, இது மிகவும் வசதியான தரவு பகுப்பாய்வு, சார்புகளை அடையாளம் காண்பது போன்றவற்றிற்காக வெவ்வேறு மூலங்களிலிருந்து (பேஸ்புக் விளம்பரங்கள், ஸ்ட்ரைப், சேல்ஸ்ஃபோர்ஸ், கூகுள் பிளே, கூகுள் அனலிட்டிக்ஸ் போன்றவை) தரவை ஒருங்கிணைப்பதை சாத்தியமாக்கியது. பல பயனர்கள் எங்கள் தளத்தை தரவு பகுப்பாய்வுக்காக குறிப்பாக Google Analytics (இனி GA) பயன்படுத்துவதை நாங்கள் கவனித்துள்ளோம். நாங்கள் சில பயனர்களுடன் பேசினோம், GA ஐப் பயன்படுத்தி அவர்கள் பெறும் தயாரிப்புக்கான பகுப்பாய்வுத் தரவு அவர்களுக்குத் தேவை என்பதைக் கண்டறிந்தோம். Google மாதிரி தரவு மற்றும் பலருக்கு, GA பயனர் இடைமுகம் வசதிக்கான தரமாக இல்லை. எங்கள் பயனர்களுடன் நாங்கள் போதுமான உரையாடல்களை மேற்கொண்டோம், மேலும் பலர் செக்மென்ட் பிளாட்ஃபார்மைப் பயன்படுத்துகிறார்கள் என்பதை உணர்ந்தோம் (இது, மறுநாள்தான் 3.2 பில்லியன் டாலர்களுக்கு விற்கப்பட்டது).

அவர்கள் தங்கள் வலை வளத்தில் ஒரு செக்மென்ட் ஜாவாஸ்கிரிப்ட் பிக்சலை நிறுவினர் மற்றும் அவர்களின் பயனர்களின் நடத்தை பற்றிய தரவு குறிப்பிட்ட தரவுத்தளத்தில் ஏற்றப்பட்டது (உதாரணமாக Postgres). ஆனால் பிரிவு அதன் எதிர்மறையையும் கொண்டுள்ளது - விலை. எடுத்துக்காட்டாக, ஒரு வலை வளத்தில் 90,000 MTU (மாதாந்திர கண்காணிக்கப்படும் பயனர்கள்) இருந்தால், நீங்கள் காசாளரிடம் மாதத்திற்கு ~1,000 $ செலுத்த வேண்டும். மூன்றாவது பிரச்சனையும் உள்ளது - சில உலாவி நீட்டிப்புகள் (AdBlock போன்றவை) பகுப்பாய்வு சேகரிப்பைத் தடுத்ததால்... உலாவியில் இருந்து http கோரிக்கைகள் GA மற்றும் பிரிவு களங்களுக்கு அனுப்பப்பட்டன. எங்கள் வாடிக்கையாளர்களின் விருப்பத்தின் அடிப்படையில், ஒரு முழுமையான தரவுத் தொகுப்பை (மாதிரி இல்லாமல்) சேகரிக்கும் ஒரு பகுப்பாய்வு சேவையை நாங்கள் உருவாக்கியுள்ளோம், இலவசம் மற்றும் எங்கள் சொந்த உள்கட்டமைப்பில் வேலை செய்ய முடியும்.

சேவை எவ்வாறு செயல்படுகிறது

இந்த சேவை மூன்று பகுதிகளைக் கொண்டுள்ளது: ஒரு ஜாவாஸ்கிரிப்ட் பிக்சல் (நாங்கள் பின்னர் தட்டச்சு முறையில் மீண்டும் எழுதினோம்), சேவையகப் பகுதி 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 கோரிக்கைகளை ஏற்க வேண்டும், கூடுதல் தகவலுடன் அவற்றை நிரப்ப வேண்டும், எடுத்துக்காட்டாக, ஜியோ தரவு (நன்றி அதிகபட்ச மனம் இதற்கு) மற்றும் அதை தரவுத்தளத்தில் பதிவு செய்யவும். சேவையை முடிந்தவரை வசதியாக மாற்ற விரும்புகிறோம், அதனால் அதை குறைந்தபட்ச உள்ளமைவுடன் பயன்படுத்தலாம். உள்வரும் 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_துணை_புலம்_1_துணை_துணை_புலம்_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

பயனர் மற்ற அளவுகோல்களின்படி தரவுத்தளத்தில் தரவைப் பிரித்தல் அல்லது பிரித்தல் ஆகியவற்றை உள்ளமைக்க முடியும் என்று நாங்கள் நினைத்தோம் மற்றும் அட்டவணையின் பெயரை நிலையான அல்லது அமைக்கும் திறனை செயல்படுத்தினோம் வெளிப்பாடு கட்டமைப்பில். கீழே உள்ள எடுத்துக்காட்டில், நிகழ்வு தயாரிப்பு_வகை மற்றும் _டைம்ஸ்டாம்ப் புலங்களின் மதிப்புகளின் அடிப்படையில் கணக்கிடப்பட்ட பெயருடன் ஒரு அட்டவணையில் சேமிக்கப்படும் (எடுத்துக்காட்டாக பொருட்கள்_2020_10):

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

இருப்பினும், உள்வரும் நிகழ்வுகளின் அமைப்பு இயக்க நேரத்தில் மாறலாம். ஏற்கனவே உள்ள அட்டவணையின் கட்டமைப்பிற்கும் உள்வரும் நிகழ்வின் கட்டமைப்பிற்கும் உள்ள வேறுபாட்டைச் சரிபார்க்க ஒரு அல்காரிதத்தை நாங்கள் செயல்படுத்தியுள்ளோம். வேறுபாடு கண்டறியப்பட்டால், அட்டவணை புதிய புலங்களுடன் புதுப்பிக்கப்படும். இதைச் செய்ய, பேட்ச் SQL வினவலைப் பயன்படுத்தவும்:

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

கட்டிடக்கலை

எங்களின் ஓப்பன் சோர்ஸின் வரலாறு: Goவில் ஒரு பகுப்பாய்வு சேவையை எப்படி உருவாக்கினோம் மற்றும் அதை பொதுவில் கிடைக்கச் செய்தோம்

கோப்பு முறைமையில் நிகழ்வுகளை ஏன் எழுத வேண்டும், அவற்றை நேரடியாக தரவுத்தளத்தில் எழுதவில்லை? அதிக எண்ணிக்கையிலான செருகல்களைக் கையாளும் போது தரவுத்தளங்கள் எப்போதும் சிறப்பாக செயல்படாது (Postgres பரிந்துரைகள்) இதைச் செய்ய, லாகர் ஒரு கோப்பில் உள்வரும் நிகழ்வுகளை எழுதுகிறார் மற்றும் ஒரு தனி கோரூட்டின் (த்ரெட்) கோப்பு ரீடர் கோப்பைப் படிக்கிறது, பின்னர் தரவு மாற்றப்பட்டு தீர்மானிக்கப்படுகிறது. டேபிள் மேனேஜர் டேபிள் ஸ்கீமா புதுப்பித்த நிலையில் இருப்பதை உறுதிசெய்த பிறகு, தரவு ஒரு தொகுப்பாக தரவுத்தளத்தில் எழுதப்படும். பின்னர், தரவுத்தளத்தில் நேரடியாகத் தரவை எழுதும் திறனைச் சேர்த்துள்ளோம், ஆனால் இந்த பயன்முறையை ஏராளமான நிகழ்வுகளுக்குப் பயன்படுத்துகிறோம் - எடுத்துக்காட்டாக, மாற்றங்கள்.

திறந்த மூல மற்றும் எதிர்காலத்திற்கான திட்டங்கள்

ஒரு கட்டத்தில், சேவையானது ஒரு முழு அளவிலான தயாரிப்பு போல தோற்றமளிக்கத் தொடங்கியது, அதை திறந்த மூலத்தில் வெளியிட முடிவு செய்தோம். தற்போது, ​​Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake ஆகியவற்றுடன் ஒருங்கிணைப்புகள் செயல்படுத்தப்பட்டுள்ளன. அனைத்து ஒருங்கிணைப்புகளும் தரவு ஏற்றுதலின் தொகுதி மற்றும் ஸ்ட்ரீமிங் முறைகள் இரண்டையும் ஆதரிக்கின்றன. API வழியாக கோரிக்கைகளுக்கான ஆதரவு சேர்க்கப்பட்டது.

தற்போதைய ஒருங்கிணைப்பு திட்டம் இதுபோல் தெரிகிறது:

எங்களின் ஓப்பன் சோர்ஸின் வரலாறு: Goவில் ஒரு பகுப்பாய்வு சேவையை எப்படி உருவாக்கினோம் மற்றும் அதை பொதுவில் கிடைக்கச் செய்தோம்

சேவையை சுயாதீனமாக பயன்படுத்த முடியும் என்றாலும் (உதாரணமாக டோக்கரைப் பயன்படுத்துதல்), எங்களிடம் உள்ளது ஹோஸ்ட் செய்யப்பட்ட பதிப்பு, இதில் நீங்கள் தரவுக் கிடங்குடன் ஒருங்கிணைப்பை அமைக்கலாம், உங்கள் டொமைனில் CNAME ஐச் சேர்க்கலாம் மற்றும் நிகழ்வுகளின் எண்ணிக்கையில் புள்ளிவிவரங்களைப் பார்க்கலாம். எங்களின் உடனடித் திட்டங்கள், இணைய வளத்திலிருந்து புள்ளிவிபரங்களை மட்டுமல்லாமல், வெளிப்புற தரவு மூலங்களிலிருந்து தரவையும் ஒருங்கிணைத்து, உங்கள் விருப்பப்படி எந்த சேமிப்பகத்திலும் அவற்றைச் சேமிக்கும் திறனைச் சேர்ப்பதாகும்!

→ மகிழ்ச்சியா
→ ஆவணங்கள்
→ தளர்ந்த

உங்கள் பிரச்சினைகளைத் தீர்க்க EventNative உதவினால் நாங்கள் மகிழ்ச்சியடைவோம்!

பதிவு செய்த பயனர்கள் மட்டுமே கணக்கெடுப்பில் பங்கேற்க முடியும். உள்நுழையவும், தயவு செய்து.

உங்கள் நிறுவனத்தில் என்ன புள்ளிவிவர சேகரிப்பு அமைப்பு பயன்படுத்தப்படுகிறது?

  • 48,0%Google Analytics12

  • 4,0%பிரிவு 1

  • 16,0%மற்றொன்று (கருத்துகளில் எழுதவும்)4

  • 32,0%உங்கள் சேவை செயல்படுத்தப்பட்டது8

25 பயனர்கள் வாக்களித்தனர். 6 பயனர்கள் வாக்களிக்கவில்லை.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்