Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед

Корбарони мо бе хастагӣ ба ҳамдигар паём менависанд.
Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед
Ин хеле зиёд аст. Агар шумо барои хондани тамоми паёмҳои ҳамаи корбарон қарор гиред, он беш аз 150 ҳазор сол лозим мешавад. Ба шарте, ки шумо хонандаи хеле пешрафта бошед ва барои ҳар як паём на бештар аз як сония сарф кунед.

Бо чунин ҳаҷми маълумот муҳим аст, ки мантиқи нигоҳдорӣ ва дастрасии он ба таври оптималӣ сохта шавад. Дар акси ҳол, дар як лаҳзаи на он қадар аҷиб маълум мешавад, ки ҳама чиз ба зудӣ нопадид мешавад.

Барои мо ин лахза якуним сол пеш омада буд. Мо ба ин чй тавр расидем ва дар охир чй шуд, — мо ба шумо бо тартиб мегуем.

Асосӣ

Дар татбиқи аввалин, паёмҳои VKontakte дар омезиши PHP backend ва MySQL кор мекарданд. Ин як ҳалли комилан муқаррарӣ барои вебсайти донишҷӯии хурд аст. Аммо, ин сайт ба таври беназорат афзоиш ёфт ва барои худ оптимизатсияи сохторҳои додаҳоро талаб кард.

Дар охири соли 2009 аввалин репозиторийии матнӣ навишта шуд ва дар соли 2010 паёмҳо ба он интиқол дода шуданд.

Дар муҳаррики матнӣ паёмҳо дар рӯйхатҳо нигоҳ дошта мешуданд - як навъ "қуттиҳои почта". Ҳар як рӯйхат аз ҷониби uid муайян карда мешавад - корбаре, ки ҳамаи ин паёмҳоро дорад. Паём дорои маҷмӯи атрибутҳо: мушаххаскунандаи ҳамсӯҳбат, матн, замимаҳо ва ғайра. Муайянкунандаи паём дар дохили "қуттӣ" local_id аст, он ҳеҷ гоҳ тағир намеёбад ва барои паёмҳои нав пайдарпай таъин карда мешавад. "Қуттҳо" мустақиланд ва дар дохили муҳаррик бо ҳамдигар ҳамоҳанг карда намешаванд; иртибот байни онҳо дар сатҳи PHP сурат мегирад. Шумо метавонед сохтори додаҳо ва имкониятҳои муҳаррики матниро аз дарун дида бароед дар ин ҷо.
Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед
Ин барои мукотибаи ду корбар кофӣ буд. Фикр кунед, ки баъд чӣ шуд?

Дар моҳи майи соли 2011, ВКонтакте сӯҳбатҳоро бо якчанд иштирокчиён - чандчат ҷорӣ кард. Барои кор бо онҳо, мо ду кластери нав - аъзо-чатҳо ва чат-аъзоёнро ба вуҷуд овардем. Дар аввал маълумот дар бораи чатҳо аз ҷониби корбарон нигоҳ дошта мешавад, дуюм маълумот дар бораи корбаронро тавассути чат нигоҳ медорад. Илова ба худи рӯйхатҳо, ин, масалан, корбари даъваткунанда ва вақти ба чат иловашударо дар бар мегирад.

"PHP, биёед ба чат паём фиристем" мегӯяд корбар.
"Биёед, {username}" мегӯяд PHP.
Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед
Дар ин схема камбудиҳо мавҷуданд. Ҳамоҳангсозӣ то ҳол масъулияти PHP аст. Чатҳои калон ва корбароне, ки ҳамзамон ба онҳо паём мефиристанд, як ҳикояи хатарнок мебошанд. Азбаски намунаи муҳаррики матн аз uid вобаста аст, иштирокчиёни чат метавонанд дар вақтҳои гуногун як паёмро гиранд. Агар пешрафт дар он ҷо истода бошад, бо ин зиндагӣ кардан мумкин аст. Аммо ин тавр нахоҳад шуд.

