Databasa peyama VKontakte ji nû ve binivîsin û bijîn

Bikarhênerên me bêyî ku westiyayî bizanibin ji hev re peyaman dinivîsin.
Databasa peyama VKontakte ji nû ve binivîsin û bijîn
Ew pir pir e. Ger hûn dest ji xwendina hemî peyamên hemî bikarhêneran berdin, dê zêdetirî 150 hezar sal bidome. Bi şertê ku hûn xwendevanek pir pêşkeftî bin û li ser her peyamê ji saniyeyekê zêdetir derbas nekin.

Bi hêjmarek wusa daneyan, girîng e ku mantiqa hilanîn û gihîştina wê bi rengek çêtirîn were çêkirin. Wekî din, di demek ne pir ecêb de, dibe ku zelal bibe ku dê di demek nêzîk de her tişt xelet bibe.

Ji bo me ev kêlî beriya sal û nîvekê hat. Em çawa gihîştin vê yekê û di dawiyê de çi qewimî - em bi rêzê ji we re vedibêjin.

Paşde

Di pêkanîna yekem de, peyamên VKontakte li ser hevgirtinek paşnavê PHP û MySQL xebitîn. Ev ji bo malperek xwendekarek piçûk çareseriyek bi tevahî normal e. Lêbelê, ev malper bêkontrol mezin bû û dest bi daxwaza xweşbînkirina strukturên daneyê ji bo xwe kir.

Di dawiya 2009-an de, yekem depoya motora nivîsê hate nivîsandin, û di sala 2010-an de peyam jê re hatin veguheztin.

Di motora nivîsê de, peyam di navnîşan de hatin hilanîn - celebek "boxes". Her navnîşek weha ji hêla uid ve tête destnîşankirin - bikarhênerê ku xwediyê van hemî peyaman e. Peyamek komek taybetmendî heye: Nasnameya navber, nivîs, pêvedan û hwd. Nasnameya peyamê ya di hundurê "qutiyê" de local_id e, ew qet naguhezîne û ji bo peyamên nû bi rêz ve tê destnîşankirin. "Qutik" serbixwe ne û di hundurê motorê de bi hevûdu re ne hevdeng in; ragihandina di navbera wan de di asta PHP de pêk tê. Hûn dikarin ji hundur ve li avahiya daneyê û kapasîteyên motora nivîsê binihêrin vir.
Databasa peyama VKontakte ji nû ve binivîsin û bijîn
Ev ji bo danûstandina di navbera du bikarhêneran de têr bû. Texmîn bikin paşê çi qewimî?

Di Gulana 2011-an de, VKontakte bi gelek beşdaran re danûstandinan kir - pir-chat. Ji bo ku em bi wan re bixebitin, me du komên nû bilind kirin - endam-chat û chat-endam. Yekem daneyên di derbarê sohbetên bikarhêneran de, ya duyemîn daneyên di derbarê bikarhêneran de ji hêla sohbetan ve hilîne. Ji bilî navnîşan bi xwe, ev yek, mînakî, bikarhênerê vexwendinê û dema ku ew li chatê hatine zêdekirin vedihewîne.

Bikarhêner dibêje "PHP, em ji chatê re peyamek bişînin."
"Werin, {username}," dibêje PHP.
Databasa peyama VKontakte ji nû ve binivîsin û bijîn
Dezavantajên vê planê hene. Hevdemkirin hîn jî berpirsiyariya PHP-ê ye. Sohbetên mezin û bikarhênerên ku di heman demê de ji wan re peyaman dişînin çîrokek xeternak e. Ji ber ku mînaka motora nivîsê bi uid ve girêdayî ye, beşdarên chatê dikarin heman peyamê di demên cûda de bistînin. Ger pêşveçûn raweste mirov dikare bi vê bijî. Lê ew ê nebe.

Di dawiya 2015-an de, me peyamên civatê da destpêkirin, û di destpêka 2016-an de, me ji bo wan API-yek da destpêkirin. Bi hatina chatbotên mezin ên di civatan de, gengaz bû ku tewra belavkirina barkirinê jî ji bîr bikin.

Botek baş rojane çend mîlyon peyaman çêdike - bikarhênerên herî axaftin jî nikarin bi vê yekê pesnê xwe bidin. Ev tê vê wateyê ku hin mînakên motora nivîsê, ku li ser wan botên weha dijiyan, dest pê kir ku bi tevahî cefayê bikişîne.

