Thrift Hl 2

Preview:

DESCRIPTION

 

Citation preview

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

Рамблера

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TNonblockingServerThreadedServer, ThreadPool

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

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

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

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

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

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

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

транспорт

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

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

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

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

структуру

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

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

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

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

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

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

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

тред

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

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

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

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

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

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

Пример

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}

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

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

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

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

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

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

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

server 1

server 3server 2

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

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

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

Результат

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

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

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

Вопросы?shigin@rambler-co.ru

Recommended