SlideShare a Scribd company logo
1 of 27
Download to read offline
Особенности разработки сервера на Java

     Архитектура Одноклассников
     Сокеты в Java: проблемы и решения
     Альтернативный механизм сериализации
     Кеширование данных и разделяемая память


                                                2
Серверы Одноклассников
  •   4000 серверов
  •   Web, Business logic, Download, Storage, Remote Services
  •   Все ПО написано на Java
Высоконагруженный сервер
  •   20 тыс. одновременных подключений
  •   30 тыс. запросов в секунду
  •   Трафик до 1 Gb/s
                                                                3
Remote Service
  •     Компоненты портала как отдельные сервисы:
        система сообщений, граф дружб, поиск, лента и т. д.
  •     Внутренняя коммуникация между сервисами
                       long[] friendIds = getConnections (userId)
                                                                    Graph cluster
      Business logic
         server
                       List<User> friends = getUsers (friendIds)
                                                                    User service
                                                                      cluster
                                                                                    4
RPC сценарий
        Read Request         byte[] request = connection.read(…);


     Deserialize arguments   request → Method method, Object[] args


        Invoke method        Object result = method.invoke(args);


        Serialize result     result → byte[] response


        Send response        connection.write(response);

                                                                      5
Особенности разработки сервера на Java

     Архитектура Одноклассников
     Сокеты в Java: проблемы и решения
     Альтернативный механизм сериализации
     Кеширование данных и разделяемая память


                                                6
Разработка сервера на Java
  •   java.net (Socket I/O)
      –   Поток на каждое соединение
      –   Максимум 10 тыс. потоков
  •   NIO
      –   Неблокирующие операции read / write
      –   Selector
  •   NIO frameworks
      –   Apache MINA: http://mina.apache.org
      –   Netty: http://netty.io
                                                7
Blocking Socket Selector (BLOS)
  •   Сочетает преимущества Selector + Blocking I/O
  •   Поддерживается на уровне ОС, но не в Java
          Linux              BSD                Solaris              Windows
          epoll              kqueue             /dev/poll            Completion ports


  •   JNI обертки над системными вызовами
      –      Socket → SocketImpl impl → FileDescriptor fd → int fd


                                                                                        8
Архитектура BLOS сервера
                                 Acceptor thread
                                   Selector 1
                                   Selector 2

         read      deserialize       invoke        serialize       send

            read       deserialize       invoke        serialize      send

                            Worker thread pool


                                                                             9
Проблемы работы с сетью в Java
  •   Socket
      –   Finalizers => утечка памяти, влияние на GC
      –   Не поддерживается прямой доступ к памяти (Direct ByteBuffers)
  •   SocketChannel (NIO)
      –   Не срабатывают таймауты на I/O операциях
      –   Возможна утечка нативной памяти
  •   Решение: JNI библиотека
      –   Такой подход используется в Tomcat (APR + Tomcat native)
      –   Управление сокетами вручную
                                                                          10
Особенности разработки сервера на Java

     Архитектура Одноклассников
     Сокеты в Java: проблемы и решения
     Альтернативный механизм сериализации
     Кеширование данных и разделяемая память


                                                11
Важность сериализации в RPC
  •   Затрачиваемое время на кодирование и декодирование
  •   Объем передаваемых по сети данных
                          Read Request

                      Deserialize arguments

                         Invoke method

                         Serialize result

                         Send response
                                                           12
Способы сериализации в Java
  •   Стандартная Java сериализация
      –   Медленная
      –   Большой объем получаемых данных
  •   JBoss serialization
      –   Не поддерживает простые изменения внутри класса:
          добавление поля, удаление, изменение типа или порядка полей
  •   Avro, Thrift, Protocol Buffers
  •   Ручная сериализация – Externalizable
      –   Не вариант (тысячи классов!)
                                                                        13
