Upload
siplabs-communications
View
586
Download
2
Embed Size (px)
Citation preview
Разработка компонент Kazoo
Ащепков Илья, ООО “Сиплэбс”
Архитектура системы KAZOO
SBC
MediaAMQP eCallMgr
Приложения (Whapps)
База данных
Erlang
AMQP
HTTP
SIP
Разработка компонент kazoo
Про что доклад:● Erlang – что это?● Kazoo
● Взаимодействие компонент● Структура директорий● Приложение skel● Получение AMQP-сообщений● Отправка AMQP-сообщений● BigCouch API
● Особенности crossbar● Code style● Тестирование кода● Что почитать
Erlang/OTP: история создания
Разработан компанией Ericsson в 1983-1986 для создания● распределенных● отказоусточивых● параллельных● систем реального времени
Open source с 1998
С++ - 1983
Erlang/OTP: приложения● RabbitMQ● CouchDB (Bigcouch)● Riak● Ejabber● WhatsApp● Сервера Call of duty● Веб-сервер cowboy
Erlang/OTP: компании● Ericsson● Amazon● Yahoo!● Facebook● Github
Kazoo: взаимодействие компонентов● Модель акторов● AMQP
● Exchange● Fanout – доставка во все очереди● Direct – доставка в конкретную очередь● Topic – маршрутизация по ключу
● Хранение данных в bigcouch● Json● Schema
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
Kazoo: структура директорий
/deps/core/applications
Kazoo: структура директорий
/deps● couchbeam● rabbitmq● cowboy● lager
Стороние проекты
Kazoo: структура директорий
/deps/core
● whistle● kazoo_transform
● whistle_apps● whapps_controller
Могут зависеть от других приложений core и от любых приложений deps
Kazoo: структура директорий
/deps/core/applications
● doc – документация пользователя● test● src
● modules (crossbar/callflow/doodle/konami)● ebin – скомпилированные файлы● priv – специальные файлы
Могут зависеть от приложений deps и core и не должны зависеть друг от друга.
Kazoo: applications/skel
applications/skel
● Makefile● PROJECT
● test● doc● src
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
Kazoo: applications/skel/src
applications/skel/src/skel_sup.erl
Kazoo: applications/skel/src
applications/skel/src/skel_sup.erl
Kazoo: applications/skel/src
applications/skel/src/skel_sup.erl
Kazoo: макросы потомков супервизора● ?WORKER/1● ?CACHE/1● ?SUPER/1
Kazoo: макросы рабочих супервизора● ?WORKER/1● ?WORKER_ARGS/2● ?WORKER_TYPE/2● ?WORKER_ARGS_TYPE/3● ?WORKER_NAME_ARGS/3● ?WORKER_NAME_ARGS_TYPE/4
Kazoo: макросы рабочих супервизора● ?CACHE(Name)
● ?WORKER(Name, 'wh_cache', [Name])
● ?CACHE_ARGS(Name, Args)● ?WORKER(Name, 'wh_cache', [Name | Args])
Kazoo: макросы супервизоров● ?SUPER/1● ?SUPER_TYPE/2● ?SUPER_ARGS/2● ?SUPER_ARGS_TYPE/3● ?SUPER_NAME_ARGS_TYPE/4
Kazoo: applications/skel/src
applications/skel/src/skel_sup.erl
Kazoo: gen_listener
applications/skel/src/skel_listener.erl
Kazoo: gen_listener
applications/skel/src/skel_listener.erl
● gen_server
Kazoo: gen_listener
applications/skel/src/skel_listener.erl● gen_server
Kazoo: gen_listener
applications/skel/src/skel_listener.erl● gen_server
Kazoo: gen_listener queue
?QUEUE_NAME● <node>-<pid>-<random>
● [email protected]<0.123.2>-a1b2c3
● При использовании фиксированного имени поведение будет зависить от типа amqp exchange
Kazoo: gen_listener bindings
Kazoo: gen_listener bindings
{Api, Options}
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
Kazoo: amqp api
/core/whistle/src/api/wapi_*:● создание exchange (declare_exchanges/0)● подписка (bind_q/2, unbind_q/2)● публикация сообщений (publish_*/*)● валидация сообщений (req_v/1)
Kazoo: gen_listener responders
Kazoo: gen_listener responders
● {EventCategory, EventType}● {EventCategory, <<”*”>>}● {<<”*”>>, EventType}● {<<”*”>>, <<”*”>>}
Kazoo: gen_listener responders
{Module, Fun}Module → {Module, 'handle_req'}
Kazoo: gen_listener responders
Module:Fun(Event, Options)● skel_listener:handle_event/2
● {'reply', Options}● Options – proplist
● 'ignore'● выполняется в другом процессе● нет возможности изменить State
Kazoo: gen_listener
● Не будет никаких сообщений пока эти сообщения не придут
Kazoo: AMQP API
/core/whistle/src/api/wapi_*:● создание exchange (declare_exchanges/0)● подписка (bind_q/2, unbind_q/2)● публикация сообщений (publish_*/*)● валидация сообщений (req_v/1)
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_*
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
Kazoo: bigcouch API
couch_mgr● open_cache_doc/2
● DbName● DocId
● save_doc/2● DbName● Doc
● save_docs/2
Kazoo: bigcouch API
couch_mgr● get_results/2,3
● DbName● ViewName● Options
● 'include_docs'● 'key' – может вернуть несколько значений● 'keys'● 'reduce'● 'startkey'● 'limit'
Kazoo: bigcouch API
crossbar_doc● load/2,3
● DocId● Context
● load_view/3,4● ViewName● Options● Context● NormalizationFun/2
Kazoo: code style
Атомы заключаются в '● 'atom'
● элемент списка/кортежа на новой строке● [ListItem● ,AnotherItem]
● Допустимо использовать один case, не глубже● Не используйте анонимные функции● Используйте макросы ?MILLISECONDS_IN_SECOND?MILLISECONDS_IN_HOUR
Kazoo: инструменты разработчика
make testmake dialyzemake xref
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
Илья Ащепков, [email protected]
СПАСИБО ЗА ВНИМАНИЕ!