[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Принципы разработки под высокие нагрузки
Страницы: 1, 2, 3, 4, 5, 6, 7
ApuktaChehov
lock12 - это твое сообщение от гостя?

_____________
twin
Цитата
Если оптимизированный по максимуму запрос на правильной структуре бд не идет хорошо на БД mysql, то какой вывод?
Выбрать не mysql, а что то в сотни раз посерьезней, типа Oracle.
Предел оптимизации рано или поздно может быть достигнут. И тут вы со своими крутыми запросами и современными фреймворками просто сядите в лужу, ибо дальше двигаться просто станет некуда.

Есть принципы горизонтального и вертикального масштабирования, и в них никак не вписываются сложные, особенно составные запросы.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
vagrand
Ох и холиварная вышла тема. Фрем или не фрейм, mysql или oracle. Если нет желания или умения то написать плохо можно и на фрейме и без него. Как по мне надо просто понимать какие плюсы и какие минусы и самому выбирать, при этом проинформировав и заказчика. Мол мил человек, если писать с нуля, то можно написать что будет работать на N % быстрее, но зато писать мы будем на N дней/месяцев/лет дольше и не факт что то что мы в результате напишем сможет поддерживать кто-то кроме нас, т.к. там будут километры кода, в которых обычно программисту при использовании фрейма вникать не нужно.

А что касательно по теме то я могу от себя выделить следующие меры по повышению устойчивости к нагрузкам:

1. Первое и самое главное это правильно спроектировать систему, если спроектировать не верно, то все остальное это костыли.

2. MySQL - идексы это понятно, но я бы еще настоятельно рекомендовал уходить от нормализации БД . Постараюсь объяснить что я имею ввиду - по статистике самые частые запросы это запросы на выборку посему структуру БД нужно проектировать так что бы запросы на выборку выполнялись очень быстро. Например у вас есть какая-то таблица со списком чего бы то нибыло и вам по ней нужно делать статистические выборки, скажем узнать количество каких-то записей сгруппированных по каким-то параметрам и если этот запрос будет выполнятся часто, то лучше сделать отдельную таблицу в которой вести подсчет записей по этим параметрам и обновлять данные в ней при изменении в основной таблице, что не сложно сделать при помощи триггеров. Да, работы тут выйдет больше и будет некоторая избыточность данных, зато запрос на выборку будет очень прост и быстр.

3. И снова MySQL. Я бы порекомендовал уходить от любых JOIN в сторону IN. Т.е. если к данным в одной таблице надо при выборке добавить данные из другой по ID, то сперва выбираем строки из главной, собираем нужные ID и делаем запрос к подчиненной вставляя список ID в IN. Этот метод даст возможность в будущем разнести большие таблицы по разным БД/серверам.

4. Кеширование - о сколько в этом слове smile.gif Тонны статей написаны только по этой теме и никто не в праве говорить что какой-то способ лучше а какой-то хуже или вот это надо кешировать а вот это не надо. Я лично считаю что хороша ложка к обеду, т.е. не нужно кешировать бездумно и все что попадется.

5. Статика - тоже очень интересный момент как и где хранить статические файлы, имеется ввиду все что не скрипты. Я вот сейчас разрабатываю серьезный проект где будет много картинок и иконок, к которым будут частые запросы. Сделал сразу отдельный класс, через который заливаю все картинки и этот класс кроме сохранения картинок на текущем сервере еще может разбрасывать их с таким же именем на другие сервера. Т.е. мы получаем разбросанные по нескольким серверам файлы с одним и тем же именем и можем строить потом балансировщики как на движке системы, атк и с помощью HTTP серверов.
Еще могу дать один совет по поводу сохранения файлов - при любых изменениях имя файла должно меняться. Это даст возможность легко кешировать файлы на стороне клиента и в дальнейшем легко реализовать подключение CDN, если до этого дойдет.

Ну так на скорую руку у меня все smile.gif

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
twin
Цитата
4. Кеширование - о сколько в этом слове  Тонны статей написаны только по этой теме и никто не в праве говорить что какой-то способ лучше а какой-то хуже или вот это надо кешировать а вот это не надо. Я лично считаю что хороша ложка к обеду, т.е. не нужно кешировать бездумно и все что попадется.
Кэш, это вообще последняя инстанция. Если можно обойтись без кэша, нужно обойтись без кэша.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
vagrand
Цитата
Кэш, это вообще последняя инстанция. Если можно обойтись без кэша, нужно обойтись без кэша.


Можешь обосновать?

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
killer8080
Странно, что никто не вспомнил о кешировании байт-кода, APC, Xcache, eAccelerator и т.п.
Invis1ble
Цитата (killer8080 @ 19.01.2013 - 14:19)
Странно, что никто не вспомнил о кешировании байт-кода, APC, Xcache, eAccelerator и т.п.

блин, буквально полчаса назад посетила та же мысля biggrin.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

inpost
killer8080
Люди не палят свои секреты smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Цитата (inpost @ 19.01.2013 - 14:31)
killer8080
Люди не палят свои секреты

Так это и не секрет вовсе rolleyes.gif
twin
Цитата (vagrand @ 19.01.2013 - 07:44)
Цитата
Кэш, это вообще последняя инстанция. Если можно обойтись без кэша, нужно обойтись без кэша.


Можешь обосновать?

Могу.
Любое кэширование подразумевает перестройку системы данных. Если есть попытка скэшировать страницу, значит есть желание выдать статические данные за динамические.

Смотрим. У нас к примеру магазин. Мы хотим продать как можно больше товара, а значит желаем большого посещения на наш сайт. И каждое действие кэшируем, дабы не грузить сервер.
Так вот, я кладу в карзину товар. Как это будем кэшировать? Нужно что бы ни кто не мог повторить покупку. А у нас кэш. Сколько времени зададим? Секунду? Минуту? В любом случае это удар по динамике и возможность коллизии.

Ладно, дальше. У нас форум. Или социалка. Я нажимаю кнопку - добавить чела в друзья. И должно это действие отразиться у всех друзей моего друга и его друзей. И так далее. Весь кэшь обновлять или насрать на динамику?

Ну я не говорю о том, что есть циркулярные изменения, их как? Весь кэш обнулять? А непрогретый кэш хуже, чем без кэша вообще.

Вобщем есть много нонсенсов, которые не видны на первый взгляд, пока действительно не столкнешься с высоконагруженной системой. Там немного другие правила.

Свернутый текст
И никакие фреймворки не помогут smile.gif


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
DedMorozzz
Цитата
Кэш, это вообще последняя инстанция. Если можно обойтись без кэша, нужно обойтись без кэша.

Чесно говоря, ну вот вообще мимо темы эта фраза

К примеру есть места(кафе, рестораны, магазины, и т.д.), они находятся в городах. Города в штатах, штаты в стране.

Города заполняются юзерами, т.е. создаёт новое место, и оно, не важно как(в частном случае по гугл мапсу) относится к конткретному городу. Если такого города в нашей базе нету - его создаём

Так вот, в самом проекте выводить что это за город и с доп инфо(айди города, айди штата) надо крайне часто.
И в данном случае(это 1н из миллионов ситуаций) не делать кеш городов и штатов - ну верх криворукости.
А обновлять кеш тогда и только тогда, когда был добавлен в БД новый штат или город. Причём сам кеш может быть разбит по доп признакам. К примеру городов - много, бить их ещё и по штату и после кешировать. Вариантов такой иерархии - не невероятно много(даже в тех же интернет магазинах)

Так что кеш может быть не промежуточной инстанцией, а вообще - самой первой. Сначала кешируем, далее - работаем

Цитата (twin)
И каждое действие кэшируем, дабы не грузить сервер

Это то о чём vagrand говорил. Бездумный кеш всего - не есть добро. С таким же успехом можно выгребать на каждой странице всё содержимое БД, а вдруг понадобится...

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Joker
Цитата (twin @ 19.01.2013 - 11:34)
Кэш, это вообще последняя инстанция. Если можно обойтись без кэша, нужно обойтись без кэша.


Вообще в корне не согласен.

Цитата (twin @ 19.01.2013 - 19:56)
Так вот, я кладу в карзину товар. Как это будем кэшировать? Нужно что бы ни кто не мог повторить покупку. А у нас кэш. Сколько времени зададим? Секунду? Минуту? В любом случае это удар по динамике и возможность коллизии.

Как это вообще связанно с кешем???? ты закешировал карточку товара, а не в целом весь сайт, корзина почти всегда строиться на сессии тобишь сама карточка не когда не будет изменятся.


Меню строиться на основе бд, учитывая что оно меняется редко, тоже не будем кешировать??? пусть каждая страница запрос в бд.

Пример тот же форум, путь до любой темы от главной строиться в момент создания темы, тоже не кешировать его?

и случаев таких дофига.

Кеш убивает динамику, только тогда когда нет опыта/ума его строить.
vagrand
twin

Дааа, извини но судя по твоему посту с кешом ты никогда нормально не работал. Как я уже писал не нужно бездумно кешировать все подряд. Внедрение кеширования это очень серьезный этап в разработке и лучше внедрять кеширование с самого начала, тогда можно избежать многих проблем.

Цитата
Если есть попытка скэшировать страницу, значит есть желание выдать статические данные за динамические.


Кеширование всей страницы применяется очень редко,очень мало есть случаев когда оно оправдано и возможно.

Цитата
Смотрим. У нас к примеру магазин. Мы хотим продать как можно больше товара, а значит желаем большого посещения на наш сайт. И каждое действие кэшируем, дабы не грузить сервер.
Так вот, я кладу в карзину товар. Как это будем кэшировать? Нужно что бы ни кто не мог повторить покупку. А у нас кэш. Сколько времени зададим? Секунду? Минуту? В любом случае это удар по динамике и возможность коллизии.


Кешируй данные о товаре по его ID в том же memcached или Redis, получай список ID товара в корзине и о товаре уже выбирай данные из кеша. Более того нет никакой необходимости ставить expire time для этого кеша, можно просто обновлять кеш при редактировании данных товара.

Цитата
Ладно, дальше. У нас форум. Или социалка. Я нажимаю кнопку - добавить чела в друзья. И должно это действие отразиться у всех друзей моего друга и его друзей. И так далее. Весь кэшь обновлять или насрать на динамику?


Не надо обновлять весь кеш, зачем? надо просто грамотно построить взаимосвязи между ключами кеша. Тут очень поможет реализация системы тегов, почитай об этом надосуге.

Цитата
Ну я не говорю о том, что есть циркулярные изменения, их как? Весь кэш обнулять? А непрогретый кэш хуже, чем без кэша вообще.


Если под "циркулярными" изменениями ты понимаешь данные, которые изменяются очень часто то тут так же есть несколько вариантов:
1. Если это важные данные, то тут кеш скорее всего будет не применим и нужно правильно проектировать структуру БД;
2. Если данные не критичные, навроде логов каких-то, то можно сохранять их не в БД, а в тот-же Redis, а потом, если конечно их нужно хранить продолжительное время, можно их в фоновом режиме сливать в БД или файлы.
Надо просто думать головой и варианты найдутся.


_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
waldicom
Твин не такую уж крамольную фразу сказал.
Конечно, сегодня без кеша почти никуда.
Например apc, о которым приложение вообще не знает. Или redis, с которым приложение должно активно "сотрудничать". Или связка varnish+ESI... да мало ли...
Ер если приложение очень большое, то инвалидировать кеш не всегда просто. И это может стать проблемой.


_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Invis1ble
waldicom
Цитата
Ер если приложение очень большое, то инвалидировать кеш не всегда просто. И это может стать проблемой.

Какие например могут возникнуть проблемы при инвалидации кэша, если используются тэги? Я просто на практике пока не сталкивался, поэтому интересно.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.