SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
Как ВКонтакте использует Go
Презентация -
Алексей Акулович ( )
https://ater.me/gomeetup2015/
https://vk.com/ac
Вся backend кодовая база проекта разделена на 4 части:
Все движки: и
Логика сайта:
Скрипты cron и разработка: * и
Data mining и (около-) админские скрипты:
C/C++ Go
KPHP
PHP Go
Python
* PHP работает с движками через vkext: C
Всяких движков у нас много:
antispam audiofp copyexec copyfast db-proxy
hints image isearch letters lists
logs logs-db logs-stats magus mc-proxy
memcached meowdb money msg-search mutual-friends
news nginx (module) nostradamus photo playlists
pmemcached queue random rpc-proxy sandbox
search search2 seqmap targ weights
... и т.д. . Но код там старый :(https://github.com/vk-com/kphp-kdb
Протоколы взаимодействия с движками и между ними:
Текстовый memcache-совместимый
Свой бинарный RPC
deprecated
$mc­>set("request{$prog_id},{$t}", $task);
$result = $mc­>get("output{$prog_id}");
неотделим от кодовой базы C/C++
$result = rpcCall('video_cluster', 
  rpcVideoChange(42, 100500, array(
    'title' => 'New video title',
  ))
);
Захотелось использовать RPC не из (k)PHP / C++?
Флаг в руки реализовывать с нуля
acc := &bytes.Buffer{}
scheme.Write(acc, vktl.MagicTlMemcacheGet, `smth_key_value`)
if pkg, err := conn.QuerySendRecv(acc.Bytes()); pkg.IsError {
  // ...
} else if pkg.Status == vktl.MagicTlMemcacheNotFound {
  // ...
} else {
  // используем pkg.RespBody
}
Но начнем с самого начала
Вначале была node.js, рассылающая пуши
Но работала она плохо и досталась мне
Эксперимент: реализация APNS пушилки на Go
Что из себя представляет одна пушилка (что nodejs, что go):
API over HTTPS => пачки пушей
Пачки пушей => распределение по GCM, APNS, MPNS/WNS
GCM и т.п. => распределение по приложениям
Приложение => распределение по соединениям
Обработка соединений
+ сбор статистик, логирование, самомониторинг
Да это же каналы и горутины!
Что из себя представляет одна пушилка (go):
API over HTTPS => пачки пушей ( )
Пачки пушей => распределение по GCM, APNS, MPNS/WNS ( )
GCM и т.п. => распределение по приложений ( )
Приложение => распределение по соединениям ( )
Обработка соединений ( )
+ сбор статистик, логирование, самомониторинг ( )
~5 go, 1 chan
4 go, 4 chan
4 go, ~100 chan
~100 go, ~5-10k chan
~5-20k go, ~10-20k chan
~10 go, ~5 chan
Что из себя представляет одна пушилка (go):
ulimit -n не менее
memory rss
паузы gc (пока это работает на golang 1.4)
cpu из 16 ядер - запас роста еще раза в три
время обработки пуша *
10000
~500M-1G
~50мс
200-500%
40-900мс
Что из себя представляют все пушилки:
сервера
пока что до миллиардов отправленных пушей в день
( /сек с сервера)
24
7
>3k
Go классный
Go компилируемый
Go быстрый
Go дает статический бинарник
Go выдержал продакшн
И захотелось большего пришлось к месту:
полноценный движок на Go
Большинство имеющихся наших C/C++ движков - однопоточны
Шардирование на несколько инстанций/ядер дробит
адресуемую память
Хочется использовать много ядер на единой адресуемой памяти
Здравствуй, Go!
* Все в одну машину все-равно не влезет, так что лишь используем по максимуму
Новый движок должен вести себя как остальные:
Сериализация/десериализация всех типов данных и запросов
Быть полноценным RPC сервером
server handshake
ping/pong
stats
Быть RPC клиентом
client handshake
forwarding
Писать совместимые бинлоги и снапшоты
Ожидаемо обрабатывать сигналы
Иначе этот движок никто не примет
Это все уже реализовано на "чистом" Go.
Выдает больше 120к RPS на ноутбуке, что для нас
пока вполне достаточно.
Код (tlscheme и rpc) лежит в приватных репозиториях
на github, и будет открыт по готовности.
Будет первым полноценным движком на Go (не считая cgo).
Клиентская часть позволяет переносить тяжелые PHP cron
скрипты на Go.
Планы по использованию Go:
Принят в стек разработки адекватно;
Сишники не будут использовать Go;
Код сайта не будет переписываться с kPHP на Go;
Отдельные специфические движки и задачи могут
получить воплощение на Go;
Соотвественно, язык остается уделом PHP'шников :)
Вопросы?
Рассылка пуш уведомлений на Go
Если вопросы возникнут позже
Документация по движкам
http://habrahabr.ru/post/265731/
https://vk.com/ac
http://vk.cc/4fg1Sn

Weitere ähnliche Inhalte

Was ist angesagt?

#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6Nikolay Samokhvalov
 
Введение в язык программирования Go
Введение в язык программирования GoВведение в язык программирования Go
Введение в язык программирования GoElena Grahovac
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентовNikolay Samokhvalov
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Yandex
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Yandex
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)Nikolay Samokhvalov
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДNikolay Samokhvalov
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodNikita Baksalyar
 
Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)AvitoTech
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаendeveit
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаITCrowd Almaty
 
Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)AvitoTech
 
