Search
Write a publication
Pull to refresh
4
0

Пользователь

Send message

Архитектура Stack Overflow

Reading time12 min
Views58K
image

Чтобы понять, как все это работает, давайте начнем с показателей Stack Overflow. Итак, ниже приводится статистика за 12 ноября 2013 и 9 февраля 2016 года:

статистика
  • 209,420,973 (+61,336,090) HTTP-запросов к нашему балансировщику нагрузки;
  • 66,294,789 (+30,199,477) страниц было загружено;
  • 1,240,266,346,053 (+406,273,363,426) битов (1.24 TБ) отосланного HTTP-трафика;
  • 569,449,470,023 (+282,874,825,991) битов (569 ГБ) всего получено;
  • 3,084,303,599,266 (+1,958,311,041,954) битов (3.08 ТБ) всего отослано;
  • 504,816,843 (+170,244,740) SQL-запросов (только из HTTP-запросов);
  • 5,831,683,114 (+5,418,818,063) обращений к Redis;
  • 17,158,874 (not tracked in 2013) поисков в Elastic;
  • 3,661,134 (+57,716) запросов Tag Engine;
  • 607,073,066 (+48,848,481) мс (168 часов) выполнения SQL-запросов;
  • 10,396,073 (-88,950,843) мс (2.8 часов) затрачено на обращение к Redis;
  • 147,018,571 (+14,634,512) мс (40.8 часов) затрачено на запросы к Tag Engine;
  • 1,609,944,301 (-1,118,232,744) мс (447 часов) затрачено на обработку в ASP.Net;
  • 22.71 (-5.29) мс в среднем (19.12 мс в ASP.Net) на формирование каждой из 49,180,275 запрошенных страниц;
  • 11.80 (-53.2) мс в среднем (8.81 мс в ASP.Net) на формирование каждой из 6,370,076 домашних страниц.


Вы можете спросить, почему существенно сократилась продолжительность обработки в ASP.Net по сравнению с 2013 годом (когда было 757 часов) несмотря на прибавление 61 миллиона запросов в день. Это произошло как и из-за модернизации оборудования в начале 2015 года, так и из-за некоторого изменения параметров в самих приложениях. Пожалуйста, не забывайте, что производительность – это наша отличительная особенность. Если Вы хотите, чтобы я более подробно рассказал о характеристиках оборудования – без проблем. В следующем посте будут подробные спецификации железа всех серверов, которые обеспечивают работу сайта.

Итак, что изменилось за прошедшие 2 года? Кроме замены некоторых серверов и сетевого оборудования, не очень многое. Вот укрупненный список хардварной части, которая обеспечивает работу ресурса (выделены различия по сравнению с 2013 годом):

  • 4 Microsoft SQL Servers (новое железо для 2-х из них);
  • 11 Web-серверов IIS (новое оборудование);
  • 2 сервера Redis (новое оборудование);
  • 3 сервера Tag Engine (новое оборудование для 2-х из 3-х);
  • 3 сервера Elasticsearch (те же, старые);
  • 4 балансировщика нагрузки HAProxy (добавлено 2 для поддержки CloudFlare);
  • 2 брандмауэра Fortinet 800C (вместо Cisco 5525-X ASAs);
  • 2 маршрутизатора Cisco ASR-1001 (вместо маршрутизаторов Cisco 3945);
  • 2 маршрутизатора Cisco ASR-1001-x (новые!).

Что нам необходимо, чтобы запустить Stack Overflow? Этот процесс не сильно изменился с 2013 года, но из-за оптимизации и нового железа, нам необходим только один web-сервер. Мы этого не хотели, но несколько раз успешно проверили. Вношу ясность: я заявляю, что это работает. Я не утверждаю, что это (запуск SO на единственном web-сервере) — хорошая затея, хотя каждый раз выглядит весьма забавно.
Читать дальше →

Почему технический долг — это хорошо

Reading time4 min
Views28K
Исключая тех, кому повезло быть богатыми, большинство людей занимают деньги, когда начинают свой первый бизнес. И они надеются, что эти инвестиции себя оправдают. Это пример того, как долг может быть хорошей штукой.

То же самое относится к техническому долгу. Бесчисленное множество статей в интернете рассказывают, как от него избавиться или хотя бы уменьшить. Все эти статьи показывают технический долг каким-то монстром, которого надо избегать. А если не получилось – то бороться изо всех сил.
Читать дальше →

Пишите код, который легко удалять, а не дополнять

Reading time14 min
Views53K
image«Всякая строка кода рождается без причины, продолжается в слабости и удаляется случайно», — Жан-Поль Сартр программирует на ANSI C.

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

Чем больше у вашего API пользователей, тем больше кода приходится переписывать для введения новых изменений. Верно и обратное: чем больше вы полагаетесь на сторонний API, тем больше проблем испытываете когда он изменяется. Упорядочивание взаимодействия и взаимосвязей разных частей кода является серьезной проблемой в больших системах. И по мере развития проекта, растет и масштаб этой проблемы.