Дар охири соли 2015 мо паёмҳои ҷомеаро оғоз кардем ва дар аввали соли 2016 барои онҳо API оғоз кардем. Бо пайдоиши чатботҳои калон дар ҷамоатҳо, ҳатто тақсимоти сарборро фаромӯш кардан мумкин буд.

Як боти хуб дар як рӯз чанд миллион паём тавлид мекунад - ҳатто корбарони аз ҳама сӯҳбаткунанда бо ин фахр карда наметавонанд. Ин маънои онро дорад, ки баъзе мисолҳои муҳаррики матн, ки дар он чунин ботҳо зиндагӣ мекарданд, то ҳадди имкон азоб кашиданд.

Муҳаррикҳои паёмҳо дар соли 2016 100 мисоли аъзои чат ва аъзоён ва 8000 муҳаррики матнӣ мебошанд. Онҳо дар ҳазор серверҳо ҷойгир карда шуданд, ки ҳар кадоми онҳо 64 ГБ хотира доранд. Ҳамчун чораи аввалини фавқулодда, мо хотираро боз 32 ГБ зиёд кардем. Мо пешгӯиро ҳисоб кардем. Бе дигаргунихои катъй ин такрибан як соли дигар кифоя мебуд. Шумо бояд сахтафзорро ба даст оред ё худи пойгоҳи додаҳоро оптимизатсия кунед.

Аз сабаби табиати меъморӣ, танҳо зиёд кардани сахтафзор дар чандкарата маъно дорад. Яъне, ҳадди ақалл ду баробар зиёд кардани шумораи мошинҳо - аз афташ, ин роҳи хеле гарон аст. Мо оптимизатсия мекунем.

Консепсияи нав

Мохияти марказии муносибати нав чат аст. Чат рӯйхати паёмҳоеро дорад, ки ба он марбутанд. Истифодабаранда рӯйхати чатҳоро дорад.

Ҳадди ақали талабшаванда ду базаи нав аст:

  • муҳаррики сӯҳбат. Ин як анбори векторҳои чат аст. Ҳар як чат вектори паёмҳое дорад, ки ба он марбутанд. Ҳар як паём дорои матн ва идентификатори беназири паём дар дохили чат - chat_local_id.
  • муҳаррики корбар. Ин захираи векторҳои корбарон аст - пайвандҳо ба корбарон. Ҳар як корбар дорои вектори peer_id (ҳамсуҳбатҳо - корбарони дигар, бисёрчат ё ҷомеаҳо) ва вектори паёмҳо мебошад. Ҳар як peer_id дорои вектори паёмҳое мебошад, ки ба он алоқаманданд. Ҳар як паём дорои chat_local_id ва ID ягонаи паём барои он корбар - user_local_id.

Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед
Кластерҳои нав бо истифода аз TCP бо ҳамдигар муошират мекунанд - ин кафолат медиҳад, ки тартиби дархостҳо тағир наёбад. Худи дархостҳо ва тасдиқи онҳо дар диски сахт сабт карда мешаванд - аз ин рӯ, мо метавонем дар вақти дилхоҳ пас аз нокомӣ ё аз нав ба кор андохтани муҳаррик ҳолати навбатро барқарор кунем. Азбаски муҳаррики корбар ва муҳаррики чат ҳар кадом 4 ҳазор дона аст, навбати дархост байни кластерҳо баробар тақсим карда мешавад (аммо дар асл ҳеҷ чиз вуҷуд надорад - ва он хеле зуд кор мекунад).

