«Збираємося запустити своє хмара»: Однокласники про Java і не тільки



Як в Однокласниках використання sun.misc.Unsafe поєднується з підвищеними вимогами до надійності? Чому там допрацьовували систему моніторингу Cacti? Робота в ОК перетинається з науковою діяльністю? Якщо соцмережа називається «Однокласники», то складається весь її Java-код з одного класу?

Відповіді на ці та інші питання — у нашому пості. Напередодні Joker, де відразу троє співробітників ОК будуть спікерами, а ще один бере участь у програмному комітеті, ми розпитали всіх чотирьох — і не тільки їх. На наші питання відповіли:

  • Олег Анастасьєв, провідний розробник (учасник програмного комітету Joker 2016)
  • Андрій Паньгин, провідний розробник (спікер Joker 2016)
  • Віталій Худобахшов, провідний аналітик (спікер Joker 2016)
  • Дмитро Бугайченко, інженер-аналітик (спікер Joker 2016)
  • Андрій Губа, заступник технічного директора
  • Христина Штейнберга, керівник відділу персоналу

Олег Анастасьєв (провідний розробник)
— Однокласники прагнуть використовувати нове, або не хочуть бігти попереду паровоза? Наприклад, при виході нової мажорної версії Java ви прагнете оперативно перевести сервера на неї, або спокійно живете зі старою?

— Ми танцюємо від завдання: будь-технічне дія повинна відповідати на просте питання «навіщо». Якщо воно відповідає на це питання — ми будемо цим займатися, ні — не будемо.

І тому з версіями Java виходить по-різному. Java 8 ми вводили прискореними темпами, тому що там були лямбды. В розробці веб-частин порталу ми використовуємо власний функціонально-орієнтований фреймворк, доводилося писати багато анонімних класів. І Java 8 відмінно лягала на нашу задачу: з нею виходило скоротити код лямбдами, він опинявся читаемее, і швидше.

А ось у випадку з Java 9, якщо виходити із завдання, поки що не бачу, чим саме вона покращить нам життя. Можливо, вона виявиться швидше, і тоді буде причина витрачати час на перехід, але з цим все стане ясно тільки після фінального релізу. Перехід до модулів в нашому випадку не дасть переваг, виправдовують його.

Більш того, в певному відношенні Java 9 зробить наше життя складніше, а не простіше: з-за відмови від sun.misc.Unsafe, який ми використовуємо. Unsafe дозволяє зручно, не залишаючи Java, реалізовувати багато низькорівневого коду, без нього мені довелося б займатися написанням коду, припустимо, на C. Навіть якщо б JNI швидко працював (а це не так), довелося б витратити набагато більше зусиль на розробку.

Крім того, оскільки ми гігантський перевантажений проект, для нас, звичайно, важлива надійність. Тому до переходу ми повинні бути впевнені, що все вже працює досить стабільно і не гірше попередньої версії. Так що встановлювати Java 9 в день general availability не збираємося точно, хоча, звичайно, почнемо її тестування.

— Слухайте, а як «важлива надійність» поєднується з використанням Unsafe в продакшені?

— Зрозуміло, при використанні Unsafe легко можна багато зламати. Але якщо ти дуже добре розумієш, що робиш, то знаєш, що саме можеш зламати, і знаєш, важливо чи це конкретно в твоєму випадку.

Наприклад, у певних випадках може зламатися принцип «write once, run anywhere»: вийде код, який не всім буде запускатися коректно. Але якщо для Java в цілому це важливо, то у нас своя специфіка. Ми запускаємо код на цілком певних серверах. Ми явно не поміняємо завтра свій серверний парк на щось зовсім інше. І наша мета в тому, щоб код на цих серверах працював як можна більш оптимально.

А в такому разі принципі «write once, run anywhere» починає не допомагати, а не заважати: він не дозволяє програмісту скористатися тими можливостями операційної системи, з якими він міг би одержати значно більш швидкий і оптимальний код. Наприклад, не дозволяє брати сторінку пам'яті безпосередньо в ОС. Не дозволяє рекомендувати ОС, як кешувати певну область пам'яті, чи потрібно взагалі це робити, як довго. В Java таких вбудованих можливостей в принципі немає, а з допомогою Unsafe це реалізується просто.

