kazoomeetup moscow 2015. Илья Ащепков. Разработка компонент kazoo

46
Разработка компонент Kazoo Ащепков Илья, ООО “Сиплэбс”

Upload: siplabs-communications

Post on 18-Feb-2017

592 views

Category:

Internet


2 download

TRANSCRIPT

Page 1: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Разработка компонент Kazoo

Ащепков Илья, ООО “Сиплэбс”

Page 2: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Архитектура системы KAZOO

SBC

MediaAMQP eCallMgr

Приложения (Whapps)

База данных

Erlang

AMQP

HTTP

SIP

Page 3: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Разработка компонент kazoo

Про что доклад:● Erlang – что это?● Kazoo

● Взаимодействие компонент● Структура директорий● Приложение skel● Получение AMQP-сообщений● Отправка AMQP-сообщений● BigCouch API

● Особенности crossbar● Code style● Тестирование кода● Что почитать

Page 4: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Erlang/OTP: история создания

Разработан компанией Ericsson в 1983-1986 для создания● распределенных● отказоусточивых● параллельных● систем реального времени

Open source с 1998

С++ - 1983

Page 5: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Erlang/OTP: приложения● RabbitMQ● CouchDB (Bigcouch)● Riak● Ejabber● WhatsApp● Сервера Call of duty● Веб-сервер cowboy

Page 6: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Erlang/OTP: компании● Ericsson● Amazon● Yahoo!● Facebook● Github

Page 7: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: взаимодействие компонентов● Модель акторов● AMQP

● Exchange● Fanout – доставка во все очереди● Direct – доставка в конкретную очередь● Topic – маршрутизация по ключу

● Хранение данных в bigcouch● Json● Schema

Page 8: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo

git clone https://github.com/2600hz/kazoocd kazoomake./scripts/dev-start-apps.sh./scripts/dev-start-ecallmgr.sh

https://2600hz.atlassian.net/wiki/display/Dedicated/Manually+installing+on+Ubuntu

Page 9: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: структура директорий

/deps/core/applications

Page 10: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: структура директорий

/deps● couchbeam● rabbitmq● cowboy● lager

Стороние проекты

Page 11: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: структура директорий

/deps/core

● whistle● kazoo_transform

● whistle_apps● whapps_controller

Могут зависеть от других приложений core и от любых приложений deps

Page 12: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: структура директорий

/deps/core/applications

● doc – документация пользователя● test● src

● modules (crossbar/callflow/doodle/konami)● ebin – скомпилированные файлы● priv – специальные файлы

Могут зависеть от приложений deps и core и не должны зависеть друг от друга.

Page 13: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: applications/skel

applications/skel

● Makefile● PROJECT

● test● doc● src

Page 14: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: applications/skel/src

applications/skel/src

● skel.app.src● skel.hrl

● APP_NAME● APP_VERSION

● skel.erl● start_deps()● declare_exchanges()

● skel_app.erl

Page 15: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: applications/skel/src

applications/skel/src/skel_sup.erl

Page 16: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: applications/skel/src

applications/skel/src/skel_sup.erl

Page 17: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: applications/skel/src

applications/skel/src/skel_sup.erl

Page 18: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: макросы потомков супервизора● ?WORKER/1● ?CACHE/1● ?SUPER/1

Page 19: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: макросы рабочих супервизора● ?WORKER/1● ?WORKER_ARGS/2● ?WORKER_TYPE/2● ?WORKER_ARGS_TYPE/3● ?WORKER_NAME_ARGS/3● ?WORKER_NAME_ARGS_TYPE/4

Page 20: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: макросы рабочих супервизора● ?CACHE(Name)

● ?WORKER(Name, 'wh_cache', [Name])

● ?CACHE_ARGS(Name, Args)● ?WORKER(Name, 'wh_cache', [Name | Args])

Page 21: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: макросы супервизоров● ?SUPER/1● ?SUPER_TYPE/2● ?SUPER_ARGS/2● ?SUPER_ARGS_TYPE/3● ?SUPER_NAME_ARGS_TYPE/4

