Најбоље праксе за поновно коришћење контејнера ламбда АВС

Оптимизација топлих покрета приликом повезивања АВС Ламбда са осталим услугама

АВС Ламбда пружа велику скалабилност захваљујући томе што је без сервера и без стања стања, омогућавајући да се многе копије ламбда функције одмах роде (као што је овде описано). Међутим, приликом писања кода апликације вероватно ћете желети приступ неким државним подацима. То значи да се повезује у податковну трговину, као што је РДС инстанца или С3. Међутим, повезивање са другим сервисима компаније АВС Ламбда додаје време вашем коду функције. Могуће су и нуспојаве од велике скалабилности, попут достизања максималног броја дозвољених веза са РДС инстанцом. Једна од могућности да се томе супротстави је коришћење поновне употребе контејнера у АВС Ламбда како би се наставила веза и смањило време рада ламбде.

Овде су приказани неки корисни дијаграми који објашњавају животни циклус ламбда захтева.

Следеће се догађају током хладног старта, када се функција активира први пут или после периода неактивности:

  • Код и зависности се преузимају.
  • Покреће се нови контејнер.
  • Рунтиме се покреће.

Завршна радња је покретање кода, што се догађа сваки пут када се активира ламбда функција. Ако се спремник поново користи за накнадно позивање ламбда функције, можемо прескочити на почетак покретања кода. То се назива топли почетак, а ово је корак који можемо оптимизирати приликом повезивања на друге услуге дефинирањем везе изван опсега методе обрађивача.

Повезивање са осталим АВС услугама компаније Ламбда

Пример: Спајање на инстанцу РДС, АВС иконе добивене одавде

Имамо основни и уобичајени пример кроз који желимо проћи - желимо се повезати са ресурсом контејнера како бисмо преузели податке о обогаћивању. У овом примјеру, ЈСОН корисни терет долази с ИД-ом и Ламбда функција се повезује на РДС инстанцу која покреће ПостгреСКЛ како би пронашла одговарајуће име ИД-а како бисмо могли вратити обогаћени корисни терет. Будући да се ламбда функција повезује са РДС-ом који живи у ВПЦ-у, ламбда функција сада треба да живи и у приватној подмрежи. Ово додаје неколико корака хладном старту - ВПЦ еластични мрежни интерфејс (ЕНИ) треба да буде прикључен (као што је споменуто у блогу Јеремија Далија, ово додаје време вашим хладним стартовима).

Напомена: могли бисмо избећи употребу ВПЦ ако бисмо користили складиште кључа / вредности са ДинамоДБ уместо РДС-а.

Прећи ћу преко два решења овог задатка, прво је моје „наивно“ решење, док друго решење оптимизује за топла времена почетка коришћењем везе за накнадне призиве. Затим ћемо упоредити перформансе сваког решења.

Опција 1 - Повежите се са РДС-ом у уређају за управљање

Овај пример кода показује како могу наивно приступити овом задатку - веза базе података је у оквиру методе обрађивача. Постоји једноставан одабир упита за дохваћање имена ИД пре враћања корисног терета, који сада укључује и име.

Погледајмо како функционише ова опција током малог теста са бројем 2000 позива са истовременошћу од 20. Минимално трајање је 18 мс са просеком 51 мс и нешто више од 1 секунде максимално (трајање хладног старта).

Трајање ламбде

Графикон у наставку показује да постоји највећи број осам веза са базом података.

Број веза са РДС базом података у прозору за 5 минута.

Опција 2 - Користите глобалну везу

Друга опција је да се веза дефинише као глобална изван методе обрађивача. Затим унутар алата за обраду додамо чек да видимо да ли веза постоји и повежемо се само ако нема. То значи да се веза врши само једном по контејнеру. Постављање везе на овај начин са условним на месту значи да не треба да успостављамо везу ако то не захтева логика кода.

Више не затварамо везу с базом података, тако да веза остаје за накнадно позивање функције. Поновна употреба везе значајно смањује топло време стартовања - просечно трајање је приближно 3 пута брже, а минимално 1 мс, а не 18 мс.

Ламбда Дуратионс

Повезивање са РДС инстанцом је дуготрајан задатак, а не мора се повезивати за сваку призивање корисно за перформансе. Приликом повезивања са базом података за једноставан упит базе података постижемо максимални број веза базе података 20, што одговара нивоу истовремености (извршили смо 20 истодобних позива 100 пута). Када се прекид позива приказе заустави, везе се постепено затварају.

Сада када је АВС повећао ламбда трајање до 15 минута, то значи да би везе базе података могле да трају дуже и да бисте могли бити у опасности да постигнете максимални број РДС веза. Подразумеване макс. Везе могу се пребрисати у подешавањима групе РДС параметара, мада повећавање максималног броја веза може довести до проблема са додељивањем меморије. Мањи инстанци могу имати подразумевану вредност мак_цоннецтионс мању од 100. Имајте на уму ове границе и додајте само логику апликације да бисте се повезали са базом података када је то потребно.

Кориштење глобалне везе за друге задатке