Мотивація Oracle для відмови від Unsafe зрозуміла: так, він надає багато способів вистрілити собі в ногу, і у багатьох людей все закінчується цим. Але хочеться зауважити, що є ще і наш випадок, у якому відмова від Unsafe — це не «у дитини відібрали сокиру, щоб він собі не порізав пальчик», а «дорослі втрачають простого і корисного робочого інструменту». І приходять йому на зміну VarHandles допомагають лише в одному з наших кейсів.

А взагалі кажучи, в ідеалі мені хотілося б навіть не Unsafe. Мені хотілося б, щоб в Java була можлива більш тісна інтеграція з ОС, безліччю бібліотек, реалізованих на інших мовах, C і Go, можливість писати низькорівневий код з ручним керуванням пам'яттю, де це потрібно, аж до можливості в будь-який момент переходити на асемблер і просто писати код на ньому в тих місцях, де швидкість критична.

— Ви як учасник програмного комітету Joker вже побачили багато доповіді. Чи сподобався вам який-небудь особливо, на що можете порекомендувати сходити?

— Мені дуже сподобався своєю практичністю доповідь Філіпа Дельгядо «СУБД: індивідуальне пошиття і підгонка по фігурі» — про те, як, добре знаючи можливості своєї СУБД, можна швидко вирішувати складні завдання і одночасно уникнути ускладнення архітектури програми.

І, звичайно, я упереджений, але дуже цікавий доповідь Андрія Паньгина. Також варто послухати Дмитра Бугайченко з Однокласників про те, як застосовувати стриминговый аналіз десятків мільйонів подій в секунду. Для такої задачі «просто взяти Spark» — не варіант.

Андрій Паньгин (провідний розробник)
— Про що ви розповісте на Joker?

— У мене було на прикметі кілька тем, але слухачі самі вибрали міфи про performance. Що ж, значить, буду розповідати про те, як Java гальмує. Чи не гальмує — у кого як :)

Загалом, поділюся особливостями JVM, що стосуються продуктивності, і розповім, як легко помилитися при аналізі performance-проблем.

— Рік тому ви в «Без слайдів» розповідали про те, як все технічно влаштовано в ОК — а за цей рік щось відчутно змінилося? Хоч кількісно, хоч якісно.

— Звичайно. Кількість серверів, обсяг сховищ і трафік — це те, що постійно зростає. Один тільки трафік за минулий рік подвоївся.

Ми запустили кілька нових самостійних проектів, зокрема, OK Live-ОК Повідомлення. Звичайно, вони вимагали і нових технічних рішень.
Рік тому у нас взагалі видеостриминга толком не було, тепер же онлайн-трансляції доступні всім користувачам на будь-яких пристроях.

Суттєво переробили бекенд-системи повідомлень з прицілом на мобільні пристрої і мобільні мережі, для чого потрібно було реалізувати свій сервер з кастомным протоколом.

Навчилися «нарізати» відео на GPU. За нашими вимірами, відеокарти транскодируют поширені формати відео в 3 рази швидше, ніж CPU.

З інших великих технологічних проривів — запуск власного «хмари». Поки в експериментальному режимі. Раніше у нас на кожній фізичній машині працювало, як правило, один додаток. Тепер же розгортання сервісів в «хмару» дозволить нам ефективніше використовувати обчислювальні ресурси. А розробникам не доведеться чекати, поки адміни встановлять і налаштують сервери: типові завдання з розгортання і масштабування додатків в продакшені будуть виконуватися автоматично.

Є і багато інших технічних цікавинок, які поки ще в дослідницькій стадії. Коли справа дійде до запуску — неодмінно розповім і про них.

— З-за назви «Однокласників» не втримаємося від такого питання: а скільки у їх коді Java-класів?

— Складно сказати. Програмний код «Однокласників» включає більше 300 модулів. Всі разом я їх ніколи не бачив. У мене на роботі викачана приблизно четверь, і це близько 50 тисяч класів. Найбільший модуль налічує понад 8000 класів.

