30
RPC: протокол Thrift на примере проектов Рамблера Александр Шигин

Thrift Hl 2

  • Upload
    ontico

  • View
    2.437

  • Download
    1

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Thrift Hl 2

RPC: протокол Thrift на примере проектов

Рамблера

Александр Шигин

Page 2: Thrift Hl 2

Что такое RPCВыполним наш код на другой

машинеДанные на другой машинеДанных слишком многоМало памяти

Page 3: Thrift Hl 2

Альтернатива: RESTИдея та же самаяREST диктует реализациюГлаголы/существительные

Page 4: Thrift Hl 2

Что бывает в RPCВерсионностьАсинхронность (обычно синхронные)Real timeВнеочередное исполнениеУстойчивость к сбоям

Page 5: Thrift Hl 2

На что еще обратить внимание

Реализация для разных языков одного и того протокола

Бинарный или текстовый формат данных

Page 6: Thrift Hl 2

Какие RPC естьСобственно RPC, если вы

пользовались NFS, то пользовались и RPC

CORBA/DCOM, но это гораздо круче

Page 7: Thrift Hl 2

Какие RPC естьXML-RPCSOAPJSON-RPCJava Remote Method Invocation

Page 8: Thrift Hl 2

Какие RPC естьGoogle protobufFacebook ThriftКаждый может написать свой (RPC

для python'а, используя pickle 183 statement, 281 строка)

Page 9: Thrift Hl 2

Почему мы выбрали ThriftВерсионностьСервер уже есть

TNonblockingServerThreadedServer, ThreadPool

Биндинги почти к чему угодно

Page 10: Thrift Hl 2

Кто использует Thriftfacebooklast.fmPowersetreCAPTCHARambler

Page 11: Thrift Hl 2

Что можно сериализоватьi8, i16, i32, i64 (нет типов без знака)doubleboolstringany (экспериментально)

Page 12: Thrift Hl 2

Составные типыstructmapsetlist

Page 13: Thrift Hl 2

Как это работает

транспорт протокол

processorСерверКлиент

транспорт

Что надо писать самому

Page 14: Thrift Hl 2

ТранспортTSocket, TServerSocketTFileTransportTMemoryTransportTHttpClient

Page 15: Thrift Hl 2

Дополнительный транспорт

TBufferedTransportпытается делать один send/recv на

структуру

TFramedTransportпомощник для использования с

неблокирующими сокетами

Page 16: Thrift Hl 2

ПротоколыTBinaryProtocol (основной)TDenseProtocol (экспериментальный)TJSONProtocol (только c++/java)

Page 17: Thrift Hl 2

СерверTSimpleServerTThreadedServer/TThreadPoolTNonblockingServerTForkedServer (python)

Page 18: Thrift Hl 2

TThread*, TForkedServerсоздают тред/процесс на клиентато есть TThreadPool сервер на 8

тредов может обслужить одновременно только 8 клиентов

Page 19: Thrift Hl 2

TNonblockingServerlibeventтолько TFramedTransportthread на запросс сетью работает только основной

тред

Page 20: Thrift Hl 2

Версионностьвсе поля в структурах нумеруютсяесли поле неизвестно или имеет

неправильный тип, оно пропускается

аргументы функции - тоже структура

Page 21: Thrift Hl 2

Применениедобавляем поля, старый код

продолжает работатьсервисы работают с разными

частями одних и тех же данных

Page 22: Thrift Hl 2

Пример

struct V2{ 1: i8 type, 2: i64 uid,

4: string login}

struct V1{ 1: i8 type,

3: double time, }

struct Full{ 1: i8 type, 2: i64 uid, 3: double time, 4: string login}

Page 23: Thrift Hl 2

Недостаткимало документациинет готовой инфраструктурымаленькое сообщество

Page 24: Thrift Hl 2

Подводные камниесли вас интересует ruby, то только

из svn/gitjava-библиотека не стояла на местеесли у вас FreeBSD, посмотрите jira

или напишите мне (хотя svn/git тоже неплохой выбор)

Page 25: Thrift Hl 2

FreeBSDnet.inet6.ip6.v6only (THRIFT-16)net.inet.tcp.delayed_ack (THRIFT-45)THRIFT-96 иначе в логах слишком

много ошибок будет

Page 26: Thrift Hl 2

Простая проверка

server 1

server 3server 2

Сервер 1 зовет второй, зовет третий, а потом это все раскручиввается назад.

Page 27: Thrift Hl 2

Исходникstruct Stamp { 1: string hostname, 2: double timestamp,}

service Test { list<Stamp> do_loop(1: list<string> hosts)}

Page 28: Thrift Hl 2

Результат

stop: 0.040host: host01.rambler.ru time 0.000host: host02.rambler.ru time 0.005....host: host14.rambler.ru time 0.032host: host15.rambler.ru time 0.035host: host01.rambler.ru time 0.037

Page 29: Thrift Hl 2

Что еще• http://incubator.apache.org/thrift/• Исходники тестов

– 12 строчек клиент– 24 сервер + 18 создание сервера.

Page 30: Thrift Hl 2

Вопросы[email protected]