Архитектура сериализации
  •   Типы сериализаторов
      –   Встроенные (примитивные типы, массивы, коллекции)
      –   Сериализатор класса по полям
  •   Каждому сериализатору сопоставляется уникальный
      64-битный ID – хеш от имен, типов и порядка полей
      class Event {
         String site = “mail.ru”;
         int year = 2012;           UID      7 m a i l . r u 2012 1
         boolean started = true;
      }
                                                                      14
Процедура сериализации
  •   Запись объекта:
      1.   Serializer serializer = Repository.getByClass(obj.getClass());
      2.   outputStream.writeLong(serializer.uid);
      3.   serializer.write(obj, outputStream);


  •   Чтение объекта:
      1.   long uid = inputStream.readLong();
      2.   Serializer serializer = Repository.getById(uid);
      3.   Object obj = serializer.read(inputStream);                   may throw
                                                              SerializerNotFoundException
                                                                                            15
Особенности реализации в Java
  •   Чтение и запись private полей чужих классов
      –   Reflection (медленно!)
      –   sun.misc.Unsafe
  •   Создание экземпляров класса
      –   sun.misc.Unsafe.allocateInstance()
      –   Динамическая генерация байткода
          ASM framework: http://asm.ow2.org
  •   Обход Java верификатора
      –   Наследование “магического” класса sun.reflect.MagicAccessorImpl

                                                                            16
Производительность
  •   Среднее время запроса: -20%
  •   Сетевой трафик: -50%




                                    17
Особенности разработки сервера на Java

     Архитектура Одноклассников
     Сокеты в Java: проблемы и решения
     Альтернативный механизм сериализации
     Кеширование данных и разделяемая память


                                                18
Что кешировть?
  •   Данные из медленного хранилища (БД)
  •   Результаты вычислений
Где кешировть?
  •   В оперативной памяти
      –   Java Heap (не подходит для объемов > 10 GB)
      –   Off-heap memory
  •   На диске или флеш-накопителе

                                                        19
Доступ к off-heap памяти в Java
  •   Native код (JNI обертки над malloc / free)
      –   Платформозавимый
  •   ByteBuffer.allocateDirect
      –   Размер буфера ≤ 2 GB
      –   Освобождается автоматически при GC
      –   Освобождение вручную: ((sun.nio.ch.DirectBuffer) buf).cleaner().clean();
  •   MappedByteBuffer (FileChannel.map)
  •   Unsafe.allocateMemory

                                                                                     20
Снимки (shapshots)
  •   Решают проблему холодного старта
  •   Должны быть целостными
  •   Способы создания снимков
      –   “Stop-the-world”
      –   Запись по сегментам
      –   Memory-mapped files (MappedByteBuffer.force)
      –   Copy-on-write (fork trick)
      –   Shared memory objects


                                                         21
Shared Memory
  •   Механизм IPC
      –   POSIX: shm_open + mmap
      –   Windows: CreateFileMapping + MapViewOfFile
      –   Linux: /dev/shm
  •   Создание объекта Shared Memory в Java
      –   new RandomAccessFile("/dev/shm/cache", "rw");
  •   Отображение в адресное пространство процесса
      –   легальный способ: FileChannel.map
      –   хитрый способ: sun.nio.ch.FileChannelImpl, методы map0 и unmap0
                                                                            22
Реализация off-heap кеша в Java
на примере download сервера
  •   Непрерывная область памяти с собственным аллокатором
  •   FIFO (проще, чем LRU)
  •   sun.misc.Unsafe (самый быстрый способ доступа)
  •   Shared Memory (/dev/shm)
  •   Сегментирование ключей по хеш-коду
  •   Блокировка сегмента через ReadWriteLock / Semaphore

                                                        23
Структура кеша




                 24
Сравнение производительности
  •   Условия
      –   Linux JDK7u4 64-bit
      –   1 млн. операций
      –   Значения от 0 до 8 KB




                                  25
Примеры
  •   https://github.com/odnoklassniki/shared-memory-cache.git
  •   https://github.com/odnoklassniki/rmi-samples.git
Статьи
  •   http://habrahabr.ru/company/odnoklassniki/blog/148139/