— Клас!



Віталій Худобахшов (провідний аналітик)
— Чим саме ви займаєтеся в Однокласниках?

— Я провідний аналітик. Мені доводиться робити багато різних речей, по більшій частині моя робота пов'язана з аналізом великих обсягів даних з допомогою Spark/Scala або інших подібних засобів. Займаюся обробкою даних і побудовою будь-яких моделей. Іноді доводиться придумувати різні алгоритми і писати реалізацію на всіх рівнях, включаючи роздачу даних користувачами за коштами високонавантажених сервісів на Java, але здебільшого я займаюся розробкою матмоделей.

матеріалі «Хакера» ви згадали про ситуаціях, коли int-адресації не вистачає — а чи часто вам в ОК з їх обсягами даних доводиться стикатися з подібними ситуаціями на практиці?

— При обробці великих даних ситуація з нестачею int-адресації кілька разів справді траплялася. Не можу поки що назвати цю проблему поширеною, але вона все частіше зустрічатися на практиці. Int-адресація є лише частиною проблеми. Наприклад, багато людей говорять, що LinkedList — це погана структура даних, однак використання ArrayList великого обсягу часто неможливо через фрагментації або Promotion Failure — так що це трохи більш глибока проблема, що люди про неї думають. Я дійсно використав код, подібний до того, що описав в «Хакера» для великих розрахунків, і я б сказав, що структур даних c long-адресацією не вистачає. Власне, якщо знайду час, напишу свою бібліотеку.

— Очевидно, що дані для аналізу у ОК багато — а якщо підходити не кількісно, а якісно, чи є у них своя унікальна специфіка?

— Насправді, обсяг не є єдиною характеристикою великих даних навіть у загальному випадку. Так, є, звичайно своя специфіка. Найочевидніша — це соціальний граф, і це вже дуже багато специфіки. Більше того, коли контент генерується в такому обсязі і настільки різний за типом (мови), це створює масу різних труднощів. Користувачі досить винахідливі і своїх хитрощах і простодушні в інших своїх діях, все це разом створює дуже багато труднощів і цікавих завдань на різних рівнях.

— Про що ви розповісте на Joker?

— Я буду говорити про дуже популярною темою функціонального програмування у контексті опрацювання великих даних з прикладами на Scala/Spark. Розповім, чим живе функціональне програмування на практиці і чому воно стало популярно саме зараз. Про основні риси ООП і область його застосування багато відомо, є патерни, є інкапсуляція/спадкування/поліморфізм, багато хто думають, що це якісь особливі риси саме ООП, і мало хто може відразу сказати, про що взагалі функціональна парадигма. І, звичайно, все це особливо цікаво в контексті моделі MapReduce.

Дмитро Бугайченко (інженер-аналітик)
— Чим саме ви займаєтеся в ОК?

— Спочатку мене запросили в компанію працювати над системою рекомендації музики, що виявилося більш ніж цікаво. Далі отриманий досвід ми продовжили розвивати, реалізуючи рекомендаційні системи в інших сервісах (групи, відео і так далі).

У якийсь момент підійшли і до такого складного об'єкта, як стрічка, й тут знадобилось фундаментально змінювати підхід до розробки системи: великі обсяги, жорсткі вимоги на швидкість реакції, різнорідність типів контенту і так далі. В результаті завдання стрічки стали потужним драйвером для нашої аналітичної інфраструктури, розвитком якої займався і я.

Зараз основу моєї діяльності складають три компоненти: розвиток аналітичної інфраструктури, експерименти з алгоритмами побудови стрічки, допомога колегам та іншим командам у впровадженні аналізу даних процеси і продукти.

— У вас науковий бекграунд — чи допомагає він при роботі в Однокласниках?

— Так, цілком. Дуже корисний навик — пошук наукових статей і публікацій. Намагаючись розв'язувати яку-небудь завдання, завжди починаємо з пошуку того, що люди взагалі робили в цій області. І часто промислових публікацій на відповідну тему не виявляється, зате багато академічних і звідти можна почерпнути багато нового.