"Великолепный API без Rest", Констатин Якушев (Badoo)
 "Великолепный API без Rest", Констатин Якушев (Badoo) "Великолепный API без Rest", Констатин Якушев (Badoo)
"Великолепный API без Rest", Констатин Якушев (Badoo)Badoo Development
 
Джентльменский набор сисадмина / Антон Турецкий (Badoo)
Джентльменский набор сисадмина / Антон Турецкий (Badoo)Джентльменский набор сисадмина / Антон Турецкий (Badoo)
Джентльменский набор сисадмина / Антон Турецкий (Badoo)Ontico
 
Логирование в Python: то, о чем не пишут в документации
Логирование в Python: то, о чем не пишут в документацииЛогирование в Python: то, о чем не пишут в документации
Логирование в Python: то, о чем не пишут в документацииIvan Kolodyazhny
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...Nikolay Samokhvalov
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...Nikolay Samokhvalov
 

Was ist angesagt? (20)

#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
Введение в язык программирования Go
Введение в язык программирования GoВведение в язык программирования Go
Введение в язык программирования Go
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
Devconf15
Devconf15Devconf15
Devconf15
 
Барнаул15
Барнаул15Барнаул15
Барнаул15
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
 
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
Александр Панин, Как мы делали кроссплатформенную библиотеку SpeechKit на C++
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
 
Отладка в Python: 2016 edition
Отладка в Python: 2016 editionОтладка в Python: 2016 edition
Отладка в Python: 2016 edition
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБД
 
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
 
Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)Работаем с API по-взрослому - Максим Кислов (Badoo)
Работаем с API по-взрослому - Максим Кислов (Badoo)
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
 
Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)Стабы для фронтенда - Никита Мостовой (HeadHunter)
Стабы для фронтенда - Никита Мостовой (HeadHunter)
 
"Великолепный API без Rest", Констатин Якушев (Badoo)
 "Великолепный API без Rest", Констатин Якушев (Badoo) "Великолепный API без Rest", Констатин Якушев (Badoo)
"Великолепный API без Rest", Констатин Якушев (Badoo)
 
Джентльменский набор сисадмина / Антон Турецкий (Badoo)
Джентльменский набор сисадмина / Антон Турецкий (Badoo)Джентльменский набор сисадмина / Антон Турецкий (Badoo)
Джентльменский набор сисадмина / Антон Турецкий (Badoo)
 