Кор бо диск дар пойгоҳи додаҳои мо дар аксари ҳолатҳо ба омезиши сабти бинарии тағирот (binlog), аксҳои статикӣ ва тасвири қисман дар хотира асос ёфтааст. Тағирот дар давоми рӯз ба бинлог навишта мешавад ва акси ҳолати кунунӣ давра ба давра эҷод карда мешавад. Намоиши фаврӣ маҷмӯи сохторҳои додаҳост, ки барои мақсадҳои мо оптимизатсия шудаанд. Он аз сарлавҳа (метаиндекси тасвир) ва маҷмӯи метафайлҳо иборат аст. Сарлавҳа ба таври доимӣ дар хотираи оперативӣ нигоҳ дошта мешавад ва нишон медиҳад, ки дар куҷо маълумотро аз аксбардорӣ ҷустуҷӯ кардан лозим аст. Ҳар як метафайл маълумотеро дар бар мегирад, ки эҳтимолан дар лаҳзаҳои наздик лозим аст, масалан, марбут ба як корбар. Вақте ки шумо ба пойгоҳи додаҳо бо истифода аз сарлавҳаи аксбардорӣ дархост мекунед, метафайлҳои лозимӣ хонда мешаванд ва сипас тағирот дар binlog, ки пас аз эҷоди акс ба амал омадаанд, ба назар гирифта мешаванд. Шумо метавонед дар бораи манфиатҳои ин равиш бештар хонед дар ин ҷо.

Дар айни замон, худи маълумот дар диски сахт дар як рӯз танҳо як маротиба тағйир меёбад - дар шаб дар Маскав, вақте ки сарборӣ ҳадди аққал аст. Ба шарофати ин (донист, ки сохтори диск дар давоми рӯз доимӣ аст), мо метавонем векторҳоро бо массивҳои андозаи муқарраршуда иваз кунем - ва аз ин рӯ, хотира ба даст меояд.

Ирсоли паём дар нақшаи нав чунин аст:

  1. Пахши PHP бо муҳаррики корбар бо дархости ирсоли паём тамос мегирад.
  2. муҳаррики корбар дархостро ба намунаи муҳаррики чат-муҳаррики дилхоҳ прокси мекунад, ки он ба муҳаррики корбар chat_local_id - идентификатори беназири паёми нав дар дохили ин чат бармегардад. Сипас chat_engine паёмро ба ҳамаи қабулкунандагони чат паҳн мекунад.
  3. муҳаррики корбар chat_local_id-ро аз chat-engine мегирад ва user_local_id-ро ба PHP бармегардонад - идентификатори беназири паём барои ин корбар. Ин идентификатор пас аз он, масалан, барои кор бо паёмҳо тавассути API истифода мешавад.

Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед
Аммо ба ғайр аз фиристодани паёмҳо, шумо бояд чанд чизи муҳими дигарро амалӣ кунед:

  • Масалан, зеррӯйхатҳо паёмҳои охирине мебошанд, ки ҳангоми кушодани рӯйхати сӯҳбатҳо мебинед. Паёмҳои хонданашуда, паёмҳои дорои тегҳо («Муҳим», «Спам» ва ғ.).
  • Фишурдани паёмҳо дар муҳаррики чат
  • Кэшкунии паёмҳо дар муҳаррики корбар
  • Ҷустуҷӯ (тавассути ҳама муколамаҳо ва дар дохили як муколама).
  • Навсозии вақти воқеӣ (Longpolling).
  • Сабти таърих барои татбиқи кэш дар муштариёни мобилӣ.

Ҳама зеррӯйхатҳо сохторҳои зуд тағйирёбанда мебошанд. Барои кор бо онҳо мо истифода мебарем Дарахтони пошидан. Ин интихоб бо он шарҳ дода мешавад, ки дар болои дарахт мо баъзан як сегменти пурраи паёмҳоро аз аксбардорӣ нигоҳ медорем - масалан, пас аз реиндексизатсияи шабона, дарахт аз як боло иборат аст, ки ҳамаи паёмҳои зеррӯйхатро дар бар мегирад. Дарахти Splay имкон медиҳад, ки ба мобайни чунин вертекс ворид кунед, бидуни он ки дар бораи мувозинат фикр кунед. Илова бар ин, Splay маълумоти нолозимро нигоҳ намедорад, ки хотираи моро сарфа мекунад.

Паёмҳо миқдори зиёди иттилоотро дар бар мегиранд, асосан матн, ки барои фишурда шудан муфид аст. Муҳим аст, ки мо метавонем ҳатто як паёми инфиродӣ ба таври дақиқ аз бойгонӣ хориҷ кунем. Барои фишурдани паёмҳо истифода мешавад Алгоритми Хаффман бо эвристикаи худамон - масалан, мо медонем, ки дар паёмҳо калимаҳо бо "налимаҳо" - фосилаҳо, аломатҳои пунктуатсия иваз мешаванд ва мо инчунин баъзе хусусиятҳои истифодаи аломатҳоро барои забони русӣ дар хотир дорем.