Звичайно, щоб ці публікації не просто знайти, але і використовувати, потрібно знати мову, на якій розмовляє наукове співтовариство. Академічний мова досить сильно відрізняється від індустріального.

— А сама робота над таким великим проектом, як Однокласники, виявляється ближче до науки, ніж над чим меншого масштабу?

— Так, причому відразу з трьох причин. Перша в тому, що при менших масштабах намагаються використовувати готові розробки для мінімізації витрат. Відмінність компаній рівня Однокласників в тому, що вони не просто використовують готове, а часто розробляють нові рішення, рухаючи всю область вперед. І той обсяг інвестицій, який компанія рівня ОК вкладає в розвиток як технологій, так і алгоритмів обробки, непорівнянний з тим, що може собі дозволити невелика компанія — хоча б в плані об'єму обчислювальних ресурсів.

Друга причина — це, звичайно, дані. Працюючи в Однокласниках, ми маємо доступ до дуже великих обсягів статистичних даних, який в академічному середовищі просто так отримати дуже складно.

Третя причина більш технологічна: можна зробити такий алгоритм, який буде нормально працювати в невеликій компанії, але для того, щоб він працював в масштабах ОК, теж доводиться вирішувати багато нових нетривіальних завдань — як технологічних, так і алгоритмічних. Це дуже цікаво.

— При роботі в ОК продовжуєте паралельно ви (а також ваші колеги) наукову діяльність? Публікуються наукові статті, засновані на отриманому в ОК досвіді?

— Я працюю в університеті як викладач. Крім того, ми стимулюємо розвиток російського data science-спільноти: влаштовуємо конкурси, хакатони, публікуємо у відкритому доступі частина анонимизированных датасетов, побудованих на основі реальних даних. І в цьому відношенні продовжую.

Що стосується наукових статей, дійсно з'являлися пов'язані з ОК: наприклад, у нас є запатентована система музичних рекомендацій, про яку були опубліковані статті. Але випускати їх виходить нечасто, самої свіжої півтора року. Ми компенсуємо це виступами на різних конференціях, технологічних начебто Joker, так і академічних — там є що розповісти про рекомендаційні системи, про аналіз даних.

— До питання про Joker: про що розповісте там?

Расскажу про систему, яка в Однокласників використовується для підрахунку CTR об'єктів в нашій стрічці. А також про особливості різних стандартних сховищ, які використовуються в Java-екосистемі, і про альтернативному підході до обробки даних з використанням сховища key-value, а з використанням потокового аналізу.





Андрій Губа (заступник технічного директора)
— Що саме входить в ваш коло завдань?

— Напевно, можна сказати, що я «займаюся експлуатацією». Формально курирую напрями системного адміністрування, інформаційної безпеки. Керую командами API і платформи. Команда платформи — це розробники, які займаються одними з найбільш складних завдань. Вони пишуть свої власні протоколи, за якими спілкуються наші програми, свої власні системи зберігання даних — нещодавно запустили нову.

— Про запуск хочеться дізнатися детальніше: навіщо цю систему знадобилося писати, в чому її особливості?

— У нас і раніше вже працювала своя власна система, в якій ми зберігали фотографії, музику, відео. Але оскільки обсяги ростуть (зокрема, сервіс відео дуже активно розвивається), все актуальніше питання вартості зберігання. А крім того, оскільки збільшується кількість серверів, постає питання зручності експлуатації. І ми прийняли рішення переробити наявну систему, виходячи з цих двох міркувань. Зібрали список того, чого хочемо досягти, і написали нову згідно з нього. Зараз вона вже працює в продакшені.

Ось, скажімо, наочна метрика: в ній replication factor 2.1, тобто ми зберігаємо всі дані в 2.1 копії. А до цього була система, розподілена між трьома дата-центрами, де було три копії, в кожному по одній. Зараз ми зберігаємо копії і якісь контрольні суми, і могли б цілком втратити будь-який з дата-центрів, не втративши при цьому дані і зберегти функціональність.

Крім цього, вона зручна у масштабуванні та експлуатації. Наприклад, заміна диска — дуже проста операція: старий «вилетів» диск просто видаляється, просто вставляється новий, все в автоматичному режимі запускається і далі працює. Розширення можна проводити будь-якою кількістю серверів, різним об'ємом і кількістю дисків.

