අපගේ විවෘත මූලාශ්‍රයේ ඉතිහාසය: අපි Go හි විශ්ලේෂණ සේවාවක් සාදා එය ප්‍රසිද්ධියේ ලබා දුන් ආකාරය

දැනට, ලෝකයේ සෑම සමාගමක්ම පාහේ වෙබ් සම්පතක් මත පරිශීලක ක්‍රියා පිළිබඳ සංඛ්‍යාලේඛන රැස් කරයි. අභිප්‍රේරණය පැහැදිලිය - සමාගම්වලට ඔවුන්ගේ නිෂ්පාදනය/වෙබ් අඩවිය භාවිතා කරන ආකාරය දැන ගැනීමට සහ ඔවුන්ගේ පරිශීලකයින් වඩාත් හොඳින් අවබෝධ කර ගැනීමට අවශ්‍ය වේ. ඇත්ත වශයෙන්ම, මෙම ගැටළුව විසඳීම සඳහා වෙළඳපොලේ මෙවලම් විශාල ප්‍රමාණයක් ඇත - උපකරණ පුවරු සහ ප්‍රස්ථාර ආකාරයෙන් දත්ත සපයන විශ්ලේෂණ පද්ධති වලින් (උදාහරණයක් ලෙස Google Analytics) ඕනෑම ගබඩාවක විවිධ ප්‍රභවයන්ගෙන් දත්ත රැස් කිරීමට සහ එකතු කිරීමට ඔබට ඉඩ සලසන පාරිභෝගික දත්ත වේදිකාවට (උදාහරණයක් ලෙස කොටස).

නමුත් තවමත් නොවිසඳුනු ගැටලුවක් අපට හමු විය. මෙසේ උපත ලැබීය EventNative - විවෘත මූලාශ්‍ර විශ්ලේෂණ සේවාව. අපි අපේම සේවාවක් සංවර්ධනය කිරීමට තීරණය කළේ ඇයි, එය අපට ලබා දුන් දේ සහ අවසාන ප්රතිඵලය කුමක්ද (කේත කෑලි සමඟ) කියවන්න.

අපගේ විවෘත මූලාශ්‍රයේ ඉතිහාසය: අපි Go හි විශ්ලේෂණ සේවාවක් සාදා එය ප්‍රසිද්ධියේ ලබා දුන් ආකාරය

අපි අපේම සේවාවක් දියුණු කළ යුත්තේ ඇයි?

එය අනූව දශකයයි, අපි හැකි උපරිමයෙන් බේරුණෙමු. 2019, අපි API පළමු පාරිභෝගික දත්ත වේදිකාව සංවර්ධනය කළෙමු kSense, වඩාත් පහසු දත්ත විශ්ලේෂණය, පරායත්තතා හඳුනාගැනීම යනාදිය සඳහා විවිධ මූලාශ්‍රවලින් (ෆේස්බුක් දැන්වීම්, ස්ට්‍රයිප්, සේල්ස්ෆෝර්ස්, ගූගල් ප්ලේ, ගූගල් විශ්ලේෂණ, ආදිය) දත්ත එක්රැස් කිරීමට හැකි විය. බොහෝ පරිශීලකයින් දත්ත විශ්ලේෂණය සඳහා විශේෂයෙන් Google Analytics සඳහා අපගේ වේදිකාව භාවිතා කරන බව අපි දැක ඇත්තෙමු (මෙතැන් සිට GA). අපි සමහර පරිශීලකයින් සමඟ කතා කළ අතර ඔවුන්ට GA භාවිතයෙන් ලැබෙන ඔවුන්ගේ නිෂ්පාදනය සඳහා විශ්ලේෂණ දත්ත අවශ්‍ය බව සොයා ගත්තෙමු, නමුත් ගූගල් දත්ත සාම්පල සහ බොහෝ දෙනෙකුට, GA පරිශීලක අතුරුමුහුණත පහසුව සඳහා ප්‍රමිතිය නොවේ. අපි අපගේ පරිශීලකයින් සමඟ ප්‍රමාණවත් සංවාද ඇති අතර බොහෝ දෙනෙක් කොටස් වේදිකාව ද භාවිතා කරන බව වටහා ගත්තෙමු (එය, පසුගිය දිනෙක පමණි. ඩොලර් බිලියන 3.2 කට විකුණා ඇත).

ඔවුන් ඔවුන්ගේ වෙබ් සම්පත මත Segment javascript පික්සලයක් ස්ථාපනය කර ඇති අතර ඔවුන්ගේ පරිශීලකයින්ගේ හැසිරීම් පිළිබඳ දත්ත නිශ්චිත දත්ත ගබඩාවට පූරණය කර ඇත (උදාහරණයක් ලෙස Postgres). නමුත් කොටසෙහි අවාසි ද ඇත - මිල. උදාහරණයක් ලෙස, වෙබ් සම්පතක 90,000 MTU (මාසික ලුහුබැඳ ගිය පරිශීලකයින්) තිබේ නම්, ඔබ අයකැමිට මසකට $1,000 ගෙවිය යුතුය. තුන්වන ගැටලුවක් ද විය - සමහර බ්‍රවුසර දිගු (ඇඩ්බ්ලොක් වැනි) විශ්ලේෂණ එකතුව අවහිර කළ නිසා... බ්‍රවුසරයෙන් 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);
        });
    });
}

Segment pixel සමඟ සෑම දෙයක්ම සරල ය; එහි මිඩ්ල්වෙයාර් ක්‍රම ඇත, ඒවායින් එකක් අපි භාවිතා කළෙමු.


