Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Бэкенд-винегрет
Как  подружить  разные  
ЯП  на  ваших  серверах

Андрей  Лузин,
2GIS
Зачем?
Зачем?
Зачем?
1.  Возможность  использовать  готовое  решение,  
реализованное  на  другом  ЯП
Зачем: готовые решения
Зачем: готовые решения
Зачем: готовые решения
Зачем?
1. Возможность использовать готовое решение,
реализованное на другом ЯП

2. Выбор  языка под задачу
Зачем: выбор инструмента
Зачем?
1. Возможность использовать готовое решение,
реализованное на другом ЯП

2. Выбор  языка под задачу

3. Возможность  плавной  миграции  проекта  на  
другой  ЯП
Зачем: Миграция  на  другой  ЯП
Как?
Fork / Exec
Fork / Exec
   Прост  в  использовании  
   Универсален  




   Большие  накладные  расходы  на  запуск
   Нет  удобного  механизма  обмена  данными
Модули  / Экстеншены
Модули  / Экстеншены

  Нативное использование



  Далеко  не  все  языки  получится  подружить
  Медленно,  если  модулю  нужно  подгружать  данные,  
  необходимые  для  работы
Daemon + Protocol / API
Свой  протокол
Свой  протокол

  Нет



  Трудозатратно
  В  лучшем  случае  получится  что-то  похожее  на  готовое  
  решение,  в  худшем  нерасширяемый  и  
  трудноподдерживаемый протокол
REST / SOAP / XML-RPC
REST / SOAP / XML-RPC

  Расширяемость
  Широкая  поддержка


  Избыточность и  оверхед
  Транспорт  фиксирован  (HTTP)
Apache Thrift, protobuf,
MessagePack, Apache Avro
Apache Thrift


                   C#
         Java           Objective C
          OCaml     Python Smalltalk
                   С++ Erlang
                                                 Node.js
    Haskell Perl         JavaScript
            C
                PHP Ruby       Action Script 3
Remote Procedure Call
Thrift Workflow
Боевой  пример
Геокодер API 2GIS
Геокодер API 2GIS
GeocoderTypes.thrift
Geocoder.thrift
Компилируем
thrift --gen cpp --gen py Geocoder.thrift
Python client
CPP server
Let’s  dive  into  details
Встроенные  типы
Thrift      Python   C++
i32         int      int32_t
double      float    double
string      str      std::string
list<i32>   []       std::vector<int32_t>
map<i32, { }         std::map<int32_t, std::string>
string>
Перечисления
Структуры
Сервисы
Исключения
Асинхронные  методы
Транспорт  и  протокол
Транспорт
•   HTTP
•   TCP
•   Unix Socket
•   Memory
•   File
Протокол
• JSON
• Binary
• Debug
Версионирование
struct Result
{
       1: required i64 id,
       2: required i32 score,
       3: optional string synonym
}
Версионирование
         Добавляем   Убираем
         поле        поле
Старый
клиент     Isset()     ignore


Старый
Сервер
           ignore      FAIL
И  ещё
SOA vs Monolithic
Классическая  архитектура
Рост  проекта
Рост  проекта
SOA
Ограничения
Ограничения
• Балансировка
• Примитивные  асинхронные  методы
• Stateless
Альтернативы
•   Google protobuf
•   Message Pack
•   Apache Avro - designed with dynamic languages
    in mind
Кто  использует
                  • PHP + Поисковые  бэкенды
                    на  C++
                  • Логгер




                   Внешний  API
Thrift: Итого
•   Кроссязыковый
•   Нативный
•   Гибкий
Вопросы?

Андрей  Лузин,
2ГИС
@dronnix

andrew.luzin@gmail.com

More Related Content

CodeFest 2013. Лузин А. — Бэкенд-винегрет: как подружить разные ЯП на ваших серверах?