Логирование в Python: то, о чем не пишут в документации
Логирование в Python: то, о чем не пишут в документацииЛогирование в Python: то, о чем не пишут в документации
Логирование в Python: то, о чем не пишут в документации
 
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
#PostgreSQLRussia 2015.09.15 - Николай Самохвалов - 5 главных особенностей Po...
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
 

Andere mochten auch

Пословицы дядюшки Пайка
Пословицы дядюшки ПайкаПословицы дядюшки Пайка
Пословицы дядюшки ПайкаElena Grahovac
 
Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters MongoDB
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderIgor Dolzhikov
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runitAlexander Shcherbinin
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесAnton Piskunov
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelAlex Mikitenko
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Mikhail Salosin
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDKrivoy Rog IT Community
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruAlexander Shcherbinin
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноKrivoy Rog IT Community
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивамиEvgeny Smirnov
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsDaniel Podolsky
 
Machine Learning in Magento 2
Machine Learning in Magento 2Machine Learning in Magento 2
Machine Learning in Magento 2Alexander Makeev
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахAlex Chistyakov
 
Лямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюЛямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюAlexander Makeev
 
1. ruby великолепный. вступление история и философия
1. ruby великолепный. вступление   история и философия1. ruby великолепный. вступление   история и философия
1. ruby великолепный. вступление история и философияАлександр Вагин
 
Dynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsDynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsAlex Mikitenko
 
HR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практикиHR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практикиAlexander Krass
 

Andere mochten auch (20)

Пословицы дядюшки Пайка
Пословицы дядюшки ПайкаПословицы дядюшки Пайка
Пословицы дядюшки Пайка
 
Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters Database Trends for Modern Applications: Why the Database You Choose Matters
Database Trends for Modern Applications: Why the Database You Choose Matters
 
Codefest 2016 - Go в Openprovider
Codefest 2016 - Go в OpenproviderCodefest 2016 - Go в Openprovider
Codefest 2016 - Go в Openprovider
 
Обзорная экскурсия по runit
Обзорная экскурсия по runitОбзорная экскурсия по runit
Обзорная экскурсия по runit
 
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнесРИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
РИФ+КИБ 2016: как потратить почти 2 миллиона рублей и так и не сделать бизнес
 
Dynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object modelDynamic Ruby. Lesson #1: Object model
Dynamic Ruby. Lesson #1: Object model
 
Ruby строки
Ruby строкиRuby строки
Ruby строки
 
OOP в Go
OOP в GoOOP в Go
OOP в Go
 
Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015Go meetup smotri+ 23.04.2015
Go meetup smotri+ 23.04.2015
 
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDDkranonit S15 Vladimir Melnik - Ruby on Rails, BDD
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
Ruby: работа с массивами
Ruby: работа с массивамиRuby: работа с массивами
Ruby: работа с массивами
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwords
 
Machine Learning in Magento 2
Machine Learning in Magento 2Machine Learning in Magento 2
Machine Learning in Magento 2
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектах
 
Лямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связьюЛямбда-архитектура с обратной связью
Лямбда-архитектура с обратной связью
 
1. ruby великолепный. вступление история и философия
1. ruby великолепный. вступление   история и философия1. ruby великолепный. вступление   история и философия
1. ruby великолепный. вступление история и философия
 
Dynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friendsDynamic Ruby. Lesson #5: define_method and its friends
Dynamic Ruby. Lesson #5: define_method and its friends
 
HR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практикиHR-аналитика и автоматизация рекрутинга: лучшие практики
HR-аналитика и автоматизация рекрутинга: лучшие практики
 

Ähnlich wie Как ВКонтакте использует Go

Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Ontico
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...SQALab
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeIosif Itkin
 
CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...
CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...
CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...CodeFest
 
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...Unigine Corp.
 