Перевод статьи на русский язык подготовлен компанией PayOnline, провайдером платежных решений для вашего онлайн-бизнеса.
Читать дальше →

10 привычек довольного node.js разработчика

Reading time6 min
Views65K


К концу 2015 года в распоряжении JavaScript разработчиков образовалось огромное количество инструментов. В этой экосистеме легко потеряться, поэтому успешные команды следуют выработанным правилам, которые позволяют не терять время и сохранять здоровье проектов. Под катом перевод статьи 2016 года от команды Heroku, в которой они рассказывают о десяти привычках веб разработчиков, у которых все работает и ничего не болит. Скорее всего 80% написанного вы уже знаете – тем интереснее вам будет прочитать об оставшихся двух приемах!
Читать дальше →

Использование функций в PostgreSQL как параметризированных представлений

Reading time6 min
Views47K

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

Читать дальше →

Объясняя необъяснимое

Reading time11 min
Views67K
Друзья, мы с радостью продолжаем публикацию интересных материалов, посвященных самым разнообразным аспектам работы с PostgreSQL. Сегодняшний перевод открывает целую серию статей за авторством Hubert Lubaczewski, которые наверняка заинтересуют широкий круг читателей.



Одна из первых вещей, которую слышит новоиспеченный администратор баз данных – «используй EXPLAIN». И при первой же попытке он сталкивается c непостижимым:

                                                        QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------
 Sort  (cost=146.63..148.65 rows=808 width=138) (actual time=55.009..55.012 rows=71 loops=1)
   Sort Key: n.nspname, p.proname, (pg_get_function_arguments(p.oid))
   Sort Method: quicksort  Memory: 43kB
   ->  Hash Join  (cost=1.14..107.61 rows=808 width=138) (actual time=42.495..54.854 rows=71 loops=1)
         Hash Cond: (p.pronamespace = n.oid)
         ->  Seq Scan on pg_proc p  (cost=0.00..89.30 rows=808 width=78) (actual time=0.052..53.465 rows=2402 loops=1)
               Filter: pg_function_is_visible(oid)
         ->  Hash  (cost=1.09..1.09 rows=4 width=68) (actual time=0.011..0.011 rows=4 loops=1)
               Buckets: 1024  Batches: 1  Memory Usage: 1kB
               ->  Seq Scan on pg_namespace n  (cost=0.00..1.09 rows=4 width=68) (actual time=0.005..0.007 rows=4 loops=1)
                     Filter: ((nspname <> 'pg_catalog'::name) AND (nspname <> 'information_schema'::name))

Что бы это могло значить?
Читать дальше →

Число Грэма и взгляд в бесконечность

Reading time4 min
Views25K
Фрактал «Сокровища Атлантиды» (автор: Phoenix-22)

Вглядываться в бесконечность можно по-разному. Можно представлять себе всё увеличивающиеся астрономические числа и сопоставлять их с физическими явлениями. Можно всматриваться в выбранную точку фрактала Мандельброта, плавно увеличивая масштаб в 10198 раз (можно и больше, но в угоду скорости страдает наглядность). Фрактал, сколь малую часть его не бери, остаётся самоподобным и сохраняет дробную структуру.

А можно представлять себе число Грэма так, как его представляет автор статьи «Число Грэма на пальцах». Число Грэма настолько велико, что даже если вы представите себе какое-то чудовищно большое астрономическое число, а потом возведёте его в столь же чудовищную степень, а потом повторите всё это чудовищное число раз — то вы даже не стронетесь с места на шкале того пути, что ведёт к числу Грэма. Чтобы сосчитать до числа Грэма, придётся научиться считать совсем иначе, нежели мы привыкли — представляя, что путь в бесконечность лежит через дописывание нулей к известным нам астрономическим числам. В этой системе счёта загибанию пальца на руке будет соответствовать не прибавление к числу единицы или миллиона, не дописывание нуля или сотен нулей разом, но шаг от сложения к умножению, от умножения к возведению в степень и дальше в невообразимые дали.

Сразу предупреждаю, что все эти упражнения небезыздержечны — не увлекайтесь, берегите своё душевное здоровье. Однако иногда полезно всмотреться в бесконечность, чтобы понять, где ты и что ты ей, как человек, можешь противопоставить.

Для меня в своё время взгляд бесконечность, подобный описанному «на пальцах» числу Грэма, дала функция Аккермана (которую приводят как пример сложной рекурсивной функции в теории алгоритмов). Она тесно связана со стрелочной записью Кнута, используемой в статье про число Грэма.

Идея очень простая

Обстоятельно о подсчёте единичных битов

Reading time16 min
Views100K
Я хотел бы подарить сообществу Хабра статью, в которой стараюсь дать достаточно полное описание подходов к алгоритмам подсчёта единичных битов в переменных размером от 8 до 64 битов. Эти алгоритмы относятся к разделу так называемой «битовой магии» или «битовой алхимии», которая завораживает своей красотой и неочевидностью многих программистов. Я хочу показать, что в основах этой алхимии нет ничего сложного, и вы даже сможете разработать собственные методы подсчёта единичных битов, познакомившись с фундаментальными приёмами, составляющими подобные алгоритмы.