Азбаски корбарон нисбат ба чатҳо хеле камтаранд, барои захира кардани дархостҳои диски дастрасии тасодуфӣ дар муҳаррики чат, мо паёмҳоро дар муҳаррики корбар кэш мекунем.

Ҷустуҷӯи паёмҳо ҳамчун дархости диагоналӣ аз муҳаррики корбар ба ҳама мисолҳои чат-муҳаррики, ки чатҳои ин корбарро дар бар мегиранд, амалӣ карда мешавад. Натиҷаҳо дар худи муҳаррики корбар муттаҳид карда мешаванд.

Хуб, ҳама тафсилот ба инобат гирифта шуданд, танҳо гузаштан ба нақшаи нав аст - ва беҳтараш бидуни он ки корбарон онро пайхас накунанд.

Муҳоҷирати маълумот

Ҳамин тавр, мо як муҳаррики матние дорем, ки паёмҳоро аз ҷониби корбар нигоҳ медорад ва ду кластер чат-аъзоён ва аъзо-чатҳо, ки маълумотро дар бораи утоқҳои бисёрчат ва корбарони онҳо нигоҳ медоранд. Чӣ тавр аз ин ба муҳаррики нави корбар ва чат-муҳаррик гузаштан мумкин аст?

аъзо-чатҳо дар схемаи кӯҳна асосан барои оптимизатсия истифода мешуданд. Мо зуд маълумоти заруриро аз он ба чат-аъзоён интиқол додем ва он гоҳ дигар дар раванди муҳоҷират иштирок накард.

Навбат барои аъзоёни чат. Он 100 мисолро дар бар мегирад, дар ҳоле ки чат-муҳаррик 4 ҳазор дорад. Барои интиқоли маълумот, шумо бояд онро мувофиқат кунед - барои ин, аъзоёни чат ба ҳамон 4 ҳазор нусха тақсим карда шуданд ва сипас дар муҳаррики чат хондани binlog-аъзоёни чат фаъол карда шуд.
Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед
Ҳоло чат-муҳаррик дар бораи чанд чат аз аъзои чат медонад, аммо дар бораи муколама бо ду ҳамсӯҳбат ҳанӯз чизе намедонад. Чунин муколамаҳо дар муҳаррики матн бо истинод ба корбарон ҷойгир шудаанд. Дар ин ҷо мо маълумотро "сар-ба" гирифтем: ҳар як муҳаррики чат аз ҳама мисолҳои муҳаррики матн пурсид, ки оё онҳо муколамаи лозимиро доранд.

Аҷоиб - муҳаррики чат медонад, ки чатҳои чандчатӣ вуҷуд доранд ва медонад, ки кадом муколамаҳо вуҷуд доранд.
Ба шумо лозим аст, ки паёмҳоро дар чатҳои бисёрчатӣ якҷоя кунед, то дар ҳар як чат рӯйхати паёмҳо пайдо шавад. Аввалан, муҳаррики чат аз муҳаррики матнӣ ҳамаи паёмҳои корбарро аз ин чат мегирад. Дар баъзе мавридҳо шумораи онҳо хеле зиёд аст (то садҳо миллионҳо), аммо ба истиснои истисноҳои хеле кам чат комилан ба RAM мувофиқат мекунад. Мо паёмҳои бетартиб дорем, ки ҳар яки онҳо дар якчанд нусха - дар ниҳоят, онҳо ҳама аз мисолҳои муҳаррики матнии мувофиқ ба корбарон гирифта шудаанд. Ҳадаф аз он иборат аст, ки паёмҳо ҷудо карда, аз нусхаҳое, ки фазои нолозимро ишғол мекунанд, халос шаванд.