Highload2009 Rybak Badoo Os
Highload2009 Rybak Badoo OsHighload2009 Rybak Badoo Os
Highload2009 Rybak Badoo OsHighLoad2009
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, BadooOntico
 
Smirnov Twisted Python
Smirnov Twisted PythonSmirnov Twisted Python
Smirnov Twisted PythonHighLoad2009
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSUlarhat
 
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...Dev_Party
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonAndrey Smirnov
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonAndrey Smirnov
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Ontico
 

Ähnlich wie Как ВКонтакте использует Go (20)

Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
Практика использования NoSQL в высоконагруженном проекте (Дмитрий Ананьев)
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...
CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...
CodeFest 2014. Круглов И. — События на каждом углу. Путешествие в мир системн...
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
Портирование C++ приложений на FLASCC: опыт Unreal Engine 3. Павел Наказненко...
 
Highload2009 Rybak Badoo Os
Highload2009 Rybak Badoo OsHighload2009 Rybak Badoo Os
Highload2009 Rybak Badoo Os
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
 
Smirnov Twisted Python
Smirnov Twisted PythonSmirnov Twisted Python
Smirnov Twisted Python
 
pgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresqlpgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresql
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSU
 
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
Анатолий Полицын, агентство интернет-маркетинга «Синапс» — Корпоративный хост...
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 

Mehr von Artem Kovardin

Cервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегииCервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегииArtem Kovardin
 
Garbage collector и управление памятью в Go
Garbage collector и управление памятью в GoGarbage collector и управление памятью в Go
Garbage collector и управление памятью в GoArtem Kovardin
 
C-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be createdC-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be createdArtem Kovardin
 
Fraser Graham Killer Robots
Fraser Graham Killer RobotsFraser Graham Killer Robots
Fraser Graham Killer RobotsArtem Kovardin
 
Best practices-for-production-environments
Best practices-for-production-environmentsBest practices-for-production-environments
Best practices-for-production-environmentsArtem Kovardin
 

Mehr von Artem Kovardin (7)

Cервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегииCервер на Go для мобильной стратегии
Cервер на Go для мобильной стратегии
 
Garbage collector и управление памятью в Go
Garbage collector и управление памятью в GoGarbage collector и управление памятью в Go
Garbage collector и управление памятью в Go
 
C-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be createdC-spirit reborn: why Go was bound to be created
C-spirit reborn: why Go was bound to be created
 
Anthony Starks - deck
Anthony Starks - deckAnthony Starks - deck
Anthony Starks - deck
 
Fraser Graham Killer Robots
Fraser Graham Killer RobotsFraser Graham Killer Robots
Fraser Graham Killer Robots
 
Go database/sql
Go database/sqlGo database/sql
Go database/sql
 
Best practices-for-production-environments
Best practices-for-production-environmentsBest practices-for-production-environments
Best practices-for-production-environments
 

