WAMP как основа
композитных
SOA-приложений и
его реализация на Lua
Константин Буркалёв
@KSDaemon
Пара слов о себе…
2
• Системный архитектор
• 15+ лет опыта в ИТ
• Автор и ведущий подкастов о разработке: SDCast & RadioJS
• Активный участник группы разработки самого протокола WAMP
• Автор и мейнтейнер нескольких реализаций WAMP, в том числе
и на Lua
План доклада
Пример системы с применением WAMP
Что такое протокол WAMP, и как он устроен
WAMP как основа SOA-решений
Сферы применения
WAMP-клиент на Lua
WAMP-роутер на Nginx/Lua
3
Ванная
Комната
Задача: Система «Умный дом»
4
Пользователь
Админ
Система включает
кондиционер
Температура в комнате снижаетсяСистема выключает кондиционерДатчик температуры фиксирует
превышение температуры
Оповещается клиент
Логируется в базу
Влажность в ванной поднимаетсяОповещается клиент
Логируется в базу
Система включает
вентилятор
Влажность в ванной снижаетсяСистема выключает вентиляторАдмин настраивает
пороговые значения
Админ производит поиск
новых устройств
Система информирует о
найденных устройствах
Что такое WAMP
• Расшифровывается как «Web Application Messaging Protocol»
• Предназначен для коммуникации между программными
компонентами практически в режиме реального времени
• Предоставляет два механизма:
• Publish/Subscribe (PubSub)
• Remote Procedure Calls (RPC)
• Двунаправленный, упорядоченный
• Для общения клиентов требуется WAMP-роутер
5
Почему WAMP?
•Открытая спецификация
• Продуманный Publish/Subscribe
• Продуманный Remote Procedure Calls
• Роутинг сообщений
• Кроссплатформенность
• Есть реализации более чем на 15 языках
6
Альтернативы WAMP
7
Technology PubSub RPC Routed RPC Web native
Cross
Language
Open
Standard
WAMP ✔ ✔ ✔ ✔ ✔ ✔
AJAX - ✔ - ✔ ✔ -
AMQP ✔ (✔) - - ✔ ✔
Java JMS ✔ - - - - ✔
JSON-RPC - ✔ - ✔ ✔ ✔
MQTT ✔ - - - ✔ ✔
REST - ✔ - ✔ ✔ -
WAMP: Пример сообщений
8
Архитектура WAMP
9
Архитектура WAMP
10
Клиент.
Может предоставлять
или потреблять
ресурсы, такие как
подписки и RPC.
Архитектура WAMP
11
Роутер.
Занимается
авторизацией и
маршрутизацией
сообщений
между клиентами.
Архитектура WAMP
12
Peer, узел.
Может быть клиентом
или роутером,
должен обладать
хотя бы одной ролью.
Архитектура WAMP
13
Роль.
Определяет
возможности узла.
Есть 4 клиентских
роли и 2 роли роутера.
Архитектура WAMP
14
Сессия.
Необходима для
идентификации и
авторизации клиентов,
анонса ролей узлов.
Архитектура WAMP
15
Realm.
Домен, namespace,
единое пространство
в рамках которого
определены ресурсы
и происходит роутинг
сообщений.
Архитектура WAMP
16
Транспорт.
Можно использовать:
WebSockets, Raw TCP,
Unix sockets и даже
HTTP Long poll.
Архитектура WAMP
17
Сериализатор.
Все сообщения
сериализуются
с помощью
JSON/MessagePack/
CBOR.
message
Архитектура WAMP
18
Идентификаторы
ресурсов, URI.
Необходимы для
топиков, процедур
и ошибок.
Например:
Topic: «sensor.events»
RPC: «discover.devices»
message
Основные понятия WAMP
• Клиент. Может предоставлять или потреблять ресурсы, такие как подписки и RPC.
• Роутер. Занимается авторизацией и маршрутизацией сообщений между клиентами.
• Peer, узел. Может быть клиентом или роутером, должен обладать хотя бы одной ролью.
• Роль. Определяет возможности узла. Есть 4 клиентских роли и 2 роли роутера.
• Сессия. Необходима для идентификации и авторизации клиентов, анонса ролей узлов.
• Realm. Домен, namespace, в рамках которого происходит роутинг сообщений.
• Транспорт. Можно использовать: WebSockets, Raw TCP, Unix sockets и даже HTTP Long poll.
• Сериализатор. Cообщения сериализуются с помощью JSON/MessagePack/CBOR
• Идентификаторы ресурсов, URI. Необходимы для топиков, процедур и ошибок.
19
WAMP: Features
• Basic profile: базовые возможности RPC и PubSub
• Advanced profile:
• Challenge-Response Authentication
• Progressive call results, call timeout, call canceling
• Publication / call trust levels
• Caller / publisher identification
• Pattern based registration / subscription
• Shared registration, sharded registration / subscription
• Event history
• Meta API & Procedure / topic reflection
20
WAMP: установка сессии
21
HELLO
WELCOME
GOODBYE (init by client)
ABORT
GOODBYE
GOODBYE
GOODBYE (init by router)
Клиент Роутер
Realm
[1, "homeapp", { "roles": { "publisher": {}, "subscriber": {} } }][2, 9129137332, { "roles": { "broker": {} } }][3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"][6, {"message": "The host is shutting down now."}, "wamp.error.system_shutdown"][6, {}, "wamp.error.goodbye_and_out"][6, {}, "wamp.error.close_realm"][6, {}, "wamp.error.goodbye_and_out"]
WAMP: Publish / Subscribe
22
SUBSCRIBE
SUBSCRIBED
UNSUBSCRIBE
UNSUBSCRIBED
ERROR
ERROR
PUBLISH
PUBLISHED
ERROR
EVENT
Publisher Broker Subscriber
Realm
[32, 713845233, {}, "sensor.events"][33, 713845233, 5512315355][8, 32, 713845233, {}, "wamp.error.not_authorized"][34, 85346237, 5512315355][35, 85346237][8, 34, 85346237, {}, "wamp.error.no_such_subscription"][16, 239714735, {}, "sensor.events", [], {"sensorId ": 25, "temp": 27}][17, 239714735, 4429313566][8, 16, 239714735, {}, "wamp.error.not_authorized"][36, 5512315355, 4429313566, {}, [], {"sensorId ": 25, "temp": 27}]
WAMP: Remote Procedure Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
UNREGISTER
UNREGISTERED
ERROR
ERROR
CALL
RESULT
INVOCATION
YIELD
ERROR
ERROR
Realm
[64, 25349185, {}, "dcs.fan.control"][65, 25349185, 2103333224][8, 64, 25349185, {}, "wamp.error.procedure_already_exists"][66, 788923562, 2103333224][67, 788923562][8, 66, 788923562, {}, "wamp.error.no_such_registration"][48, 7814135, {}, "dcs.fan.control", [true]][68, 6131533, 9823528, {}, [true]][70, 6131533, {}][8, 68, 6131533, {}, "homeapp.error.hardware_not_found"][50, 7814135, {}][8, 48, 7814135, {}, "homeapp.error.hardware_not_found"]
WAMP как основа SOA-решений
Распределённая архитектура
Слабая связанность компонентов
Простой и понятный интерфейс взаимодействия
Унифицированная маршрутизация
Независимость от языка программирования
Переиспользуемость компонентов
WAMP удовлетворяет требованиям SOA
24
WAMP в качестве ESB
25
WAMP
Router
Service
Providers
Service
Providers
Service
Providers
Service
Providers
Service
Providers
Consumers
Consumers
Consumers
Consumers
Consumers
Вызывают RPC
Подписываются
на топики
Регистрируют RPC
Публикуют события
Подписываются
на топики
Публикуют события
Сервер
Сервер
Сервер
WAMP в гетерогенных системах
26
WAMP
Router
File
uploader
(python)
Web
Client
(js)
Backoffice
Client
(c#)
Video
processing
(c++)
Image
processing
(go)
Logger
(ruby)
External
API
Gateway
Client
REST API
(nodejs)
Mobile
Client
(swift)
Backoffice
REST API
(Java)
DB
Mobile
Client
(java)
Realm
Realm
Realm
Сервер
Сервер
Сервер
Сферы применения WAMP
27
Распределённые приложения с большим количеством сервисов
Smart homes, Smart cities, Интернет вещей в целом
Системы с долго выполняющимися процессами
Лёгкая современная альтернатива XMPP, XMLRPC
Сетевые игры
Применение WAMP: реальные проекты
• Kadecot API Server. Sony Computer Science Laboratories
• ParaView. Parallel Data Analysis and Visualization Application, Kitware
• Record.Evolution. Data-warehouse and Business Intelligence
• SmartME smart city project. MDS Lab at the University of Messina
• ButterflyDNS. Web UI frontend for BIND DLZ
• Подсистема управления серверами Gollard VISION
28
Health monitor
Nginx
Подсистема управления сервером
29
WAMP
Router
Admin
App
(c#)
Shaman
RPC: set.network
RPC: get.network Publish: status.change
RPC: get.status
RPC: get.time
RPC: set.time
Loowy: WAMP-клиент на Lua
30
• Работает в Lua/Luajit на базе lua-ev
• Поддерживает JSON- и Msgpack-сериализаторы
• Поддерживает ряд фич из Advanced Profile
• Автоматическое переподключение и переподписка
• TODO: Raw socket transport
• TODO: Meta API
• TODO: Challenge-Response Authorization (WAMP-CRA)
• TODO: работа на основе сопрограмм (coroutines)
Loowy: примеры вызовов
31
client = loowy.new("ws://localhost/ws/", { realm = "gv" })
client:publish('sensor.events', { sensorId = 12, temperature = 27})
client:subscribe('sensor.events', function(event)
-- process received event
end)
client:call('dcs.fan.control', true, {
onSuccess = function()
-- fan turned on successfully
end,
onError = function(err)
-- error occurred
end
})
Loowy: Стек технологий
32
• Lua 5.1+, Luajit 2.0
• lua-websockets (который работает через luasocket)
• lua-ev
• lua-rapidjson
• lua-MessagePack (опционально)
Wiola: WAMP роутер на Lua
• Работает на базе Nginx/Lua module
• Использует Redis для runtime storage
• Поддерживает JSON- и MessagePack-сериализаторы
• Поддерживает ряд фич из Advanced Profile
• TODO: Raw socket transport
• TODO: Meta API
• TODO: lua-resty-postgres
33
Wiola: стек технологий
34
• Nginx или OpenResty, проще говоря lua-nginx-module
• lua-resty-websocket
• lua-resty-redis
• Redis Server
• lua-rapidjson
• lua-resty-hmac (опционально, нужен для WAMP-CRA)
• lua-MessagePack (опционально)
Wiola: конфиг Nginx
35
location /ws/ {
set $wiola_socket_timeout 10;
set $wiola_max_payload_len 65535;
lua_check_client_abort on;
header_filter_by_lua_file /lib/wiola/headers.lua;
content_by_lua_file /lib/wiola/handler.lua;
}
Nginx
Wiola: Общая схема
36
Web
Client
init_by_lua
headers_filter_by_lua
content_by_lua
Redis
Server
Wiola: Особенности. JSON
• cJSON
• нельзя указать способ сериализации пустых таблиц
• lua-resty-libcjson
• не умеет работать с большими числами (int > 32bit)
lua-rapidjson
• пока новых проблем не нашлось :)
37
Wiola: Особенности. Runtime-хранилище
38
• Глобальные переменные в памяти
• Создаются каждый раз на request handler
• проблемы с concurrent requests
• Переменные модуля, загружаемого в init_by_lua
• Читать можно во всех воркерах
• Но запись, спасибо CoW, создаст свою копию модуля для VM
• ngx.shared.DICT
• Размер каждого словаря задаётся в конфиге и не может изменяться
Внешнее хранилище: Redis, Memcache, PostgreSQL, MySQL и прочие
Wiola: Особенности. lua_code_cache
39
• lua_code_cache off;
• удобно отлаживать код
• каждый require() выполняется заново в каждом запросе
• даже модули, загруженные в init_by_lua, выполняются заново
• lua_code_cache on;
• для production-окружения
• каждый require() выполняется один раз и кэшируется
• при любом изменении кода необходимо перегружать nginx
Wiola: Публикация в luarocks, opm
40
• luarocks: есть одна часть
зависимостей, нет
другой:
- lua-resty-websocket
- lua-resty-redis
✓ rapidjson
✓ lua-resty-hmac
✓ lua-messagepack
• opm (OpenResty Package
Manager): с точностью до
«наоборот»:
✓ lua-resty-websocket
✓ lua-resty-redis
- rapidjson
✓ lua-resty-hmac
- lua-messagepack
Полезные ссылки про WAMP
• Основной сайт про WAMP: http://wamp-proto.org/
• Спека WAMP на github: github.com/wamp-proto/wamp-proto
• Mailing list: https://groups.google.com/forum/#!forum/wampws
• Wiola: https://github.com/KSDaemon/wiola
• Loowy: https://github.com/KSDaemon/Loowy
• Wampy.js: https://github.com/KSDaemon/wampy.js
• Wiola docker image: https://hub.docker.com/r/421p/wiola/
• Crossbar Router: https://crossbar.io/ и https://demo.crossbar.io/
41
WAMP: Заключение
• Простой и открытый протокол
• RPC и PubSub в одном транспорте/протоколе
• Любой транспорт и сериализация
• Позволяет строить распределённые приложения
со слабосвязанными компонентами
• Есть реализации во многих языках
• Open source
• Небольшое, но дружелюбное сообщество
42
WAMP: Заключение
• Полезное архитектурное решение
• Отличный вариант для IoT-проекта!(имхо: лучше чем MQTT)
• Попробуйте WAMP:
• Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router)
• Используете docker?
• docker pull 421p/wiola
• docker pull crossbario/crossbar
• WAMP-клиент на любой вкус и цвет (wamp-proto.org/implementations/)
43
Спасибо за внимание!
И ваши вопросы :)
44
Константин Буркалёв
• Mail: kostik@ksdaemon.ru
• Twitter: @KSDaemon
• GitHub: KSDaemon
• Blog: blog.ksdaemon.ru
• SDCast: sdcast.ksdaemon.ru

