thrift hl 2
DESCRIPTION
TRANSCRIPT
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 создание сервера.
Вопросы[email protected]