Di sala 2016-an de motorên peyamê 100 mînakên chat-endam û endam-chat, û 8000 motorên nivîsê ne. Ew li ser hezar pêşkêşkeran, her yek bi 64 GB bîranîn hatin mêvan kirin. Wekî tedbîrek yekem a acîl, me bîranîn bi 32 GB din zêde kir. Me pêşbîniyan texmîn kir. Bêyî guhertinên tund, ev ê ji bo salek din bes be. Pêdivî ye ku hûn an hardware bigirin an jî databasan bixwe xweş bikin.

Ji ber xwezaya mîmariyê, ew tenê watedar e ku meriv hardware di pirjimar de zêde bike. Ango, bi kêmî ve ducarkirina hejmara otomobîlan - eşkere, ev rêyek pir biha ye. Em ê optimize bikin.

Konsepta nû

Cewhera navendî ya nêzîkatiya nû sohbet e. Di sohbetê de navnîşek peyamên ku pê re têkildar in heye. Bikarhêner navnîşek sohbetan heye.

Kêmtirîna pêwîst du databasên nû ye:

  • chat-motor. Ev depoyek vektorên chatê ye. Her sohbetê vektorek peyamên ku pê re têkildar in heye. Her peyamek di hundurê chatê de nivîsek û nasnameyek peyamek yekta heye - chat_local_id.
  • bikarhêner-motor. Ev hilanînek vektorên bikarhêneran e - girêdan bi bikarhêneran re. Her bikarhêner vektorek peer_id (hevpeyvîn - bikarhênerên din, pir-chat an civatan) û vektorek peyaman heye. Her peer_id vektorek peyamên ku pê re têkildar in heye. Her peyamek chat_local_id û nasnameya peyamek yekta ji bo wî bikarhêner heye - user_local_id.

Databasa peyama VKontakte ji nû ve binivîsin û bijîn
Komên nû bi karanîna TCP-ê bi hevûdu re danûstendinê dikin - ev piştrast dike ku rêza daxwazan nayê guhertin. Daxwazên xwe û pejirandinên ji bo wan li ser dîska hişk têne tomar kirin - ji ber vê yekê em dikarin di her kêliyê de piştî têkçûn an ji nû ve destpêkirina motorê rewşa dorê sererast bikin. Ji ber ku motor-bikarhêner û motora chat-ê her yek 4 hezar şûşe ne, rêza daxwaznameyê di navbera koman de dê bi rengek wekhev were belav kirin (lê di rastiyê de qet tune - û ew pir zû dixebite).

Karkirina bi dîskê re di databasên me de di pir rewşan de li ser bingeha berhevokek têketinek binaryê ya guhertinan (binlog), dîmenên statîk û wêneyek qismî di bîranînê de ye. Guhertinên di nav rojê de li binlogek têne nivîsandin, û wêneyek rewşa heyî bi periyodîk tê çêkirin. Snapshot berhevokek strukturên daneyê ye ku ji bo mebestên me xweşbînkirî ye. Ew ji sernavek (metaindexa wêneyê) û komek metafilan pêk tê. Sernivîs bi domdarî di RAM-ê de tê hilanîn û destnîşan dike ku meriv li ku derê li daneya wêneyê bigere. Her metafil daneyên ku îhtîmal e ku di demên nêz de hewce bibin vedihewîne - mînakî, bi bikarhênerek yekane ve girêdayî ye. Dema ku hûn bi karanîna sernavê wêneya wêneyê li databasê dipirsin, metafîla pêwîst tê xwendin, û dûv re guhertinên di binlogê de ku piştî çêkirina wêneyê çê bûne têne hesibandin. Hûn dikarin li ser feydeyên vê rêbazê bêtir bixwînin vir.

Di heman demê de, daneyên li ser dîskê bixwe rojê tenê carekê diguhezin - derengê şevê li Moskowê, dema ku bar kêm e. Bi saya vê yekê (dizanin ku avahiya li ser dîskê di tevahiya rojê de domdar e), em dikarin li şûna vektoran rêzikên bi pîvanek sabît biguhezînin - û ji ber vê yekê, di bîranînê de qezenc bikin.