WAMP[-proto] как основа композитных SOA-приложений и его имплементация на Lua / Константин Буркалев (РКСС)

  • 1.
    WAMP как основа композитных SOA-приложенийи его реализация на Lua Константин Буркалёв @KSDaemon
  • 2.
    Пара слов осебе… 2 • Системный архитектор • 15+ лет опыта в ИТ • Автор и ведущий подкастов о разработке: SDCast & RadioJS • Активный участник группы разработки самого протокола WAMP • Автор и мейнтейнер нескольких реализаций WAMP, в том числе и на Lua
  • 3.
    План доклада Пример системыс применением WAMP Что такое протокол WAMP, и как он устроен WAMP как основа SOA-решений Сферы применения WAMP-клиент на Lua WAMP-роутер на Nginx/Lua 3
  • 4.
    Ванная Комната Задача: Система «Умныйдом» 4 Пользователь Админ Система включает кондиционер Температура в комнате снижаетсяСистема выключает кондиционерДатчик температуры фиксирует превышение температуры Оповещается клиент Логируется в базу Влажность в ванной поднимаетсяОповещается клиент Логируется в базу Система включает вентилятор Влажность в ванной снижаетсяСистема выключает вентиляторАдмин настраивает пороговые значения Админ производит поиск новых устройств Система информирует о найденных устройствах
  • 5.
    Что такое WAMP •Расшифровывается как «Web Application Messaging Protocol» • Предназначен для коммуникации между программными компонентами практически в режиме реального времени • Предоставляет два механизма: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) • Двунаправленный, упорядоченный • Для общения клиентов требуется WAMP-роутер 5
  • 6.
    Почему WAMP? •Открытая спецификация •Продуманный Publish/Subscribe • Продуманный Remote Procedure Calls • Роутинг сообщений • Кроссплатформенность • Есть реализации более чем на 15 языках 6
  • 7.
    Альтернативы WAMP 7 Technology PubSubRPC Routed RPC Web native Cross Language Open Standard WAMP ✔ ✔ ✔ ✔ ✔ ✔ AJAX - ✔ - ✔ ✔ - AMQP ✔ (✔) - - ✔ ✔ Java JMS ✔ - - - - ✔ JSON-RPC - ✔ - ✔ ✔ ✔ MQTT ✔ - - - ✔ ✔ REST - ✔ - ✔ ✔ -
  • 8.
  • 9.
  • 10.
    Архитектура WAMP 10 Клиент. Может предоставлять илипотреблять ресурсы, такие как подписки и RPC.
  • 11.
  • 12.
    Архитектура WAMP 12 Peer, узел. Можетбыть клиентом или роутером, должен обладать хотя бы одной ролью.
  • 13.
  • 14.
    Архитектура WAMP 14 Сессия. Необходима для идентификациии авторизации клиентов, анонса ролей узлов.
  • 15.
    Архитектура WAMP 15 Realm. Домен, namespace, единоепространство в рамках которого определены ресурсы и происходит роутинг сообщений.
  • 16.
  • 17.
  • 18.
    Архитектура WAMP 18 Идентификаторы ресурсов, URI. Необходимыдля топиков, процедур и ошибок. Например: Topic: «sensor.events» RPC: «discover.devices» message
  • 19.
    Основные понятия WAMP •Клиент. Может предоставлять или потреблять ресурсы, такие как подписки и RPC. • Роутер. Занимается авторизацией и маршрутизацией сообщений между клиентами. • Peer, узел. Может быть клиентом или роутером, должен обладать хотя бы одной ролью. • Роль. Определяет возможности узла. Есть 4 клиентских роли и 2 роли роутера. • Сессия. Необходима для идентификации и авторизации клиентов, анонса ролей узлов. • Realm. Домен, namespace, в рамках которого происходит роутинг сообщений. • Транспорт. Можно использовать: WebSockets, Raw TCP, Unix sockets и даже HTTP Long poll. • Сериализатор. Cообщения сериализуются с помощью JSON/MessagePack/CBOR • Идентификаторы ресурсов, URI. Необходимы для топиков, процедур и ошибок. 19
  • 20.
    WAMP: Features • Basicprofile: базовые возможности RPC и PubSub • Advanced profile: • Challenge-Response Authentication • Progressive call results, call timeout, call canceling • Publication / call trust levels • Caller / publisher identification • Pattern based registration / subscription • Shared registration, sharded registration / subscription • Event history • Meta API & Procedure / topic reflection 20
  • 21.
    WAMP: установка сессии 21 HELLO WELCOME GOODBYE(init by client) ABORT GOODBYE GOODBYE GOODBYE (init by router) Клиент Роутер Realm [1, "homeapp", { "roles": { "publisher": {}, "subscriber": {} } }][2, 9129137332, { "roles": { "broker": {} } }][3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"][6, {"message": "The host is shutting down now."}, "wamp.error.system_shutdown"][6, {}, "wamp.error.goodbye_and_out"][6, {}, "wamp.error.close_realm"][6, {}, "wamp.error.goodbye_and_out"]
  • 22.
    WAMP: Publish /Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE UNSUBSCRIBED ERROR ERROR PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm [32, 713845233, {}, "sensor.events"][33, 713845233, 5512315355][8, 32, 713845233, {}, "wamp.error.not_authorized"][34, 85346237, 5512315355][35, 85346237][8, 34, 85346237, {}, "wamp.error.no_such_subscription"][16, 239714735, {}, "sensor.events", [], {"sensorId ": 25, "temp": 27}][17, 239714735, 4429313566][8, 16, 239714735, {}, "wamp.error.not_authorized"][36, 5512315355, 4429313566, {}, [], {"sensorId ": 25, "temp": 27}]
  • 23.
    WAMP: Remote ProcedureCalls 23 Caller Dealer Callee REGISTER REGISTERED UNREGISTER UNREGISTERED ERROR ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm [64, 25349185, {}, "dcs.fan.control"][65, 25349185, 2103333224][8, 64, 25349185, {}, "wamp.error.procedure_already_exists"][66, 788923562, 2103333224][67, 788923562][8, 66, 788923562, {}, "wamp.error.no_such_registration"][48, 7814135, {}, "dcs.fan.control", [true]][68, 6131533, 9823528, {}, [true]][70, 6131533, {}][8, 68, 6131533, {}, "homeapp.error.hardware_not_found"][50, 7814135, {}][8, 48, 7814135, {}, "homeapp.error.hardware_not_found"]
  • 24.
    WAMP как основаSOA-решений Распределённая архитектура Слабая связанность компонентов Простой и понятный интерфейс взаимодействия Унифицированная маршрутизация Независимость от языка программирования Переиспользуемость компонентов WAMP удовлетворяет требованиям SOA 24
  • 25.
    WAMP в качествеESB 25 WAMP Router Service Providers Service Providers Service Providers Service Providers Service Providers Consumers Consumers Consumers Consumers Consumers Вызывают RPC Подписываются на топики Регистрируют RPC Публикуют события Подписываются на топики Публикуют события Сервер Сервер Сервер
  • 26.
    WAMP в гетерогенныхсистемах 26 WAMP Router File uploader (python) Web Client (js) Backoffice Client (c#) Video processing (c++) Image processing (go) Logger (ruby) External API Gateway Client REST API (nodejs) Mobile Client (swift) Backoffice REST API (Java) DB Mobile Client (java) Realm Realm Realm Сервер Сервер Сервер
  • 27.
    Сферы применения WAMP 27 Распределённыеприложения с большим количеством сервисов Smart homes, Smart cities, Интернет вещей в целом Системы с долго выполняющимися процессами Лёгкая современная альтернатива XMPP, XMLRPC Сетевые игры
  • 28.
    Применение WAMP: реальныепроекты • Kadecot API Server. Sony Computer Science Laboratories • ParaView. Parallel Data Analysis and Visualization Application, Kitware • Record.Evolution. Data-warehouse and Business Intelligence • SmartME smart city project. MDS Lab at the University of Messina • ButterflyDNS. Web UI frontend for BIND DLZ • Подсистема управления серверами Gollard VISION 28
  • 29.
    Health monitor Nginx Подсистема управлениясервером 29 WAMP Router Admin App (c#) Shaman RPC: set.network RPC: get.network Publish: status.change RPC: get.status RPC: get.time RPC: set.time
  • 30.
    Loowy: WAMP-клиент наLua 30 • Работает в Lua/Luajit на базе lua-ev • Поддерживает JSON- и Msgpack-сериализаторы • Поддерживает ряд фич из Advanced Profile • Автоматическое переподключение и переподписка • TODO: Raw socket transport • TODO: Meta API • TODO: Challenge-Response Authorization (WAMP-CRA) • TODO: работа на основе сопрограмм (coroutines)
  • 31.
    Loowy: примеры вызовов 31 client= loowy.new("ws://localhost/ws/", { realm = "gv" }) client:publish('sensor.events', { sensorId = 12, temperature = 27}) client:subscribe('sensor.events', function(event) -- process received event end) client:call('dcs.fan.control', true, { onSuccess = function() -- fan turned on successfully end, onError = function(err) -- error occurred end })
  • 32.
    Loowy: Стек технологий 32 •Lua 5.1+, Luajit 2.0 • lua-websockets (который работает через luasocket) • lua-ev • lua-rapidjson • lua-MessagePack (опционально)
  • 33.
    Wiola: WAMP роутерна Lua • Работает на базе Nginx/Lua module • Использует Redis для runtime storage • Поддерживает JSON- и MessagePack-сериализаторы • Поддерживает ряд фич из Advanced Profile • TODO: Raw socket transport • TODO: Meta API • TODO: lua-resty-postgres 33
  • 34.
    Wiola: стек технологий 34 •Nginx или OpenResty, проще говоря lua-nginx-module • lua-resty-websocket • lua-resty-redis • Redis Server • lua-rapidjson • lua-resty-hmac (опционально, нужен для WAMP-CRA) • lua-MessagePack (опционально)
  • 35.
    Wiola: конфиг Nginx 35 location/ws/ { set $wiola_socket_timeout 10; set $wiola_max_payload_len 65535; lua_check_client_abort on; header_filter_by_lua_file /lib/wiola/headers.lua; content_by_lua_file /lib/wiola/handler.lua; }
  • 36.
  • 37.
    Wiola: Особенности. JSON •cJSON • нельзя указать способ сериализации пустых таблиц • lua-resty-libcjson • не умеет работать с большими числами (int > 32bit) lua-rapidjson • пока новых проблем не нашлось :) 37
  • 38.
    Wiola: Особенности. Runtime-хранилище 38 •Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests • Переменные модуля, загружаемого в init_by_lua • Читать можно во всех воркерах • Но запись, спасибо CoW, создаст свою копию модуля для VM • ngx.shared.DICT • Размер каждого словаря задаётся в конфиге и не может изменяться Внешнее хранилище: Redis, Memcache, PostgreSQL, MySQL и прочие
  • 39.
    Wiola: Особенности. lua_code_cache 39 •lua_code_cache off; • удобно отлаживать код • каждый require() выполняется заново в каждом запросе • даже модули, загруженные в init_by_lua, выполняются заново • lua_code_cache on; • для production-окружения • каждый require() выполняется один раз и кэшируется • при любом изменении кода необходимо перегружать nginx
  • 40.
    Wiola: Публикация вluarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): с точностью до «наоборот»: ✓ lua-resty-websocket ✓ lua-resty-redis - rapidjson ✓ lua-resty-hmac - lua-messagepack
  • 41.
    Полезные ссылки проWAMP • Основной сайт про WAMP: http://wamp-proto.org/ • Спека WAMP на github: github.com/wamp-proto/wamp-proto • Mailing list: https://groups.google.com/forum/#!forum/wampws • Wiola: https://github.com/KSDaemon/wiola • Loowy: https://github.com/KSDaemon/Loowy • Wampy.js: https://github.com/KSDaemon/wampy.js • Wiola docker image: https://hub.docker.com/r/421p/wiola/ • Crossbar Router: https://crossbar.io/ и https://demo.crossbar.io/ 41
  • 42.
    WAMP: Заключение • Простойи открытый протокол • RPC и PubSub в одном транспорте/протоколе • Любой транспорт и сериализация • Позволяет строить распределённые приложения со слабосвязанными компонентами • Есть реализации во многих языках • Open source • Небольшое, но дружелюбное сообщество 42
  • 43.
    WAMP: Заключение • Полезноеархитектурное решение • Отличный вариант для IoT-проекта!(имхо: лучше чем MQTT) • Попробуйте WAMP: • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router) • Используете docker? • docker pull 421p/wiola • docker pull crossbario/crossbar • WAMP-клиент на любой вкус и цвет (wamp-proto.org/implementations/) 43
  • 44.
    Спасибо за внимание! Иваши вопросы :) 44 Константин Буркалёв • Mail: kostik@ksdaemon.ru • Twitter: @KSDaemon • GitHub: KSDaemon • Blog: blog.ksdaemon.ru • SDCast: sdcast.ksdaemon.ru

