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
statement, 281 строка)
Почему мы выбрали Thrift
Версионность
Сервер уже есть
TNonblockingServer
ThreadedServer, ThreadPool
Биндинги почти к чему угодно
Кто использует Thrift
facebook
last.fm
Powerset
reCAPTCHA
Rambler
Что можно сериализовать
i8, i16, i32, i64 (нет типов без знака)
double
bool
string
any (экспериментально)
Составные типы
struct
map
set
list
Как это работает
транспорт транспорт протокол
Что надо
Сервер
писать processor
Клиент
самому
Транспорт
TSocket, TServerSocket
TFileTransport
TMemoryTransport
THttpClient
Дополнительный
транспорт
TBufferedTransport
пытается делать один send/recv на
структуру
TFramedTransport
помощник для использования с
неблокирующими сокетами
TThread*, TForkedServer
создают тред/процесс на клиента
то есть TThreadPool сервер на 8
тредов может обслужить
одновременно только 8 клиентов
TNonblockingServer
libevent
только TFramedTransport
thread на запрос
с сетью работает только основной
тред
Версионность
все поля в структурах нумеруются
если поле неизвестно или имеет
неправильный тип, оно
пропускается
аргументы функции - тоже структура
Применение
добавляем поля, старый код
продолжает работать
сервисы работают с разными
частями одних и тех же данных
Пример
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
} } }
Недостатки
мало документации
нет готовой инфраструктуры
маленькое сообщество
Подводные камни
если вас интересует ruby, то только
из svn/git
java-библиотека не стояла на месте
если у вас FreeBSD, посмотрите jira
или напишите мне (хотя svn/git
тоже неплохой выбор)
FreeBSD
net.inet6.ip6.v6only (THRIFT-16)
net.inet.tcp.delayed_ack (THRIFT-45)
THRIFT-96 иначе в логах слишком
много ошибок будет
Простая проверка
Сервер 1 зовет второй,
server 1 зовет третий, а потом
это все раскручиввается
назад.
server 2 server 3
Исходник
struct Stamp {
1: string hostname,
2: double timestamp,
}
service Test {
list<Stamp> do_loop(1: list<string> hosts)
}
Результат
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
Что еще
• http://incubator.apache.org/thrift/
• Исходники тестов
– 12 строчек клиент
– 24 сервер + 18 создание сервера.
0 comments
Post a comment