Как ВКонтакте использует Go

  • 1. Как ВКонтакте использует Go Презентация - Алексей Акулович ( ) https://ater.me/gomeetup2015/ https://vk.com/ac
  • 2. Вся backend кодовая база проекта разделена на 4 части: Все движки: и Логика сайта: Скрипты cron и разработка: * и Data mining и (около-) админские скрипты: C/C++ Go KPHP PHP Go Python * PHP работает с движками через vkext: C
  • 3. Всяких движков у нас много: antispam audiofp copyexec copyfast db-proxy hints image isearch letters lists logs logs-db logs-stats magus mc-proxy memcached meowdb money msg-search mutual-friends news nginx (module) nostradamus photo playlists pmemcached queue random rpc-proxy sandbox search search2 seqmap targ weights ... и т.д. . Но код там старый :(https://github.com/vk-com/kphp-kdb
  • 4. Протоколы взаимодействия с движками и между ними: Текстовый memcache-совместимый Свой бинарный RPC deprecated $mc­>set("request{$prog_id},{$t}", $task); $result = $mc­>get("output{$prog_id}"); неотделим от кодовой базы C/C++ $result = rpcCall('video_cluster',    rpcVideoChange(42, 100500, array(     'title' => 'New video title',   )) );
  • 5. Захотелось использовать RPC не из (k)PHP / C++? Флаг в руки реализовывать с нуля acc := &bytes.Buffer{} scheme.Write(acc, vktl.MagicTlMemcacheGet, `smth_key_value`) if pkg, err := conn.QuerySendRecv(acc.Bytes()); pkg.IsError {   // ... } else if pkg.Status == vktl.MagicTlMemcacheNotFound {   // ... } else {   // используем pkg.RespBody }
  • 6. Но начнем с самого начала Вначале была node.js, рассылающая пуши Но работала она плохо и досталась мне Эксперимент: реализация APNS пушилки на Go
  • 7. Что из себя представляет одна пушилка (что nodejs, что go): API over HTTPS => пачки пушей Пачки пушей => распределение по GCM, APNS, MPNS/WNS GCM и т.п. => распределение по приложениям Приложение => распределение по соединениям Обработка соединений + сбор статистик, логирование, самомониторинг
  • 8. Да это же каналы и горутины!
  • 9. Что из себя представляет одна пушилка (go): API over HTTPS => пачки пушей ( ) Пачки пушей => распределение по GCM, APNS, MPNS/WNS ( ) GCM и т.п. => распределение по приложений ( ) Приложение => распределение по соединениям ( ) Обработка соединений ( ) + сбор статистик, логирование, самомониторинг ( ) ~5 go, 1 chan 4 go, 4 chan 4 go, ~100 chan ~100 go, ~5-10k chan ~5-20k go, ~10-20k chan ~10 go, ~5 chan
  • 10. Что из себя представляет одна пушилка (go): ulimit -n не менее memory rss паузы gc (пока это работает на golang 1.4) cpu из 16 ядер - запас роста еще раза в три время обработки пуша * 10000 ~500M-1G ~50мс 200-500% 40-900мс
  • 11. Что из себя представляют все пушилки: сервера пока что до миллиардов отправленных пушей в день ( /сек с сервера) 24 7 >3k
  • 12. Go классный Go компилируемый Go быстрый Go дает статический бинарник Go выдержал продакшн
  • 13. И захотелось большего пришлось к месту: полноценный движок на Go
  • 14. Большинство имеющихся наших C/C++ движков - однопоточны Шардирование на несколько инстанций/ядер дробит адресуемую память Хочется использовать много ядер на единой адресуемой памяти Здравствуй, Go! * Все в одну машину все-равно не влезет, так что лишь используем по максимуму
  • 15. Новый движок должен вести себя как остальные: Сериализация/десериализация всех типов данных и запросов Быть полноценным RPC сервером server handshake ping/pong stats Быть RPC клиентом client handshake forwarding Писать совместимые бинлоги и снапшоты Ожидаемо обрабатывать сигналы Иначе этот движок никто не примет
  • 16. Это все уже реализовано на "чистом" Go. Выдает больше 120к RPS на ноутбуке, что для нас пока вполне достаточно. Код (tlscheme и rpc) лежит в приватных репозиториях на github, и будет открыт по готовности. Будет первым полноценным движком на Go (не считая cgo). Клиентская часть позволяет переносить тяжелые PHP cron скрипты на Go.
  • 17. Планы по использованию Go: Принят в стек разработки адекватно; Сишники не будут использовать Go; Код сайта не будет переписываться с kPHP на Go; Отдельные специфические движки и задачи могут получить воплощение на Go; Соотвественно, язык остается уделом PHP'шников :)
  • 18. Вопросы? Рассылка пуш уведомлений на Go Если вопросы возникнут позже Документация по движкам http://habrahabr.ru/post/265731/ https://vk.com/ac http://vk.cc/4fg1Sn