Схоже вийшло зі своїм хмарою: якщо у випадку з зберіганням даних ми захотіли робити це дешевше, то в цьому випадку збираємося раціональніше використовувати ресурси своїх серверів (процесор, пам'ять, дисковий простір). Серверів багато, не на всіх ресурси повноцінно використовуються, десь сильніше завантажено, десь інше. Тому ми вирішили запустити хмару, що дозволяє використовувати їх ефективніше.

Подивилися, що є на ринку, зрозуміли, що десь вогкувато, де не підходить під вимоги, і вирішили написати своє власне. І зараз в процесі запуску, працює в стадії «альфи», ми проводимо продакшен-експерименти з ним. Запускаємо частина сервісів, дивимося на статистику і модифікуємо. За нашими планами, в наступному році значна частина продакшену буде працювати в хмарі.

— А у випадку з системним адмініструванням у вас теж є якісь власні рішення?

— Так, там стандартні інструменти теж не завжди підходять, так що в частині випадків доводиться допрацьовувати існуючі, а в частині писати власні.

Наприклад, так сталося з системами моніторингу і статистики. Якщо використовувати популярну систему Cacti на кількох сотнях серверів, вона буде успішно працювати. Але у нас 8500 серверів, і на таких масштабах вона в стандартному вигляді працювати не стане, доводиться модифікувати.

— Крім власних інструментів, в чому специфіка адміністрування в «Однокласниках»?

— Наша мета — забезпечувати відмовостійкість гігантського проекту в розподіленому середовищі. Є кілька дата-центрів, і ми поставили собі завдання зробити так, щоб при втраті будь-якого з них у нас все працювало. Відповідно, ми повинні, виходячи з цього, будувати сервіси, відповідним чином запускати і так само обслуговувати. Адміністратори повинні бути достатньо підготовлені і у них повинні бути всі необхідні інструменти, щоб все працювало як в нормальній ситуації, так і якщо виникла проблема аж до виходу з ладу дата-центру.

І важлива частина роботи виявляється не технічною, а організаційної: домогтися того, щоб у відносно невеликий і розподіленій команді все певним чином діяли й обмінювалися інформацією. Повинні бути вироблені стандартні процедури, всі повинні їх знати, і при додаванні нових людей вони теж повинні дізнаватися все необхідне.

Христина Штейнберга (керівник відділу персоналу)
— Скільки в компанії зараз Java-розробників, в яких містах вони розташовані, і відбувається релокация між ними?

— На даний момент у компанії близько 120 розробників. Розташовані в трьох містах: Москва, Петербург і Рига. Релокації відбуваються не дуже часто, але час від часу хтось переїжджає в інший офіс.

— Оскільки Joker пройде в Петербурзі, окремо уточнимо: які команди/процеси знаходяться в петербурзькому офісі?

— Там майже вся розробка продуктів: мобільні додатки, відео, музика і так далі.

— Яку віддачу приносить вам участь в Java-конференціях, який фідбек отримуєте?

— В Java-співтоваристві ОК добре відомий своєю Java-розробкою, це також показує дослідження бренду. Багато звертаються за порадою до наших спікерів, ловлять їх на стенді, щоб прояснити якісь моменти з високонавантаженими системами. Відвідувачі конференцій добре знають, що такого досвіду використання Java, як у OK, немає ні в кого в Росії — так що після виступів наших спікерів черга бажаючих задати запитання утворюється в кілька метрів.

— У частині розробників існує упередження по відношенню до ОК. Хочеться щось сказати таким?

— Хочеться сказати, що всі люди різні, комусь подобаються велосипеди, а кому-то автомобілі :) Розробники, які знайомі з тим, що ми робимо, знають, що в ОК дуже цікаві технічно завдання. Тут є дуже багато викликів для вирішення проблем високонавантажених систем.

— Спасибі! Будемо чекати вас всіх на Joker 2016 — а поки що згадаємо деякі попередні доповідей спікерів з Однокласників:






Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.