Контакты
  •   andrey.pangin@corp.mail.ru
  •   www.odnoklassniki.ru/ap
                                                                 26
СПАСИБО!
          Андрей Паньгин
Ведущий разработчик, Одноклассники
     andrey.pangin@corp.mail.ru

More Related Content

What's hot

"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
Vladimir Ivanov
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
drupalconf
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
Dmitry Buzdin
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Ontico
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
odnoklassniki.ru
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
Technopark
 
Devconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbDevconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadb
Sergey Petrunya
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTarget
Oleg Tsarev
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
Ontico
 

What's hot (20)

"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine "Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
"Optimizing Memory Footprint in Java" @ JEEConf 2013, Kiev, Ukraine
 
Developing highload servers with Java
Developing highload servers with JavaDeveloping highload servers with Java
Developing highload servers with Java
 
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилищеВелосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 
Метапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScriptМетапрограммирование с примерами на JavaScript
Метапрограммирование с примерами на JavaScript
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Не бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их многоНе бойся, это всего лишь данные... просто их много
Не бойся, это всего лишь данные... просто их много
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
#MBLTdev: Core Data: особенности использования и синхронизация в iCloud (Avia...
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Devconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbDevconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadb
 
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
Владимир Алаев "Разработка на Node.js: инструменты, библиотеки, сервисы"
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTarget
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
 

Similar to андрей паньгин

Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновАнатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей Смирнов
Ontico
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)
Andrey Smirnov
 
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере ResharperCodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
CodeCamp
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Ontico
 
Cocoa Networking
Cocoa NetworkingCocoa Networking
Cocoa Networking
guest57eb8a
 
По Вашей просьбе, продукты Atlassian в Docker
По Вашей просьбе, продукты Atlassian в DockerПо Вашей просьбе, продукты Atlassian в Docker
По Вашей просьбе, продукты Atlassian в Docker
Gonchik Tsymzhitov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
Serguei Gitinsky
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)
Ontico
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
Alex Chistyakov
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
it-people
 
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Computer Science Club
 

Similar to андрей паньгин (20)

Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновАнатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей Смирнов
 
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса (РИТ-2014)
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?Multithreading in JS. Myth or reality?
Multithreading in JS. Myth or reality?
 
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере ResharperCodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
CodeFest 2013. Скрыган К. — Оптимизация .Net приложений на примере Resharper
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
 
Клиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhoneКлиент-серверные приложения на iPhone
Клиент-серверные приложения на iPhone
 
Cocoa Networking
Cocoa NetworkingCocoa Networking
Cocoa Networking
 
По Вашей просьбе, продукты Atlassian в Docker
По Вашей просьбе, продукты Atlassian в DockerПо Вашей просьбе, продукты Atlassian в Docker
По Вашей просьбе, продукты Atlassian в Docker
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)
 
Оптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на JavaОптимизация производительности нагруженных веб-систем на Java
Оптимизация производительности нагруженных веб-систем на Java
 
JVM: краткий курс общей анатомии
JVM: краткий курс общей анатомииJVM: краткий курс общей анатомии
JVM: краткий курс общей анатомии
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
 
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
Н. Иготти. Виртуализация и виртуальные машины. Лекция 02
 
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
Быстрый и простой способ шардирования MySQL с помощью CUBRID SHARD - 2013 R...
 
Frontera обход испанского интернета
Frontera обход испанского интернетаFrontera обход испанского интернета
Frontera обход испанского интернета
 

More from kuchinskaya (20)

Kharkov
KharkovKharkov
Kharkov
 
Balashov
BalashovBalashov
Balashov
 
Zamyakin
ZamyakinZamyakin
Zamyakin
 
Panfilov
PanfilovPanfilov
Panfilov
 
Platov
PlatovPlatov
Platov
 
Rabovoluk
RabovolukRabovoluk
Rabovoluk
 
Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)Smirnov dependency-injection-techforum(1)
Smirnov dependency-injection-techforum(1)
 
Smirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforumSmirnov reverse-engineering-techforum
Smirnov reverse-engineering-techforum
 
Zacepin
ZacepinZacepin
Zacepin
 
Zagursky
ZagurskyZagursky
Zagursky
 
Haritonov
HaritonovHaritonov
Haritonov
 
Chudov
ChudovChudov
Chudov
 
Bubnov
BubnovBubnov
Bubnov
 
A.pleshkov
A.pleshkovA.pleshkov
A.pleshkov
 
Zenovich
ZenovichZenovich
Zenovich
 
Romanenko
RomanenkoRomanenko
Romanenko
 
Perepelitsa
PerepelitsaPerepelitsa
Perepelitsa
 
Osipov
OsipovOsipov
Osipov
 
Kubasov
KubasovKubasov
Kubasov
 
Kalugin balashov
Kalugin balashovKalugin balashov
Kalugin balashov
 

андрей паньгин

  • 1.
  • 2. Особенности разработки сервера на Java  Архитектура Одноклассников  Сокеты в Java: проблемы и решения  Альтернативный механизм сериализации  Кеширование данных и разделяемая память 2
  • 3. Серверы Одноклассников • 4000 серверов • Web, Business logic, Download, Storage, Remote Services • Все ПО написано на Java Высоконагруженный сервер • 20 тыс. одновременных подключений • 30 тыс. запросов в секунду • Трафик до 1 Gb/s 3
  • 4. Remote Service • Компоненты портала как отдельные сервисы: система сообщений, граф дружб, поиск, лента и т. д. • Внутренняя коммуникация между сервисами long[] friendIds = getConnections (userId) Graph cluster Business logic server List<User> friends = getUsers (friendIds) User service cluster 4
  • 5. RPC сценарий Read Request byte[] request = connection.read(…); Deserialize arguments request → Method method, Object[] args Invoke method Object result = method.invoke(args); Serialize result result → byte[] response Send response connection.write(response); 5
  • 6. Особенности разработки сервера на Java  Архитектура Одноклассников  Сокеты в Java: проблемы и решения  Альтернативный механизм сериализации  Кеширование данных и разделяемая память 6
  • 7. Разработка сервера на Java • java.net (Socket I/O) – Поток на каждое соединение – Максимум 10 тыс. потоков • NIO – Неблокирующие операции read / write – Selector • NIO frameworks – Apache MINA: http://mina.apache.org – Netty: http://netty.io 7
  • 8. Blocking Socket Selector (BLOS) • Сочетает преимущества Selector + Blocking I/O • Поддерживается на уровне ОС, но не в Java Linux BSD Solaris Windows epoll kqueue /dev/poll Completion ports • JNI обертки над системными вызовами – Socket → SocketImpl impl → FileDescriptor fd → int fd 8
  • 9. Архитектура BLOS сервера Acceptor thread Selector 1 Selector 2 read deserialize invoke serialize send read deserialize invoke serialize send Worker thread pool 9
  • 10. Проблемы работы с сетью в Java • Socket – Finalizers => утечка памяти, влияние на GC – Не поддерживается прямой доступ к памяти (Direct ByteBuffers) • SocketChannel (NIO) – Не срабатывают таймауты на I/O операциях – Возможна утечка нативной памяти • Решение: JNI библиотека – Такой подход используется в Tomcat (APR + Tomcat native) – Управление сокетами вручную 10
  • 11. Особенности разработки сервера на Java  Архитектура Одноклассников  Сокеты в Java: проблемы и решения  Альтернативный механизм сериализации  Кеширование данных и разделяемая память 11
  • 12. Важность сериализации в RPC • Затрачиваемое время на кодирование и декодирование • Объем передаваемых по сети данных Read Request Deserialize arguments Invoke method Serialize result Send response 12
  • 13. Способы сериализации в Java • Стандартная Java сериализация – Медленная – Большой объем получаемых данных • JBoss serialization – Не поддерживает простые изменения внутри класса: добавление поля, удаление, изменение типа или порядка полей • Avro, Thrift, Protocol Buffers • Ручная сериализация – Externalizable – Не вариант (тысячи классов!) 13
  • 14. Архитектура сериализации • Типы сериализаторов – Встроенные (примитивные типы, массивы, коллекции) – Сериализатор класса по полям • Каждому сериализатору сопоставляется уникальный 64-битный ID – хеш от имен, типов и порядка полей class Event { String site = “mail.ru”; int year = 2012; UID 7 m a i l . r u 2012 1 boolean started = true; } 14
  • 15. Процедура сериализации • Запись объекта: 1. Serializer serializer = Repository.getByClass(obj.getClass()); 2. outputStream.writeLong(serializer.uid); 3. serializer.write(obj, outputStream); • Чтение объекта: 1. long uid = inputStream.readLong(); 2. Serializer serializer = Repository.getById(uid); 3. Object obj = serializer.read(inputStream); may throw SerializerNotFoundException 15
  • 16. Особенности реализации в Java • Чтение и запись private полей чужих классов – Reflection (медленно!) – sun.misc.Unsafe • Создание экземпляров класса – sun.misc.Unsafe.allocateInstance() – Динамическая генерация байткода ASM framework: http://asm.ow2.org • Обход Java верификатора – Наследование “магического” класса sun.reflect.MagicAccessorImpl 16
  • 17. Производительность • Среднее время запроса: -20% • Сетевой трафик: -50% 17
  • 18. Особенности разработки сервера на Java  Архитектура Одноклассников  Сокеты в Java: проблемы и решения  Альтернативный механизм сериализации  Кеширование данных и разделяемая память 18
  • 19. Что кешировть? • Данные из медленного хранилища (БД) • Результаты вычислений Где кешировть? • В оперативной памяти – Java Heap (не подходит для объемов > 10 GB) – Off-heap memory • На диске или флеш-накопителе 19
  • 20. Доступ к off-heap памяти в Java • Native код (JNI обертки над malloc / free) – Платформозавимый • ByteBuffer.allocateDirect – Размер буфера ≤ 2 GB – Освобождается автоматически при GC – Освобождение вручную: ((sun.nio.ch.DirectBuffer) buf).cleaner().clean(); • MappedByteBuffer (FileChannel.map) • Unsafe.allocateMemory 20
  • 21. Снимки (shapshots) • Решают проблему холодного старта • Должны быть целостными • Способы создания снимков – “Stop-the-world” – Запись по сегментам – Memory-mapped files (MappedByteBuffer.force) – Copy-on-write (fork trick) – Shared memory objects 21
  • 22. Shared Memory • Механизм IPC – POSIX: shm_open + mmap – Windows: CreateFileMapping + MapViewOfFile – Linux: /dev/shm • Создание объекта Shared Memory в Java – new RandomAccessFile("/dev/shm/cache", "rw"); • Отображение в адресное пространство процесса – легальный способ: FileChannel.map – хитрый способ: sun.nio.ch.FileChannelImpl, методы map0 и unmap0 22
  • 23. Реализация off-heap кеша в Java на примере download сервера • Непрерывная область памяти с собственным аллокатором • FIFO (проще, чем LRU) • sun.misc.Unsafe (самый быстрый способ доступа) • Shared Memory (/dev/shm) • Сегментирование ключей по хеш-коду • Блокировка сегмента через ReadWriteLock / Semaphore 23
  • 25. Сравнение производительности • Условия – Linux JDK7u4 64-bit – 1 млн. операций – Значения от 0 до 8 KB 25
  • 26. Примеры • https://github.com/odnoklassniki/shared-memory-cache.git • https://github.com/odnoklassniki/rmi-samples.git Статьи • http://habrahabr.ru/company/odnoklassniki/blog/148139/ Контакты • andrey.pangin@corp.mail.ru • www.odnoklassniki.ru/ap 26
  • 27. СПАСИБО! Андрей Паньгин Ведущий разработчик, Одноклассники andrey.pangin@corp.mail.ru