Editor's Notes

  • #3 Постараться не говорить слово «Являюсь»
  • #4 Сказать про подводные камни и грабли и всё такое меньше футнотов (отходов в сторону) в тексте!!!
  • #5 Инфа от сенсоров — сообщения в топики, управление устройствами — rpc, Просмотр в клиенте текущих параметров сенсоров одной комнаты — pattern-based subscription, админские rpc — или в отдельный realm или trustlevels, долгоиграющая задача поиска новых устройств — progressive all results. Сказать, про кондей, что идея включать его периодически, а не постоянно.
  • #6 Позволяет легко строить распределенные приложения, где компоненты слабо связаны между собой и должны обмениваться в рил-тайме. Например, онлайн-игры, чаты, онлайн-консультанты и прочее.
  • #7 Не надо строить свои велосипеды, интероп сервисов, уже готовый API
  • #8 Сказать про подводные камни и грабли и всё такое меньше футнотов (отходов в сторону) в тексте!!!
  • #9 Сказать, что зелёненькие — это клиент → роутер, а другие — от роутера Второе сообщение от WAMP-роутера Wiola. WELCOME.
  • #10 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #11 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #12 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #13 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #14 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #15 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #16 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #17 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #18 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #19 М/д клиентом и роутером устанавливается соединение через транспорт. Поверх открывается сессия. Сессия привязывается к домену. Каждый узел реализует роли Не забыть сказать про масштабируемость роутер!
  • #20 Аббревиатуры и сокращения
  • #21 Профили: Набор функциональных возможностей в рамках каждого паттерна (PubSub, RPC) * Basic profile * Advanced profile Вынести основные фича в начало, остальные потом
  • #22 Надо говорить в контексте задачи умного дома
  • #23 Откуда получить список топиков?
  • #25 Не вдаваться в SOA слишком сильно
  • #26 Для полноценной ESB не хватает обработки и преобразования сообщений Сказать про то, что роутер может масштабироваться! Переделать на стопки и подписи поправить
  • #28 сетевые игры: прояснить, рилтайм/пошаговые хотя бы
  • #29 Просто сказать про сферы применения, не называя имена реальные проекты не описывать так долго, вывести сразу на экран, сказать только про то, какой проект "используется в системах визуализации, обработки больших данных и проч" — названия прочитают, они никому ничего не скажут
  • #30 Рассказать про контекст и проблему Corosync & pacemaker
  • #31 Кусок кода
  • #32 Кусок кода
  • #37 "если вы забыли как работает nginx" не произносить :D
  • #38 очень много подробностей про JSON, кю, сократить мы попробовали это, не годится поэтому (суше!), то, не годится поэтому, остановились на том не давать поводов к холивару по лучшей либе на json
  • #39 Рассказать посуше
  • #40 -- Use it only with lua_code_cache on; !!! local wflush = require "wiola.flushdb" wflush.flushAll()
  • #41 Добавить зависимости которые есть/нет если не будем дискутировать про luarocks vs package manager, не упоминай этот топик, пусть спросят
  • #44 Рассказать что мы использовали и оно нам понравилось "полезное архитектурное решение" – начать с того, что у ВАС и у тебя лично оно принесло пользу