Ламбда се повезује на С3

Чест задатак који бисмо можда требали да обавимо са Ламбда је приступ државним подацима из С3. Исјечак кода у наставку је нацрт софтвера Питхон Ламбда Фунцтион који пружа АВС - до којег се можете кретати тако што ћете се пријавити на АВС конзолу и кликнути овде. У коду можете видети да је С3 клијент потпуно дефинисан изван обрађивача када се спремник иницијализира, док је за пример РДС-а постављена глобална веза унутар управљача. Оба приступа ће поставити глобалне варијабле које ће им бити доступне за наредне призиве.

исјечак кода нацрта ламбда с3-гет-објецт хттпс://цонсоле.авс.амазон.цом/ламбда/хоме?регион=ус-еаст-1#/цреате/нев?бп=с3-гет-објецт-питхон

Дешифрирање променљивих околине

Ламбда конзола вам даје могућност шифрирања ваших променљивих околине ради додатне сигурности. Следећи исјечак кода је АВС-ов пример Јава-помоћног скрипта за дешифровање променљивих окружења из функције Ламбда. Можете се кретати до исјечка кода слиједећи овај водич (тачније 6. корак). Пошто је ДЕЦРИПТЕД_КЕИ дефинисана као класа глобал, функција и логика децриптКеи () се позивају само једном по ламбда контејнеру. Стога ћемо видети значајно побољшање у дугим вековима трајања топлог старта.

хттпс://цонсоле.авс.амазон.цом/ламбда/хоме?регион=ус-еаст-1#/фунцтионс и хттпс://доцс.авс.амазон.цом/ламбда/латест/дг/туториал-енв_цонсоле.хтмл

Коришћење глобалних променљивих у другим ФааС решењима

Овај приступ није изолиран од АВС Ламбда. Метода коришћења глобалне везе може се применити и на функције без сервера других провајдера у облаку. Страница са савјетима и триковима за Гоогле Цлоуд Фунцтионс даје добро објашњење непроменљивих варијабли (када се варијабла увијек иницијализира изван методе обрађивача) насупрот лази варијаблама (глобална варијабла се поставља само кад је потребно) глобалних варијабли.

Остале најбоље праксе

Ево још неколико најбољих пракси које треба имати на уму.

Тестирање

Употреба ФааС-а олакшава архитектуру микросервиса. А мали, дискретни делови функционалности иду руку под руку са ефикасним тестирањем јединица. Да бисте помогли тестирање јединице:

  • Не заборавите да из ламбда пакета искључите тестне зависности.
  • Одвојите логику даље од методе обрађивача, као што бисте то учинили с главном методом програма.

Зависности и величина пакета

Смањење величине пакета за имплементацију значи да ће преузимање кода бити брже код иницијализације, а самим тим ће побољшати ваша хладна времена. Уклоните неискориштене библиотеке и мртви код да бисте смањили величину ЗИП датотеке за имплементацију. АВС СДК је предвиђен за Питхон и ЈаваСцрипт током извођења, тако да нема потребе да их укључујете у свој пакет за имплементацију.

Ако је Ноде.јс ваше преферирано време рада Ламбда, можете применити модификацију и углификацију да бисте смањили величину свог функцијског кода и умањили величину вашег пакета за размештање. Неки, али не сви аспекти минимизације и углификације, могу се применити на друге време извођења, нпр. не можете уклонити бели простор из питхон кода, али можете уклонити коментаре и скратити имена променљивих.

Подешавање меморије

Експериментирајте да бисте пронашли оптималну количину меморије за Ламбда функцију. Плаћате за доделу меморије, тако да удвостручење меморије значи да морате платити дупло по милисекунди; али рачунски капацитет се повећава с додељеном меморијом тако да потенцијално може смањити трајање рада на мање од половине онога што је било. Већ постоје неки корисни алати за избор оптималне поставке меморије за вас, попут ове.

Закључити…

Једна ствар коју треба узети у обзир је да ли је неопходна примјена методе поновне употребе везе. Ако се на вашу ламбда функцију само ретко позива, на пример једном дневно, тада нећете имати користи од оптимизације за топле стартове. Често се ради о компромису између оптимизације за рад у односу на читљивост вашег кода - израз „углификација“ говори сам за себе! Поред тога, додавање глобалних променљивих у ваш код за поновну употребу веза са другим сервисима потенцијално може отежати ваш код. У обзир долазе два питања:

  • Да ли ће нови члан тима разумети ваш код?
  • Да ли ћете убудуће моћи да исправите погрешку у коду и вашем тиму?

Али вјероватно је да сте одабрали Ламбда за њену размјеру и желите високе перформансе и ниске трошкове, па пронађите баланс који одговара потребама вашег тима.

Ова мишљења су мишљења аутора. Ако у овом посту није другачије наведено, Цапитал Оне није повезан са њим нити га подржава било која од наведених компанија. Сви жигови и друга интелектуална својина која се користе или приказују власништво су њихових власника. Овај чланак је © 2019 Цапитал Оне.