Добре, значи попаднахте на ключов момент при използването на „нотацията с голямо О“. Това е едно измерение, което със сигурност може да ви ухапе в задната част, ако не обръщате внимание. Има и други измерения, които някои хора не виждат през очилата с „голямото О“ (но ако се вгледате по-отблизо, те наистина са).
Прост пример за това измерение е присъединяване към база данни. Има "най-добри практики" при конструирането, да речем, на ляво вътрешно съединение, което ще помогне за по-ефективното изпълнение на sql. Ако разбиете релационното смятане или дори погледнете план за обяснение (Oracle), можете лесно да видите кои индекси се използват в какъв ред и дали се извършват някакви сканирания на таблици или вложени операции.
Концепцията за профилиране също е ключова. Трябва да имате задълбочени инструменти и с правилната детайлност във всички движещи се части на архитектурата, за да идентифицирате и коригирате всички неефективности. Да кажем например, че изграждате 3-степенно, многонишково, MVC2 уеб-базирано приложение с либерално използване на AJAX и обработка от страна на клиента заедно с OR Mapper между вашето приложение и DB. Опростеният линеен единичен поток на заявка/отговор изглежда така:
browser -> web server -> app server -> DB -> app server -> XSLT -> web server -> browser JS engine execution & rendering
Трябва да имате някакъв метод за измерване на производителността (времена за реакция, производителност, измерена в „неща за единица време“ и т.н.) във всяка от тези отделни области, не само на ниво кутия и операционна система (CPU, памет, диск i/o, и т.н.), но специфични за услугата на всяко ниво. Така че на уеб сървъра ще трябва да знаете всички броячи за уеб сървъра, който използвате. В нивото на приложението ще имате нужда от това плюс видимост във всяка виртуална машина, която използвате (jvm, clr, каквото и да е). Повечето OR съпоставители се проявяват във виртуалната машина, така че се уверете, че обръщате внимание на всички специфики, ако те са видими за вас на този слой. Вътре в DB ще трябва да знаете всичко, което се изпълнява, и всички специфични параметри за настройка за вашия вкус на DB. Ако имате големи пари, BMC Patrol е доста добър залог за повечето от тях (с подходящи модули за знания (KM)). В евтиния край със сигурност можете да навиете свой собствен, но пробегът ви ще варира в зависимост от дълбочината ви на опит.
Ако приемем, че всичко е синхронно (не се случват неща, базирани на опашка, които трябва да изчакате), има много възможности за проблеми с производителността и/или скалируемостта. Но тъй като публикацията ви е за мащабируемост, нека игнорираме браузъра, с изключение на всички отдалечени XHR извиквания, които ще извикат друга заявка/отговор от уеб сървъра.
И така, предвид този проблемен домейн, какви решения бихте могли да вземете, за да помогнете с мащабируемостта?
Обработка на връзката. Това също е свързано с управлението на сесията и удостоверяването. Това трябва да е възможно най-изчистено и леко, без да компрометира сигурността. Метриката е максимален брой връзки за единица време.
Срив на сесията на всяко ниво. Необходимо или не? Предполагаме, че всяко ниво ще бъде клъстер от кутии хоризонтално под някакъв механизъм за балансиране на натоварването. Балансирането на натоварването обикновено е много леко, но някои реализации на сесия при отказ могат да бъдат по-тежки от желаното. Също така дали работите със залепващи сесии може да повлияе на вашите опции по-дълбоко в архитектурата. Също така трябва да решите дали да свържете уеб сървър към конкретен сървър на приложения или не. В света на отдалечените .NET вероятно е по-лесно да ги свържете заедно. Ако използвате стека на Microsoft, може да е по-мащабируемо да направите 2-степенно (прескочете отдалеченото), но трябва да направите значителен компромис със сигурността. От страна на java винаги съм го виждал поне 3-степенно. Няма причина да го правим по друг начин.
Обектна йерархия. Вътре в приложението се нуждаете от възможно най-чистата структура на обекта с най-леко тегло. Носете данните, от които се нуждаете, само когато имате нужда от тях. Яростно изтрийте всяко ненужно или излишно получаване на данни.
ИЛИ неефективност на картографа. Има несъответствие на импеданса между обектния дизайн и релационния дизайн. Конструкцията много към много в RDBMS е в пряк конфликт с йерархиите на обекти (person.address срещу location.resident). Колкото по-сложни са вашите структури от данни, толкова по-малко ефективен ще бъде вашият ИЛИ картограф. В даден момент може да се наложи да пресечете стръвта в еднократна ситуация и да направите по-...ъъъ...примитивен подход за достъп до данни (съхранена процедура + слой за достъп до данни), за да изтръгнете повече производителност или мащабируемост от конкретно грозен модул. Разберете свързаните с това разходи и вземете съзнателно решение.
XSL трансформира. XML е прекрасен, нормализиран механизъм за пренос на данни, но човече може ли да бъде куче с огромна производителност! В зависимост от това колко данни носите със себе си и кой синтаксичен анализатор изберете и колко сложна е структурата ви, можете лесно да се оцветите в много тъмен ъгъл с XSLT. Да, академично това е брилянтно чист начин за създаване на презентационен слой, но в реалния свят може да има катастрофални проблеми с производителността, ако не обърнете специално внимание на това. Виждал съм система да изразходва над 30% от времето за транзакция само в XSLT. Не е добре, ако се опитвате да увеличите 4 пъти потребителската база, без да купувате допълнителни кутии.
Можете ли да си купите изход от задръстване с мащабируемост? Абсолютно. Гледал съм как се случва повече пъти, отколкото бих искал да призная. Законът на Мур (както вече споменахте) е валиден и днес. Имайте малко допълнителни пари под ръка за всеки случай.
Кеширането е чудесен инструмент за намаляване на напрежението върху двигателя (увеличаването на скоростта и пропускателната способност е удобен страничен ефект). Това обаче има цена по отношение на отпечатъка на паметта и сложността при обезсилване на кеша, когато е остарял. Моето решение би било да започна напълно чисто и бавно да добавя кеширане само там, където решите, че е полезно за вас. Твърде много пъти сложността се подценява и това, което е започнало като начин за отстраняване на проблеми с производителността, се оказва, че причинява функционални проблеми. Също така, обратно към коментара за използването на данни. Ако създавате обекти на стойност гигабайти всяка минута, няма значение дали кеширате или не. Бързо ще увеличите обема на паметта си и събирането на боклука ще съсипе деня ви. Така че предполагам, че изводът е да се уверите, че разбирате точно какво се случва във вашата виртуална машина (създаване на обект, унищожаване, GC и т.н.), така че да можете да вземете възможно най-добрите решения.
Извинете за многословието. Тъкмо се завъртя и забравих да погледна нагоре. Надяваме се, че част от това засяга духа на вашето запитване и не е твърде елементарен разговор.
person
Ed Lucas
schedule
16.09.2008