Di nexşeya nû de şandina peyamek wiha xuya dike:

  1. Piştgiriya PHP-ê bi daxwaza şandina peyamek bi motor-karhêner re têkilî dike.
  2. motor-bikarhêner daxwazê ​​ji mînaka motora chatê ya xwestî re prox dike, ku vedigere motora bikarhêner-chat_local_id - nasnameyek bêhempa ya peyamek nû di nav vê chatê de. Dûv re chat_engine peyamê ji hemî wergirên di chatê re diweşîne.
  3. user-engine chat_local_id ji chat-engine distîne û user_local_id vedigerîne PHP - ji bo vê bikarhêner nasnameyek peyamek yekta. Dûv re ev nasname tê bikar anîn, mînakî, ji bo xebitandina peyaman bi riya API-yê.

Databasa peyama VKontakte ji nû ve binivîsin û bijîn
Lê ji bilî şandina peyaman, hûn hewce ne ku çend tiştên girîngtir bicîh bînin:

  • Lîsteyên jêrîn, wek nimûne, peyamên herî dawîn in ku hûn gava ku navnîşa danûstendinê vedikin dibînin. Peyamên nexwendî, peyamên bi etîketan ("Giring", "Spam", hwd.).
  • Di motora chat-ê de peyaman berhev dike
  • Veşartina peyaman di motora bikarhêner de
  • Lêgerîn (di nav hemî diyalogan de û di hundurê yek taybetî de).
  • Nûvekirina dema rast (Longpolling).
  • Tomarkirina dîrokê ji bo pêkanîna caching li ser xerîdarên mobîl.

Hemî jêrlîste strukturên bilez diguhezin. Ji bo ku em bi wan re bixebitin em bikar tînin daran bişkînin. Ev vebijark bi vê yekê tê ravekirin ku li serê darê em carinan beşek tevahî peyaman ji wêneyek wêneyek hilînin - mînakî, piştî nûvekirina şevê, dar ji yek topê pêk tê, ku hemî peyamên navnîşê dihewîne. Dara Splay bêyî ku meriv li ser hevsengiyê bifikire hêsan dike ku meriv têxe nav nîvê verteksek wusa. Wekî din, Splay daneyên nepêwist hilîne, ku bîra me xilas dike.

Mesaj gelek agahdarî vedihewîne, bi piranî nivîsê, ku ji bo ku meriv bikaribe berhev bike kêrhatî ye. Girîng e ku em bikarin yek peyamek kesane jî bi rengek rast ji arşîv bikin. Ji bo berhevkirina peyaman tê bikar anîn Algorîtmaya Huffman bi heurîstîkên xwe - mînakî, em dizanin ku di peyaman de peyvan bi "ne-peyvan" - cîh, nîşaneyên xalbendiyê - û em hin taybetmendiyên karanîna sembolan ji bo zimanê rûsî jî bi bîr tînin.

Ji ber ku bikarhêner ji sohbetan pir hindiktir in, ji bo ku daxwazên dîskê-gihîştina rasthatî di motora chat-ê de hilînin, em peyaman di motor-karhêner de cache dikin.

Lêgerîna peyamê wekî pirsek diagonal ji motor-karhêner berbi hemî mînakên motora chat-ê ku sohbetên vî bikarhênerî vedihewîne tê bicîh kirin. Encam di motora bikarhêner bixwe de têne hev kirin.

Welê, hemî hûrgulî li ber çavan hatine girtin, ya ku dimîne ev e ku meriv berbi nexşeyek nû veguhezîne - û bijare bêyî ku bikarhêner haya wê jê hebe.

Koçkirina daneyan

Ji ber vê yekê, me motorek nivîsê heye ku ji hêla bikarhêner ve peyaman hilîne, û du komên chat-endam û endam-chat hene ku daneyên li ser odeyên pir-chatê û bikarhênerên di wan de hilîne. Meriv çawa ji vê berbi motor-karhêner û motora chat-a nû ve diçe?

sohbetên endam di pilana kevn de di serî de ji bo xweşbîniyê hate bikar anîn. Me zû daneyên pêwîst jê re veguhezand endamên chat-ê, û dûv re ew nema beşdarî pêvajoya koçberiyê bû.

Dorê ji bo endamên chatê. Di nav xwe de 100 mînak hene, dema ku motora chat-ê 4 hezar heye. Ji bo veguheztina daneyan, hûn hewce ne ku wê li hev bikin - ji bo vê yekê, endamên chat-ê di heman 4 hezar kopiyan de hatin dabeş kirin, û dûv re xwendina binloga endamên chat-ê di motora chat-ê de hate çalak kirin.
Databasa peyama VKontakte ji nû ve binivîsin û bijîn
Naha motora chatê bi pir-chatê ji endamên chatê dizane, lê hîna di derbarê diyalogên bi du muxatab re tiştek nizane. Diyalogên weha di motora nivîsê de bi referansa bikarhêneran têne cih kirin. Li vir me daneya "ser-ser" girt: her mînakek motora chatê ji hemî nimûneyên motora nivîsê pirsî ka wan diyaloga ku hewce dike heye.