Page 22: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: applications/skel/src

applications/skel/src/skel_sup.erl

Page 23: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener

applications/skel/src/skel_listener.erl

Page 24: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener

applications/skel/src/skel_listener.erl

● gen_server

Page 25: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener

applications/skel/src/skel_listener.erl● gen_server

Page 26: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener

applications/skel/src/skel_listener.erl● gen_server

Page 27: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener queue

?QUEUE_NAME● <node>-<pid>-<random>

[email protected]<0.123.2>-a1b2c3

● При использовании фиксированного имени поведение будет зависить от типа amqp exchange

Page 28: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener bindings

Page 29: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener bindings

{Api, Options}

Page 30: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener bindings

● asr● authn● authz● blackhole● call● conf● conference● delegate● dialplan● fs● hangouts● media

● metaflow● money● nodes● notifications● offnet_resource● presence● rate● registration● route● self● sms● switch● sysconf

Page 31: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: amqp api

/core/whistle/src/api/wapi_*:● создание exchange (declare_exchanges/0)● подписка (bind_q/2, unbind_q/2)● публикация сообщений (publish_*/*)● валидация сообщений (req_v/1)

Page 32: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener responders

Page 33: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener responders

● {EventCategory, EventType}● {EventCategory, <<”*”>>}● {<<”*”>>, EventType}● {<<”*”>>, <<”*”>>}

Page 34: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener responders

{Module, Fun}Module → {Module, 'handle_req'}

Page 35: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener responders

Module:Fun(Event, Options)● skel_listener:handle_event/2

● {'reply', Options}● Options – proplist

● 'ignore'● выполняется в другом процессе● нет возможности изменить State

Page 36: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: gen_listener

● Не будет никаких сообщений пока эти сообщения не придут

Page 37: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: AMQP API

/core/whistle/src/api/wapi_*:● создание exchange (declare_exchanges/0)● подписка (bind_q/2, unbind_q/2)● публикация сообщений (publish_*/*)● валидация сообщений (req_v/1)

Page 38: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: AMQP API● wh_amqp_worker:cast/2

● publish_fun/1● wh_amqp_worker:call/3,4

● publish_fun/1● is_answer_acceptable/1● timeout

● wapi_*:publish_*

Page 39: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: AMQP API● wapi_*:req_v/1

● Headers● Values● Types

● wh_api:default_headers/2● Application name● Application version

● wh_api:default_headers/4● Event category● Event name

Page 40: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: bigcouch API

couch_mgr● open_cache_doc/2

● DbName● DocId

● save_doc/2● DbName● Doc

● save_docs/2

Page 41: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: bigcouch API

couch_mgr● get_results/2,3

● DbName● ViewName● Options

● 'include_docs'● 'key' – может вернуть несколько значений● 'keys'● 'reduce'● 'startkey'● 'limit'

Page 42: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: bigcouch API

crossbar_doc● load/2,3

● DocId● Context

● load_view/3,4● ViewName● Options● Context● NormalizationFun/2

Page 43: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: code style

Атомы заключаются в '● 'atom'

● элемент списка/кортежа на новой строке● [ListItem● ,AnotherItem]

● Допустимо использовать один case, не глубже● Не используйте анонимные функции● Используйте макросы ?MILLISECONDS_IN_SECOND?MILLISECONDS_IN_HOUR

Page 44: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: инструменты разработчика

make testmake dialyzemake xref

Page 45: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Kazoo: литература для разработчика

● https://github.com/2600hz/kazoo● http://www.erlang.org● http://learnyousomeerlang.com● https://www.rabbitmq.com/tutorials/amqp-concepts.html● http://json-schema.org● https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views● https://wiki.apache.org/couchdb/HTTP_view_API

Page 46: KAZOOMEETUP MOSCOW 2015. Илья Ащепков. Разработка компонент KAZOO

Илья Ащепков, [email protected]

СПАСИБО ЗА ВНИМАНИЕ!