Дар як сол як маротиба, дар соли 2015, мо ғамхорӣ мекардем, ки як метрика, ки интерфейси замимаи мо то чӣ андоза ақиб мемонад. Мо ин корро на танҳо кардем. Мо дар бораи он, ки баъзан барнома ҷавоб додан ба амалҳои корбарро қатъ мекунад: тугмаҳо пахш карда намешаванд, рӯйхатҳо ҳаракат намекунанд ва ғ. Дар бораи механикаи ченкунй гуфт дар AvitoTech, бинобар ин ман танҳо тартиби рақамҳоро медиҳам.
Натичаи ченкунй барои мо души хунук гардид. Маълум шуд, ки мушкилиҳое, ки дар натиҷаи яхбандӣ ба вуҷуд меоянд, аз ҳама чизи дигар хеле зиёданд. Агар пеш аз фахмидани ин факт, нишондихандаи асосии техникии сифат рафъ бошад, пас пас аз фокус иваз кард дар яхдон озод.
Сохтмон панели асбобҳо бо яхбандӣ ва сарф карда миқдорӣ и сифат Таҳлили сабабҳои онҳо, душмани асосӣ маълум шуд - мантиқи вазнини тиҷоратӣ, ки дар риштаи асосии барнома иҷро мешавад. Вокуниши табиӣ ба ин нангин як хоҳиши сӯзон барои ба ҷараёнҳои корӣ андохтани он буд. Барои ҳалли муназзами ин мушкилот, мо ба меъмории бисёрсоҳавӣ, ки ба актёрҳои сабук асос ёфтааст, муроҷиат кардем. Ман мутобиқсозии ӯро барои ҷаҳони iOS бахшидам ду ришта дар твиттери коллективй ва мақола дар бораи Habre. Ҳамчун як қисми ҳикояи ҷорӣ, ман мехоҳам он ҷанбаҳои қарорро, ки ба интихоби пойгоҳи додаҳо таъсир расониданд, таъкид намоям.
Модели актёрии ташкили система тахмин мекунад, ки бисёрсоҳавӣ моҳияти дуюми он мегардад. Объектҳои модели дар он убур кардани сарҳадҳои риштаро дӯст медоранд. Ва ин корро на баъзан ва дар баъзе чойхо, балки кариб доимо ва дар хама чо мекунанд.
Пойгоҳи додаҳо яке аз ҷузъҳои асосии диаграммаи пешниҳодшуда мебошад. Вазифаи асосии он татбиқи намунаи макро мебошад Пойгоҳи додаҳои муштарак. Агар дар ҷаҳони корхона он барои ташкили ҳамоҳангсозии додаҳо байни хидматҳо истифода шавад, пас дар мавриди меъмории актёр маълумот байни риштаҳо. Ҳамин тариқ, ба мо чунин базае лозим буд, ки кор бо он дар муҳити бисёрсоҳавӣ ҳатто душвориҳои камтаринро ба вуҷуд намеорад. Аз ҷумла, ин маънои онро дорад, ки объектҳои аз он гирифташуда бояд ҳадди аққал аз ришта бехатар бошанд ва идеалӣ тамоман тағирёбанда нестанд. Тавре ки шумо медонед, охирин метавонад дар як вақт аз якчанд риштаҳо бидуни муроҷиат ба ҳама гуна қулфҳо истифода шавад, ки ба иҷроиш таъсири судманд мерасонад.
Омили дуввуми муҳиме, ки ба интихоби пойгоҳи додаҳо таъсир расонд, API абрии мо буд. Он аз равиши git ба синхронизатсия илҳом гирифта шудааст. Монанди ӯ мо ҳадаф доштем офлайн аввалин API, ки барои муштариёни абрӣ бештар мувофиқ аст. Тахмин карда мешуд, ки онҳо танҳо як маротиба ҳолати пурраи абрро хориҷ мекунанд ва сипас ҳамоҳангсозӣ дар аксари ҳолатҳо тавассути тағирот ба амал меояд. Афсӯс, ки ин имкон танҳо дар минтақаи назариявӣ мавҷуд аст ва дар амал муштариён чӣ гуна кор карданро бо часпакҳо ёд нагирифтаанд. Ин як катор сабабхои объективй дорад, ки мо барои кашол надодан ба чорй намудани он аз кавс берун мемонем. Акнун хеле ҷолибтар натиҷаҳои дарс дар бораи он чӣ рӯй медиҳад, вақте ки API "A" гуфт ва истеъмолкунандаи он "B" нагуфт.
Ҳамин тавр, агар шумо git-ро тасаввур кунед, ки ҳангоми иҷрои фармони кашидан, ба ҷои татбиқи часпакҳо ба акси маҳаллӣ, ҳолати пурраи онро бо сервери пурра муқоиса мекунад, пас шумо дар бораи синхронизатсия тасаввуроти дақиқ хоҳед дошт. дар мизоҷони абрӣ рух медиҳад. Тахмин кардан осон аст, ки барои татбиқи он ду дарахти DOM-ро дар хотира бо мета-маълумот дар бораи ҳама сервер ва файлҳои маҳаллӣ ҷудо кардан лозим аст. Маълум мешавад, ки агар корбар 500 ҳазор файлро дар абр нигоҳ дорад, пас барои ҳамоҳангсозии он ду дарахти дорои 1 миллион гиреҳро аз нав сохтан ва нест кардан лозим аст. Аммо ҳар як гиреҳ маҷмӯи дорои графики зеробъектҳо мебошад. Дар ин замина, натиҷаҳои профилсозӣ интизор буданд. Маълум шуд, ки ҳатто бидуни ба назар гирифтани алгоритми муттаҳидшавӣ, худи тартиби эҷод ва сипас нобуд кардани миқдори зиёди объектҳои хурд як тини зеборо талаб мекунад.. Вазъият аз он сабаб бадтар мешавад, ки амалиёти асосии синхронизатсия ба миқдори зиёд дохил карда шудааст. аз скриптҳои корбар. Дар натиҷа, мо меъёри дуюми муҳимро ҳангоми интихоби пойгоҳи додаҳо муайян мекунем - қобилияти амалӣ кардани амалиёти CRUD бидуни тақсимоти динамикии объектҳо.
Коркарди бисёрҷониба. Бо хоҳиши истифодаи як мисоли пойгоҳи додаҳо барои ҳамоҳангсозии ҳолат на танҳо байни риштаҳо, балки байни замимаи асосӣ ва васеъшавии iOS.
Диаграммаи дар боло зикршуда нишон медиҳад, ки муқоисаи LMDB бо SQLite, ки сатҳҳои боз ҳам баландтарро амалӣ мекунад, одатан нисбат ба SQLite бо Data Core дурусттар нест. Иқтибос овардан аз як муҳаррикҳои нигоҳдорӣ ҳамчун рақибони баробар - BerkeleyDB, LevelDB, Sophia, RocksDB ва ғайра одилонатар мебуд. Ҳатто пешрафтҳое ҳастанд, ки LMDB ҳамчун ҷузъи муҳаррики нигоҳдорӣ барои SQLite амал мекунад. Аввалин чунин таҷриба дар соли 2012 сарф карданд муаллиф LMDB Ховард Чу. натиҷаҳои чунон чолиби диккат гардид, ки ташаббуси уро дустдорони ОССС ба даст гирифта, идомаи худро дар назди LumoSQL. Дар моҳи январи соли 2020 муаллифи ин лоиҳа Ден Ширер мебошад муаррифӣ намуд он дар LinuxConfAu.
Истифодаи асосии LMDB ҳамчун муҳаррик барои пойгоҳи додаҳои барномаҳо мебошад. Китобхона аз намуди зоҳирии худ аз таҳиягарон қарздор аст OpenLDAP, ки аз BerkeleyDB ҳамчун асоси лоиҳаи худ сахт норозӣ буданд. Аз китобхонаи хоксор дур шудан бтре, Ховард Чу муяссар гардид, ки яке аз альтернативахои машхуртарини замони моро ба вучуд оварад. Вай гузориши хеле ҷолиби худро ба ин ҳикоя ва инчунин ба сохтори дохилии LMDB бахшид. "Базаи махзани хотираи Lightning". Леонид Юрьев (ака йлео) аз Positive Technologies дар суханронии худ дар Highload 2015 "Муҳаррики LMDB қаҳрамони махсус аст". Дар он, ӯ дар бораи LMDB дар заминаи як вазифаи шабеҳи татбиқи ReOpenLDAP сӯҳбат мекунад ва LevelDB аллакай мавриди интиқоди муқоисавӣ қарор гирифтааст. Дар натиҷаи татбиқ, Positive Technologies ҳатто як штангаи фаъолона инкишофёфтаро ба даст овард MDBX бо хусусиятҳои хеле болаззат, оптимизатсия ва ислоҳи хатогиҳо.
LMDB аксар вақт ҳамчун нигаҳдорӣ истифода мешавад. Масалан, браузери Mozilla Firefox интихоб кард он барои як қатор ниёзҳо ва аз версияи 9, Xcode афзалият дода мешавад SQLite он барои нигоҳ доштани индексатсия.
Муҳаррик инчунин дар ҷаҳони рушди мобилӣ ҷалб карда шуд. Осори истифодаи он метавонад бошад ёфтед дар муштарии iOS барои Telegram. LinkedIn як қадам пеш рафт ва LMDB-ро ҳамчун нигаҳдории пешфарз барои чаҳорчӯбаи кэшкунии маълумотҳои худ, Rocket Data интихоб кард, ки дар бораи он гуфт дар як мақола дар соли 2016.
LMDB барои ҷой дар офтоб дар чароғе, ки BerkeleyDB пас аз гузариш таҳти назорати Oracle гузоштааст, бомуваффақият мубориза мебарад. Китобхонаро барои суръат ва эътимоднокии худ, ҳатто дар муқоиса бо навъи худ дӯст медоранд. Тавре ки шумо медонед, хӯроки нисфирӯзии ройгон вуҷуд надорад ва ман мехостам қайд намоям, ки шумо ҳангоми интихоби LMDB ва SQLite бо он дучор мешавед. Диаграммаи боло равшан нишон медиҳад, ки суръати афзоиш чӣ гуна ба даст оварда мешавад. Аввалан, мо барои қабатҳои иловагии абстраксия дар болои нигаҳдории диск пардохт намекунем. Албатта, дар меъмории хуб, шумо то ҳол бе онҳо кор карда наметавонед ва онҳо ногузир дар коди барнома пайдо мешаванд, аммо онҳо хеле лоғартар хоҳанд шуд. Онҳо хусусиятҳое надоранд, ки аз ҷониби як барномаи мушаххас талаб карда намешаванд, масалан, дастгирии дархостҳо дар забони SQL. Дуюм, имкон медиҳад, ки харитасозии амалиёти барномаҳо ба дархостҳо ба нигаҳдории диск ба таври оптималӣ амалӣ карда шавад. Агар SQLite дар кори ман Аз эҳтиёҷоти миёнаи як барномаи миёна бармеояд, пас шумо ҳамчун як таҳиягари барнома аз сенарияҳои асосии сарборӣ хуб медонед. Барои ҳалли самараноктар, шумо бояд ҳам барои таҳияи ҳалли ибтидоӣ ва ҳам дастгирии минбаъдаи он нархи баланд пардохт кунед.
3. Се наҳанг LMDB
Пас аз дидани LMDB аз нуқтаи назари парранда, вақти амиқтар рафтан аст. Се фасли оянда ба таҳлили китҳои асосӣ, ки меъмории нигаҳдорӣ ба он такя мекунад, бахшида мешавад:
Файлҳои харитаи хотира ҳамчун механизми кор бо диск ва ҳамоҳангсозии сохторҳои дохилии додаҳо.
Биёед таҳлили API-ро бо дидани абстраксияҳои асосии аз ҷониби LMDB пешниҳодшуда оғоз кунем: муҳити зист ва пойгоҳи додаҳо, калидҳо ва арзишҳо, транзаксияҳо ва курсорҳо.
Қайд дар бораи рӯйхати кодҳо
Ҳама функсияҳо дар API оммавии LMDB натиҷаи кори худро дар шакли коди хато бармегардонанд, аммо дар ҳама рӯйхатҳои минбаъда санҷиши он ба хотири мухтасар нест.Дар амал мо коди худро барои ҳамкорӣ бо анбор истифода бурдем. чангак Рамзҳои C++ lmdbxx, ки дар он хатогиҳо ҳамчун истисноҳои C++ амалӣ мешаванд.
Якум ин андозаи фазои суроғаи виртуалӣ мебошад, ки файли нигаҳдорӣ ба он харита шудааст. Мутаассифона, ҳатто дар як дастгоҳ, арзиши мушаххас метавонад аз давидан то иҷро ба таври назаррас фарқ кунад. Барои ба назар гирифтани ин хусусияти iOS, мо миқдори ниҳоии нигаҳдории динамикӣ интихоб мекунем. Аз арзиши муайян сар карда, он пай дар пай то функсия ду маротиба кам мешавад mdb_env_open ба ғайр аз ин натиҷае барнамегардонад ENOMEM. Дар назария, роҳи муқобил вуҷуд дорад - аввал ба муҳаррик ҳадди ақали хотира ҷудо кунед ва баъд ҳангоми гирифтани хатогиҳо MDB_MAP_FULL, зиёд кунед. Бо вуҷуди ин, он хеле сахттар аст. Сабаб дар он аст, ки тартиби remapping хотира бо истифода аз функсия mdb_env_set_map_size ҳамаи объектҳоро (курсорҳо, транзаксияҳо, калидҳо ва арзишҳо) аз муҳаррик қаблан гирифташударо беэътибор мекунад. Баҳисобгирии чунин гардиши ҳодисаҳо дар кодекс боиси мушкилии назарраси он мегардад. Агар, ба ҳар ҳол, хотираи виртуалӣ барои шумо хеле азиз аст, пас ин метавонад як сабаби назар кардан ба форте, ки хеле пеш рафтааст, бошад. MDBX, ки дар байни хусусиятҳои эълоншуда "тасҳеҳи автоматии андозаи пойгоҳи додаҳо" мавҷуд аст.
Параметри дуюм, ки арзиши пешфарз ба мо мувофиқ набуд, механизми таъмини бехатарии риштаро танзим мекунад. Мутаассифона, ҳадди аққал дар iOS 10, мушкилот бо дастгирии нигаҳдории маҳаллӣ вуҷуд доранд. Аз ин сабаб, дар мисоли боло, анбор бо парчам кушода мешавад MDB_NOTLS. Илова бар ин, он низ талаб карда мешавад чангак Сарпӯши C++ lmdbxxбарои буридани тағирёбандаҳо бо ва дар ин атрибут.
Департаментҳо
Пойгоҳи маълумот як мисоли алоҳидаи дарахти B мебошад, ки мо дар бораи он дар боло гуфта будем. Ифтитоҳи он дар дохили транзаксия рух медиҳад, ки дар аввал метавонад каме аҷиб ба назар расад.
MDB_txn *txn1, *txn2, *txn3;
MDB_val val;
// Открываем 2 транзакции, каждая из которых смотрит
// на версию базы данных с одной записью.
mdb_txn_begin(env, NULL, 0, &txn1); // read-write
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn2); // read-only
// В рамках первой транзакции удаляем из базы данных существующую в ней запись.
mdb_del(txn1, dbi, &key, NULL);
// Фиксируем удаление.
mdb_txn_commit(txn1);
// Открываем третью транзакцию, которая смотрит на
// актуальную версию базы данных, где записи уже нет.
mdb_txn_begin(env, NULL, MDB_RDONLY, &txn3);
// Убеждаемся, что запись по искомому ключу уже не существует.
assert(mdb_get(txn3, dbi, &key, &val) == MDB_NOTFOUND);
// Завершаем транзакцию.
mdb_txn_abort(txn3);
// Убеждаемся, что в рамках второй транзакции, открытой на момент
// существования записи в базе данных, её всё ещё можно найти по ключу.
assert(mdb_get(txn2, dbi, &key, &val) == MDB_SUCCESS);
// Проверяем, что по ключу получен не абы какой мусор, а валидные данные.
assert(*(int *)val.mv_data == 997);
// Завершаем транзакцию, работающей хоть и с устаревшей, но консистентной базой данных.
mdb_txn_abort(txn2);
Ихтиёрӣ, ман тавсия медиҳам, ки ҳамон ҳилларо бо SQLite санҷед ва бубинед, ки чӣ мешавад.
Multiversioning ба ҳаёти як таҳиягари iOS манфиатҳои хеле хуб меорад. Бо истифода аз ин амвол, шумо метавонед ба осонӣ ва табиатан суръати навсозии манбаи маълумотро барои шаклҳои экран дар асоси мулоҳизаҳои таҷрибаи корбар танзим кунед. Масалан, биёед чунин хусусияти замимаи Mail.ru Cloud-ро ба мисли худборкунии мундариҷа аз галереяи медиаи система гирем. Бо пайвасти хуб, муштарӣ метавонад дар як сония ба сервер якчанд акс илова кунад. Агар шумо пас аз ҳар боргирӣ навсозӣ кунед UICollectionView бо мундариҷаи медиавӣ дар абри корбар, шумо метавонед дар бораи 60 fps ва ҳаракати ҳамвор дар ин раванд фаромӯш кунед. Барои пешгирӣ кардани навсозии зуд-зуд экран, шумо бояд суръати тағири маълумотро дар асос маҳдуд кунед UICollectionViewDataSource.
Агар базаи маълумот мултипликатсияро дастгирӣ накунад ва ба шумо имкон диҳад, ки танҳо бо ҳолати кунунӣ кор кунед, пас барои эҷоди як акси маълумот дар вақти мӯътадил, шумо бояд онро ба ягон сохтори маълумот дар хотира ё ба ҷадвали муваққатӣ нусхабардорӣ кунед. Ҳар яке аз ин равишҳо хеле гарон аст. Дар ҳолати нигоҳдории хотира, мо ҳам хароҷоти хотираро, ки аз нигоҳдории объектҳои сохташуда ба вуҷуд омадаанд ва хароҷоти вақти марбут ба тағирёбии зиёдатии ORM мегирем. Дар мавриди мизи муваққатӣ, ин як лаззати боз ҳам гаронтар аст, ки танҳо дар ҳолатҳои ночиз маъно дорад.
int compare(MDB_val * const a, MDB_val * const b) {
NodeKey aKey, bKey;
memcpy(&aKey, a->mv_data, a->mv_size);
memcpy(&bKey, b->mv_data, b->mv_size);
return // ...
}
Роҳи алтернативӣ ин аст, ки пешакӣ огоҳ созед, ки сохторҳои дорои калид ва арзиш бо истифода аз атрибут мувофиқ карда намешаванд. aligned(1). Дар ARM низ ҳамин таъсир метавонад бошад барои расидан ба ҳадаф ва бо истифода аз атрибути бастабандишуда. Бо назардошти он, ки он инчунин ба оптимизатсияи фазои ишғолкардаи сохтор мусоидат мекунад, ин усул ба назари ман афзалтар ба назар мерасад, гарчанде ки приводит барои зиёд кардани арзиши амалиёти дастрасии маълумот.
Агар сарҳади болоии гурӯҳи калидҳо пайдо шавад, мо онро такрор мекунем, то он даме ки мо вохӯрем ё калид бо дигаре parentId, ё калидҳо тамоман тамом намешаванд
do {
rc = mdb_cursor_get(cursor, &key, &value, MDB_NEXT);
// processing...
} while (MDB_NOTFOUND != rc && // check end of table
IsTargetKey(key)); // check end of keys group
Чӣ хуб аст, ҳамчун як қисми такрор бо истифода аз mdb_cursor_get, мо на танҳо калид, балки арзишро низ ба даст меорем. Агар барои иҷрои шартҳои интихоб, аз ҷумла, майдонҳоро аз қисми арзиши сабт тафтиш кардан лозим бошад, пас онҳо бе имову ишораи иловагӣ ба худашон комилан дастрасанд.
4.3. Моделсозии муносибатҳои байни ҷадвалҳо
То имрӯз, мо тавонистем, ки тамоми ҷанбаҳои тарҳрезӣ ва кор бо базаи як ҷадвалро баррасӣ кунем. Мо гуфта метавонем, ки ҷадвал маҷмӯи сабтҳои мураттабшуда мебошад, ки аз ҷуфтҳои калид-арзишҳои як навъ иборат аст. Агар шумо калидро ҳамчун росткунҷа ва арзиши алоқаманди онро ҳамчун қуттӣ нишон диҳед, шумо диаграммаи визуалии пойгоҳи додаҳоро мегиред.
"Озодӣ" дар мобил
Бо вуҷуди ин, дар ҳаёти воқеӣ бо хуни кам ба даст овардан хеле кам имконпазир аст. Аксар вақт дар базаи маълумотҳо, аввалан, доштани якчанд ҷадвалҳо ва дуюм, дар онҳо бо тартиби аз калиди ибтидоӣ фарқкунанда анҷом додани интихобҳо талаб карда мешавад. Ин бахши охирин ба масъалаҳои эҷод ва пайвастагии онҳо бахшида шудааст.
Мо ба натиҷаҳои татбиқи LMDB мусбат баҳо медиҳем. Пас аз он, шумораи яхкунии барномаҳо 30% кам шуд.
Натичахои кори ичрошуда берун аз командаи iOS чавоб пайдо карданд. Дар айни замон, яке аз бахшҳои асосии "Файлҳо" дар замимаи Android низ ба истифодаи LMDB гузаштааст ва қисматҳои дигар дар роҳ ҳастанд. Забони Си, ки дар он нигаҳдории арзишҳои калидӣ амалӣ карда мешавад, кӯмаки хубе буд, то дар аввал барномаро дар атрофи платформаи кросс-платформа дар забони C ++ пайваст кунад. Барои пайвасти бефосилаи китобхонаи C++ бо рамзи платформа дар Objective-C ва Kotlin, генератори код истифода шуд Ҷиннӣ аз Dropbox, аммо ин як ҳикояи дигар аст.