Mezin - chat-motor dizane ku çi sohbetên pir-chat hene û dizane ku çi diyalog hene.
Pêdivî ye ku hûn di sohbetên pir-chatê de peyaman bidin hev da ku hûn di her chatê de navnîşek peyaman bi dawî bikin. Pêşîn, motora chat-ê hemî peyamên bikarhêner ji vê chatê ji motora nivîsê vedigire. Di hin rewşan de gelek ji wan hene (heta bi sed mîlyonan), lê ji bilî îstîsnayên pir kêm, chat bi tevahî di RAM-ê de cih digire. Peyamên me yên nerêkûpêk hene, her yek di çend kopiyan de - her tiştî, ew hemî ji mînakên motora nivîsê yên cihêreng ên ku bi bikarhêneran re têkildar in têne derxistin. Armanc ew e ku mesajan birêkûpêk bikin û ji kopiyên ku cîhê nehewce digirin xilas bibin.

Her peyamek demjimêrek heye ku tê de dema şandin û nivîsê heye. Em ji bo birêkûpêkkirinê demê bikar tînin - em nîşangiran li peyamên herî kevn ên beşdarên pir-chatê bi cîh dikin û haşeyên ji nivîsa kopiyên armanckirî didin ber hev, ber bi zêdebûna nîşana demê ve diçin. Mantiqî ye ku kopiyan xwedî heman haş û demê bin, lê di pratîkê de her gav ne wusa ye. Wekî ku tê bîra we, hevdengkirina di pilana kevn de ji hêla PHP-ê ve hate kirin - û di rewşên kêm de, dema şandina heman peyamê di nav bikarhênerên cûda de cûda bû. Di van rewşan de, me destûr da ku em nîşana demê biguherînin - bi gelemperî di nav saniyeyekê de. Pirsgirêka duyemîn rêza cûda ya peyaman ji bo wergirên cihêreng e. Di rewşên weha de, me destûr da ku kopiyek zêde were afirandin, bi vebijarkên cûda yên fermankirinê ji bo bikarhênerên cihêreng.

Piştî vê yekê, daneyên di derbarê peyamên di multichat de ji motora bikarhêner re têne şandin. Û li vir taybetmendiyek ne xweş a peyamên importkirî tê. Di xebata normal de, peyamên ku têne motorê ji hêla user_local_id ve bi hişkî bi rêza hilkişînê têne ferman kirin. Peyamên ku ji motora kevn di motora-karhêner de têne şandin vê taybetmendiya kêrhatî winda kirin. Di heman demê de, ji bo rehetiya ceribandinê, hûn hewce ne ku hûn zû bigihîjin wan, di wan de tiştek bigerin û yên nû lê zêde bikin.

Em avahiyek daneya taybetî bikar tînin da ku peyamên îthalkirî hilînin.

Ew vektorek mezinbûnê temsîl dike Databasa peyama VKontakte ji nû ve binivîsin û bijînher kes li ku ye Databasa peyama VKontakte ji nû ve binivîsin û bijîn - cuda ne û bi rêza xwarê, bi rêzeke taybet a hêmanan têne rêzkirin. Di her beşê de bi nîşanan Databasa peyama VKontakte ji nû ve binivîsin û bijîn hêman têne rêz kirin. Lêgerîna hêmanek di avahiyek wusa de wext digire Databasa peyama VKontakte ji nû ve binivîsin û bijîn bi saya Databasa peyama VKontakte ji nû ve binivîsin û bijîn lêgerînên binary. Zêdekirina hêmanekê li ser tê amortîzekirin Databasa peyama VKontakte ji nû ve binivîsin û bijîn.

Ji ber vê yekê, me fêm kir ka meriv çawa daneyan ji motorên kevn vediguhezîne yên nû. Lê ev pêvajo çend rojan digire - û ne mimkûn e ku di van rojan de bikarhênerên me dev ji adetên nivîsandina hevdu berdin. Ji bo ku di vê demê de mesajan winda nebin, em diçin bernameyek xebatê ku hem komên kevn û hem jî yên nû bikar tîne.