Ҳар як паём тамғаи вақт дорад, ки вақти фиристодани он ва матнро дар бар мегирад. Мо вақтро барои мураттабкунӣ истифода мебарем - мо нишондодҳоро ба қадимтарин паёмҳои иштирокчиёни мултичат ҷойгир мекунем ва хэшҳоро аз матни нусхаҳои пешбинишуда муқоиса карда, ба сӯи афзоиши тамғаи вақт ҳаракат мекунем. Мантиқӣ аст, ки нусхаҳо як ҳеш ва тамғаи вақт доранд, аммо дар амал ин на ҳамеша чунин аст. Тавре ки шумо дар хотир доред, синхронизатсия дар схемаи кӯҳна аз ҷониби PHP анҷом дода мешуд ва дар ҳолатҳои кам, вақти фиристодани як паём дар байни корбарони гуногун фарқ мекард. Дар ин ҳолатҳо, мо ба худ иҷозат додем, ки тамғаи вақтро таҳрир кунем - одатан дар давоми як сония. Мушкилоти дуюм ин тартиби гуногуни паёмҳо барои гирандагони гуногун мебошад. Дар чунин мавридҳо мо иҷозат додем, ки нусхаи иловагӣ бо имконоти гуногуни фармоиш барои корбарони гуногун эҷод карда шавад.

Пас аз ин, маълумот дар бораи паёмҳо дар multichat ба муҳаррики корбар фиристода мешавад. Ва дар ин ҷо як хусусияти ногувори паёмҳои воридотӣ меояд. Дар кори муқаррарӣ, паёмҳое, ки ба муҳаррик меоянд, аз ҷониби user_local_id ба таври қатъӣ бо тартиби афзоиш фармоиш дода мешаванд. Паёмҳое, ки аз муҳаррики кӯҳна ба муҳаррики корбар ворид карда шудаанд, ин амволи муфидро аз даст доданд. Ҳамзамон, барои роҳати санҷиш, шумо бояд ба онҳо зуд дастрасӣ пайдо кунед, дар онҳо чизе ҷустуҷӯ кунед ва навашро илова кунед.

Мо сохтори махсуси маълумотро барои нигоҳ доштани паёмҳои воридшуда истифода мебарем.

Он вектори андозаро ифода мекунад Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монедҳама куҷост Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед - гуногунанд ва бо тартиби камшавӣ, бо тартиби махсуси элементҳо тартиб дода мешаванд. Дар ҳар як сегмент бо индексҳо Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед элементҳо мураттаб карда мешаванд. Ҷустуҷӯи элемент дар чунин сохтор вақт мегирад Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед через Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед ҷустуҷӯҳои дуӣ. Илова кардани элемент аз болои амортизатсия карда мешавад Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед.

Ҳамин тавр, мо фаҳмидем, ки чӣ гуна маълумотро аз муҳаррикҳои кӯҳна ба нав интиқол додан мумкин аст. Аммо ин раванд чанд рӯзро мегирад - ва гумон аст, ки дар ин рӯзҳо корбарони мо одати навиштан ба ҳамдигарро тарк кунанд. Барои он ки дар ин муддат паёмҳоро гум накунем, мо ба нақшаи корӣ мегузарем, ки ҳам кластерҳои кӯҳна ва ҳам навро истифода мебарад.