//'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"
}

කෙසේ වෙතත්, arrays දැනට සරලව තන්තු බවට පරිවර්තනය කර ඇති නිසා සියලුම සම්බන්ධතා දත්ත සමුදායන් නැවත නැවතත් ක්ෂේත්‍ර සඳහා සහය නොදක්වයි. විකල්ප සිතියම්කරණ රීති භාවිතයෙන් ක්ෂේත්‍ර නාම වෙනස් කිරීමට හෝ මකා දැමීමටද හැකිය. අවශ්‍ය නම් දත්ත යෝජනා ක්‍රමය වෙනස් කිරීමට හෝ එක් දත්ත වර්ගයක් තවත් දත්ත වර්ගයකට පරිවර්තනය කිරීමට ඒවා ඔබට ඉඩ සලසයි. උදාහරණයක් ලෙස, json ක්ෂේත්‍රයක වේලා මුද්‍රාව සහිත තන්තුවක් තිබේ නම් (field_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

පරිශීලකයාට වෙනත් නිර්ණායක අනුව දත්ත සමුදායේ දත්ත බෙදීම හෝ බෙදීම වින්‍යාස කිරීමට හැකි විය යුතු බවත්, වගුවේ නම නියත හෝ සමඟ සැකසීමේ හැකියාව ක්‍රියාත්මක කළ යුතු බවත් අපි සිතුවෙමු. ප්රකාශනය වින්යාසය තුළ. පහත උදාහරණයේ, product_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 ගොනුවකට පැමිණෙන සිදුවීම් ලියන අතර වෙනම goroutine (නූල්) ගොනු කියවන්නා ගොනුව කියවයි, පසුව දත්ත පරිවර්තනය කර තීරණය කරනු ලැබේ. වගු කළමණාකරු වගු ක්‍රමය යාවත්කාලීන බවට සහතික වූ පසු, දත්ත එක් කණ්ඩායමක් තුළ දත්ත සමුදායට ලියා ඇත. පසුව, අපි දත්ත ගබඩාවට කෙලින්ම දත්ත ලිවීමේ හැකියාව එකතු කළෙමු, නමුත් අපි මෙම මාදිලිය බොහෝ නොවන සිදුවීම් සඳහා භාවිතා කරමු - උදාහරණයක් ලෙස, පරිවර්තන.

විවෘත මූලාශ්‍රය සහ අනාගතය සඳහා සැලසුම්

යම් අවස්ථාවක දී, සේවාව සම්පූර්ණ නිෂ්පාදනයක් ලෙස පෙනෙන්නට පටන් ගත් අතර අපි එය විවෘත මූලාශ්‍රයට මුදා හැරීමට තීරණය කළෙමු. දැනට, Postgres, ClickHouse, BigQuery, Redshift, S3, Snowflake සමඟ ඒකාබද්ධ කිරීම් ක්රියාත්මක කර ඇත. සියලුම ඒකාබද්ධ කිරීම් දත්ත පැටවීමේ කණ්ඩායම් සහ ප්‍රවාහ ක්‍රම දෙකටම සහය දක්වයි. API හරහා ඉල්ලීම් සඳහා සහය එක් කරන ලදී.

වත්මන් ඒකාබද්ධ කිරීමේ යෝජනා ක්රමය මේ වගේ ය:

අපගේ විවෘත මූලාශ්‍රයේ ඉතිහාසය: අපි Go හි විශ්ලේෂණ සේවාවක් සාදා එය ප්‍රසිද්ධියේ ලබා දුන් ආකාරය

සේවාව ස්වාධීනව භාවිතා කළ හැකි වුවද (උදාහරණයක් ලෙස ඩොකර් භාවිතා කිරීම), අපට ද ඇත සත්කාරක අනුවාදය, ඔබට දත්ත ගබඩාවක් සමඟ ඒකාබද්ධ කිරීම පිහිටුවිය හැකි අතර, ඔබේ වසමට CNAME එකක් එක් කර සිදුවීම් ගණන පිළිබඳ සංඛ්‍යාලේඛන බලන්න. අපගේ ක්ෂණික සැලසුම් වන්නේ වෙබ් සම්පතකින් සංඛ්‍යාලේඛන පමණක් නොව, බාහිර දත්ත මූලාශ්‍රවලින් දත්ත එකතු කිරීමේ හැකියාව සහ ඒවා ඔබ කැමති ඕනෑම ගබඩාවකට සුරැකීමයි!

→ GitHub
→ ප්‍රලේඛනය
→ ඉල්ලූම

EventNative ඔබගේ ගැටළු විසඳීමට උදවු කරන්නේ නම් අපි සතුටු වන්නෙමු!

සමීක්ෂණයට සහභාගී විය හැක්කේ ලියාපදිංචි පරිශීලකයින්ට පමණි. පුරන්නකරුණාකර.

ඔබේ සමාගම තුළ භාවිතා කරන සංඛ්‍යාලේඛන එකතු කිරීමේ පද්ධතිය කුමක්ද?

  • 48,0%ගූගල් විශ්ලේෂණ 12

  • 4,0%1 කොටස

  • 16,0%තවත් (අදහස් ලියන්න)4

  • 32,0%ඔබගේ සේවාව ක්‍රියාත්මක කර ඇත8

පරිශීලකයින් 25 දෙනෙක් ඡන්දය දුන්හ. පරිශීලකයින් 6 දෙනෙක් ඡන්දය දීමෙන් වැළකී සිටියහ.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න