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

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