Читать дальше →

Конец эры глобального CSS

Reading time6 min
Views62K
Все CSS-селекторы живут в глобальной области видимости.

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

Абсолютно каждый селектор потенциально может вступить в борьбу с другим селектором или стилизовать «посторонний» элемент. В этой «глобальной» борьбе селектор может даже полностью проиграть, в итоге не применив к странице ни одного из своих правил.

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

Так не должно быть. Пора оставить позади эру глобальных стилей. Наступило время закрытого CSS.
Читать дальше →

Простые числа: история и факты

Reading time5 min
Views54K
Свойства простых чисел впервые начали изучать математики Древней Греции. Математики пифагорейской школы (500 — 300 до н.э.) в первую очередь интересовались мистическими и нумерологическими свойствами простых чисел. Они первыми пришли к идеям о совершенных и дружественных числах.

У совершенного числа сумма его собственных делителей равна ему самому. Например, собственные делители числа 6: 1, 2 и 3. 1 + 2 + 3 = 6. У числа 28 делители — это 1, 2, 4, 7 и 14. При этом, 1 + 2 + 4 + 7 + 14 = 28.

Числа называются дружественными, если сумма собственных делителей одного числа равна другому, и наоборот – например, 220 и 284. Можно сказать, что совершенное число является дружественным для самого себя.

Ко времени появления работы Евклида «Начала» в 300 году до н.э. уже было доказано несколько важных фактов касательно простых чисел. В книге IX «Начал» Эвклид доказал, что простых чисел бесконечное количество. Это, кстати, один из первых примеров использования доказательства от противного. Также он доказывает Основную теорему арифметики – каждое целое число можно представить единственным образом в виде произведения простых чисел.

Также он показал, что если число 2n-1 является простым, то число 2n-1 * (2n-1) будет совершенным. Другой математик, Эйлер, в 1747 году сумел показать, что все чётные совершенные числа можно записать в таком виде. По сей день неизвестно, существуют ли нечётные совершенные числа.
Читать дальше →

Пишем правильный манифест для сайта

Reading time3 min
Views98K
Думаю, многие знают о возможности добавления иконки сайта на рабочий стол мобильного устройства. Это удобно и причины могут быть разные (нету мобильного приложения, предоставляющего туже информацию, либо вы хотите сразу открыть определенную страницу сайта и т.д.). За некоторые свойства того, как будет отображаться сайт и как будет выглядеть иконка после добавления и отвечает файл манифеста.

Манифест для сайта – это простой JSON-файл, который позволяет вам настроить следующие вещи:
1. Какая будет иконка у пользователя, после того как он добавит ваш сайт на рабочий стол
2. Как будет запускаться ваш сайт (с адресной строкой, без нее или в полноэкранном режиме)
3. Splash screen
4. Цветовую тему
5. Ориентацию экрана
6. Начальный url
и многое другое
Читать дальше →

Точки соприкосновения JavaScript и Reverse Engineering

Reading time8 min
Views26K


Если вы посмотрите описания вакансий на позицию Reverse Engineer, то вряд ли встретите там требование знания JavaScript. А если и встретите, то только в контексте его деобфускации на разных вредоносных страницах, обычно используемых эксплойт-паками.
И возможно ли вообще сосуществование JS (который некоторые даже называют веб-ассемблером) и мира low level с Assembler во главе?

Читать дальше →

Universal Memcomputing Machines как альтернатива Машине Тьюринга

Reading time9 min
Views16K
Данную статью можно считать вольным переводом (хотя скорее попыткой разобраться) данной статьи. И да, написанна она скорее для математиков, нежели для широкой аудитории.

Небольшой спойлер: в начале это казалось мне какой-то магией, но потом я понял подвох…

В наши дни машина Тьюринга (далее МТ) — универсальное определение понятия алгоритма, а значит и универсальное определение «решателя задач». Существует множество других моделей алгоритма — лямбда исчисление, алгорифмы Маркова и т.д., но все они математически эквивалентны МТ, так что хоть они и интересны, но в теоретическом мире ничего существенно не меняют.

Вообще говоря, есть другие модели — Недетерминированная машина Тьюринга, Квантовые машины Тьюринга. Однако они (пока) являются только абстрактными моделями, не реализуемые на практике.

Полгода назад в Science Advances вышла интересная статья с моделью вычислений, которая существенно отличается от МТ и которую вполне возможно реализовать на практике (собственно статья и была о том, как они посчитали задачу SSP на реальном железе).

И да. Самое интересное в этой модели то, что, по заверению авторов, в ней можно решать (некоторые) задачи из класса NP полных задач за полином времени и памяти.
Читать дальше →

Убийцы оптимизации

Reading time9 min
Views43K
image

В этом посте изложены советы, как не написать код, производительность которого окажется гораздо ниже ожидаемой. Особенно это касается ситуаций, когда движок V8 (используемый в Node.js, Opera, Chromium и т. д.) отказывается оптимизировать какие-то функции.
Читать дальше →
12 ...
7

Information

Rating
Does not participate
Registered
Activity