Маълумот ба чат-аъзоён ва муҳаррики корбар навишта мешавад (на ба муҳаррики матн, чунон ки дар кори муқаррарӣ аз рӯи схемаи кӯҳна). муҳаррики корбар дархостро ба муҳаррики чат прокси мекунад - ва дар ин ҷо рафтор аз он вобаста аст, ки ин чат аллакай якҷоя карда шудааст ё не. Агар чат то ҳол муттаҳид нашуда бошад, муҳаррики чат паёмро ба худ наменависад ва коркарди он танҳо дар муҳаррики матн сурат мегирад. Агар чат аллакай ба муҳаррики чат муттаҳид шуда бошад, он chat_local_id-ро ба муҳаррики корбар бармегардонад ва паёмро ба ҳамаи гирандагон мефиристад. муҳаррики корбар ҳама маълумотро ба муҳаррики матн прокси мекунад - то ки агар чизе рӯй диҳад, мо ҳамеша метавонем, ки ҳама маълумоти ҷорӣ дар муҳаррики кӯҳна дошта бошем, баргардем. муҳаррики матн user_local_id-ро бар мегардонад, ки муҳаррики корбар онро нигоҳ медорад ва ба ақиб бармегардад.
Пойгоҳи паёмҳои ВКонтактеро аз сифр дубора нависед ва зинда монед
Дар натиҷа, раванди гузариш чунин менамояд: мо кластерҳои холии корбар-муҳаррик ва чат-муҳаррикро пайваст мекунем. chat-engine тамоми binlog-и чат-аъзоёнро мехонад, пас проксиинг мувофиқи нақшаи дар боло тавсифшуда оғоз мешавад. Мо маълумоти кӯҳнаро интиқол медиҳем ва ду кластери ҳамоҳангшуда (кӯҳна ва нав) мегирем. Танҳо ин аст, ки хондан аз муҳаррики матн ба муҳаррики корбар гузаред ва проксиро хомӯш кунед.

натиҷаҳои

Ба шарофати муносибати нав, тамоми нишондиҳандаҳои кори муҳаррикҳо такмил дода шуданд ва мушкилот бо мувофиқати маълумот ҳал карда шуданд. Акнун мо метавонем ба зудӣ хусусиятҳои навро дар паёмҳо татбиқ кунем (ва аллакай ба ин кор шурӯъ кардем - мо шумораи максималии иштирокчиёни чатро зиёд кардем, ҷустуҷӯи паёмҳои ирсолшударо амалӣ кардем, паёмҳои pinnedро оғоз кардем ва маҳдудияти шумораи умумии паёмҳоро барои як корбар зиёд кардем) .

Тағирот дар мантиқ воқеан бузурганд. Ва ман мехоҳам қайд намоям, ки ин на ҳамеша маънои рушди солҳои тӯлонӣ аз ҷониби як дастаи бузург ва шумораи зиёди сатрҳои кодро дорад. чат-муҳаррик ва корбар-муҳаррик дар якҷоягӣ бо ҳама ҳикояҳои иловагӣ ба монанди Ҳуффман барои фишурдани паёмҳо, дарахтони Splay ва сохтори паёмҳои воридотӣ камтар аз 20 ҳазор сатри код аст. Ва онҳоро 3 таҳиягар дар тӯли 10 моҳ навиштаанд (аммо, бояд дар хотир дошт, ки ҳама се таҳиякунанда - чемпионҳои ҷаҳон дар барномасозии варзиш).

Гузашта аз ин, ба ҷои ду баробар зиёд кардани шумораи серверҳо, мо шумораи онҳоро ду баробар кам кардем - ҳоло муҳаррики корбар ва чат дар 500 мошини физикӣ зиндагӣ мекунанд, дар ҳоле ки схемаи нав барои сарборӣ майдони калон дорад. Мо барои тачхизот маблаги зиёдеро сарфа кардем — такрибан 5 миллион доллар + 750 хазор доллар дар як сол аз харочоти амалиёт.

Мо саъю кушиш менамоем, ки роххои бехтарини халли проблемахои мураккабтарин ва микьёсан калонро пайдо кунем. Мо шумораи зиёди онҳо дорем - ва аз ин рӯ мо дар шӯъбаи пойгоҳи додаҳо таҳиягарони боистеъдод меҷӯем. Агар шумо дӯст медоред ва донед, ки чӣ гуна ҳалли ин гуна мушкилотро донед, дар бораи алгоритмҳо ва сохторҳои додаҳо дониши аъло дошта бошед, мо шуморо ба даста даъват мекунем. Бо мо тамос гиред HRбарои тафсилот.

Ҳатто агар ин ҳикоя дар бораи шумо набошад ҳам, лутфан қайд кунед, ки мо тавсияҳоро қадр мекунем. Ба дӯстатон дар бораи он нақл кунед ҷойҳои холии таҳиягарон, ва агар вай мухлати озмоишро бомуваффакият анчом дихад, ба шумо 100 хазор сум мукофотпулй дода мешавад.

Манбаъ: will.com

Илова Эзоҳ