View
586
Download
2
Category
Preview:
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>
● whistle_apps@some.domain.com-<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
Илья Ащепков, aii@siplabs.ru
СПАСИБО ЗА ВНИМАНИЕ!
Recommended