RPC: протокол Thrift
на примере проектов
     Рамблера
    Александр Шигин
Что такое RPC
Выполним наш код на другой
 машине
Данные на другой машине
Данных слишком много
Мало памяти
Альтернатива: REST
Идея та же самая
REST диктует реализацию
Глаголы/существительные
Что бывает в RPC
Версионность
Асинхронность (обычно синхронные)
Real time
Внеочередное исполнение
Устойчивость к сбоям
На что еще обратить
        внимание
Реализация для разных языков
 одного и того протокола
Бинарный или текстовый формат
 ...
Какие RPC есть
Собственно RPC, если вы
 пользовались NFS, то пользовались
 и RPC
CORBA/DCOM, но это гораздо круче
Какие RPC есть
XML-RPC
SOAP
JSON-RPC
Java Remote Method Invocation
Какие RPC есть
Google protobuf
Facebook Thrift
Каждый может написать свой (RPC
  для python'а, используя pickle 183
  stat...
Почему мы выбрали Thrift
Версионность
Сервер уже есть
 TNonblockingServer
 ThreadedServer, ThreadPool
Биндинги почти к чем...
Кто использует Thrift
facebook
last.fm
Powerset
reCAPTCHA
Rambler
Что можно сериализовать
i8, i16, i32, i64 (нет типов без знака)
double
bool
string
any (экспериментально)
Составные типы
struct
map
set
list
Как это работает
транспорт      транспорт   протокол




Что надо
                Сервер
 писать                    proces...
Транспорт
TSocket, TServerSocket
TFileTransport
TMemoryTransport
THttpClient
Дополнительный
            транспорт
TBufferedTransport
 пытается делать один send/recv на
  структуру
TFramedTransport
 п...
Протоколы
TBinaryProtocol (основной)
TDenseProtocol (экспериментальный)
TJSONProtocol (только c++/java)
Сервер
TSimpleServer
TThreadedServer/TThreadPool
TNonblockingServer
TForkedServer (python)
TThread*, TForkedServer
создают тред/процесс на клиента
то есть TThreadPool сервер на 8
 тредов может обслужить
 одновреме...
TNonblockingServer
libevent
только TFramedTransport
thread на запрос
с сетью работает только основной
  тред
Версионность
все поля в структурах нумеруются
если поле неизвестно или имеет
 неправильный тип, оно
 пропускается
аргумент...
Применение
добавляем поля, старый код
 продолжает работать
сервисы работают с разными
 частями одних и тех же данных
Пример
struct V1          struct Full        struct V2
{                  {                  {
 1: i8 type,        1: i8 t...
Недостатки
мало документации
нет готовой инфраструктуры
маленькое сообщество
Подводные камни
если вас интересует ruby, то только
  из svn/git
java-библиотека не стояла на месте
если у вас FreeBSD, по...
FreeBSD
net.inet6.ip6.v6only (THRIFT-16)
net.inet.tcp.delayed_ack (THRIFT-45)
THRIFT-96 иначе в логах слишком
 много ошибо...
Простая проверка
           Сервер 1 зовет второй,
server 1   зовет третий, а потом
           это все раскручиввается
   ...
Исходник
struct Stamp {
   1: string hostname,
   2: double timestamp,
}

service Test {
  list<Stamp> do_loop(1: list<str...
Результат
stop:   0.040
host:   host01.rambler.ru time 0.000
host:   host02.rambler.ru time 0.005
....
host:   host14.ramb...
Что еще
• http://incubator.apache.org/thrift/
• Исходники тестов
  – 12 строчек клиент
  – 24 сервер + 18 создание сервера.
Вопросы?
shigin@rambler-co.ru
Upcoming SlideShare
Loading in …5
×

Thrift Hl 2

2,803 views

Published on

Published in: Technology, Education

Thrift Hl 2

  1. 1. RPC: протокол Thrift на примере проектов Рамблера Александр Шигин
  2. 2. Что такое RPC Выполним наш код на другой машине Данные на другой машине Данных слишком много Мало памяти
  3. 3. Альтернатива: REST Идея та же самая REST диктует реализацию Глаголы/существительные
  4. 4. Что бывает в RPC Версионность Асинхронность (обычно синхронные) Real time Внеочередное исполнение Устойчивость к сбоям
  5. 5. На что еще обратить внимание Реализация для разных языков одного и того протокола Бинарный или текстовый формат данных
  6. 6. Какие RPC есть Собственно RPC, если вы пользовались NFS, то пользовались и RPC CORBA/DCOM, но это гораздо круче
  7. 7. Какие RPC есть XML-RPC SOAP JSON-RPC Java Remote Method Invocation
  8. 8. Какие RPC есть Google protobuf Facebook Thrift Каждый может написать свой (RPC для python'а, используя pickle 183 statement, 281 строка)
  9. 9. Почему мы выбрали Thrift Версионность Сервер уже есть TNonblockingServer ThreadedServer, ThreadPool Биндинги почти к чему угодно
  10. 10. Кто использует Thrift facebook last.fm Powerset reCAPTCHA Rambler
  11. 11. Что можно сериализовать i8, i16, i32, i64 (нет типов без знака) double bool string any (экспериментально)
  12. 12. Составные типы struct map set list
  13. 13. Как это работает транспорт транспорт протокол Что надо Сервер писать processor Клиент самому
  14. 14. Транспорт TSocket, TServerSocket TFileTransport TMemoryTransport THttpClient
  15. 15. Дополнительный транспорт TBufferedTransport пытается делать один send/recv на структуру TFramedTransport помощник для использования с неблокирующими сокетами
  16. 16. Протоколы TBinaryProtocol (основной) TDenseProtocol (экспериментальный) TJSONProtocol (только c++/java)
  17. 17. Сервер TSimpleServer TThreadedServer/TThreadPool TNonblockingServer TForkedServer (python)
  18. 18. TThread*, TForkedServer создают тред/процесс на клиента то есть TThreadPool сервер на 8 тредов может обслужить одновременно только 8 клиентов
  19. 19. TNonblockingServer libevent только TFramedTransport thread на запрос с сетью работает только основной тред
  20. 20. Версионность все поля в структурах нумеруются если поле неизвестно или имеет неправильный тип, оно пропускается аргументы функции - тоже структура
  21. 21. Применение добавляем поля, старый код продолжает работать сервисы работают с разными частями одних и тех же данных
  22. 22. Пример struct V1 struct Full struct V2 { { { 1: i8 type, 1: i8 type, 1: i8 type, 2: i64 uid, 2: i64 uid, 3: double time, 3: double time, 4: string login 4: string login } } }
  23. 23. Недостатки мало документации нет готовой инфраструктуры маленькое сообщество
  24. 24. Подводные камни если вас интересует ruby, то только из svn/git java-библиотека не стояла на месте если у вас FreeBSD, посмотрите jira или напишите мне (хотя svn/git тоже неплохой выбор)
  25. 25. FreeBSD net.inet6.ip6.v6only (THRIFT-16) net.inet.tcp.delayed_ack (THRIFT-45) THRIFT-96 иначе в логах слишком много ошибок будет
  26. 26. Простая проверка Сервер 1 зовет второй, server 1 зовет третий, а потом это все раскручиввается назад. server 2 server 3
  27. 27. Исходник struct Stamp { 1: string hostname, 2: double timestamp, } service Test { list<Stamp> do_loop(1: list<string> hosts) }
  28. 28. Результат stop: 0.040 host: host01.rambler.ru time 0.000 host: host02.rambler.ru time 0.005 .... host: host14.rambler.ru time 0.032 host: host15.rambler.ru time 0.035 host: host01.rambler.ru time 0.037
  29. 29. Что еще • http://incubator.apache.org/thrift/ • Исходники тестов – 12 строчек клиент – 24 сервер + 18 создание сервера.
  30. 30. Вопросы? shigin@rambler-co.ru

×