Daneyên ji endamên chat-endam û motor-bikarhêner re têne nivîsandin (û ne ji motora nivîsê re, wekî di xebata normal de li gorî pilana kevn). motor-bikarhêner daxwaza chat-motorê prox dike - û li vir tevger bi vê yekê ve girêdayî ye ku gelo ev chat jixwe hatî yek kirin an na. Ger sohbet hîna nehatibe yekkirin, motora chatê ji xwe re peyamê nanivîse, û pêvajokirina wê tenê di motora nivîsê de pêk tê. Ger sohbet jixwe di motora chatê de hatibe yek kirin, ew chat_local_id vedigerîne motora bikarhêner û peyamê ji hemî wergiran re dişîne. motor-bikarhêner hemî daneyan bi motora nivîsê re prox dike - da ku heke tiştek çêbibe, em her gav dikarin paşde bizivirin, ku hemî daneyên heyî di motora kevn de hebin. text-engine user_local_id vedigerîne, ku motor-karhêner hildide û vedigere piştê.
Databasa peyama VKontakte ji nû ve binivîsin û bijîn
Wekî encamek, pêvajoya veguheztinê bi vî rengî xuya dike: em komên vala bikarhêner-motor û chat-motorê girêdidin. chat-engine tevaya binloga endamên chatê dixwîne, dûv re proxying li gorî nexşeya ku li jor hatî destnîşan kirin dest pê dike. Em daneyên kevn vediguhezînin û du komên hevdemkirî (kevn û nû) digirin. Tiştê ku dimîne ev e ku meriv xwendinê ji motora nivîsê veguhezîne motora bikarhêner û proxykirinê neçalak bike.

Encam

Bi saya nêzîkatiya nû, hemî pîvanên performansê yên motoran baştir bûne û pirsgirêkên bi hevgirtina daneyê re hatine çareser kirin. Naha em dikarin zû taybetmendiyên nû di peyaman de bicîh bikin (û jixwe dest bi kirina vê yekê kirine - me hejmara herî zêde ya beşdarên sohbetê zêde kir, lêgerînek ji bo peyamên şandin pêk anî, peyamên pînekirî dan destpêkirin û sînorê jimara giştî ya peyaman ji bo bikarhênerek bilind kir) .

Guhertinên di mantiqê de bi rastî pir mezin in. Û ez dixwazim bibînim ku ev her gav nayê wateya pêşkeftina tevahiya salên ji hêla tîmek mezin û bi hezaran rêzikên kodê ve. motora chat û motor-karhêner ligel hemî çîrokên pêvek ên mîna Huffman ji bo berhevkirina peyamê, darên Splay û avahiya ji bo peyamên importkirî ji 20 hezar xetên kodê kêmtir e. Û ew tenê di 3 mehan de ji hêla 10 pêşdebiran ve hatine nivîsandin (lêbelê, hêja ye ku meriv vê yekê ji bîr mekin hemî pêşvebirinê - şampiyonên cîhanê di bernameyên sporê de).

Digel vê yekê, li şûna ku em hejmara serveran ducar bikin, me hejmara wan bi nîvî kêm kir - naha motora bikarhêner û motora chatê li ser 500 makîneyên laşî dijîn, di heman demê de pilana nû ji bo barkirinê jûreyek mezin heye. Me gelek drav li ser amûran xilas kir - bi qasî 5 mîlyon $ + 750 hezar $ salê di lêçûnên xebitandinê de.

Em hewl didin ku ji bo pirsgirêkên herî tevlihev û mezin çareseriyên çêtirîn bibînin. Me gelek ji wan hene - û ji ber vê yekê em di beşa databasê de li pêşdebirên jêhatî digerin. Ger hûn hez dikin û dizanin ka meriv çawa pirsgirêkên weha çareser dike, xwedan zanînek hêja ya algorîtmayan û strukturên daneyê ye, em we vedixwînin ku hûn beşdarî tîmê bibin. Têkilî me HRji bo hûragahiyan.

Her çend ev çîrok ne li ser we be jî, ji kerema xwe not bikin ku em qîmetê didin pêşniyaran. Ji hevalê xwe re bêje valahiyên pêşdebiran, û heke ew bi serfirazî heyama ceribandinê biqedîne, hûn ê 100 hezar rûbil bonusek bistînin.

Source: www.habr.com

Add a comment