Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WAMP как основа композитных SOA-приложений и его имплементация на Lua

WAMP как основа композитных SOA-приложений и его имплементация на Lua

WAMP расшифровывается как Web Application Messaging Protocol. Это открытый протокол, реализующий два паттерна в рамках одного протокола: RPC и Publish/Subscribe. Как мне кажется, это отличная платформа для сферы Internet of Things, Smart City и вообще бизнес-приложений с большим количеством различных компонентов и сервисов.

Konstantin Burkalev

December 11, 2017
Tweet

More Decks by Konstantin Burkalev

Other Decks in Programming

Transcript

  1. WAMP как основа
    композитных
    SOA-приложений и
    его реализация на Lua
    Константин Буркалёв
    @KSDaemon

    View full-size slide

  2. Пара слов о себе…
    2
    • Системный архитектор
    • 15+ лет опыта в ИТ
    • Автор и ведущий подкастов о разработке: SDCast & RadioJS
    • Активный участник группы разработки самого протокола WAMP
    • Автор и мейнтейнер нескольких реализаций WAMP, в том числе
    и на Lua

    View full-size slide

  3. План доклада
    Пример системы с применением WAMP
    Что такое протокол WAMP, и как он устроен
    WAMP как основа SOA-решений
    Сферы применения
    WAMP-клиент на Lua
    WAMP-роутер на Nginx/Lua
    3

    View full-size slide

  4. Задача: Система «Умный дом»
    4

    View full-size slide

  5. Комната
    Задача: Система «Умный дом»
    4

    View full-size slide

  6. Комната
    Задача: Система «Умный дом»
    4

    View full-size slide

  7. Комната
    Задача: Система «Умный дом»
    4

    View full-size slide

  8. Ванная
    Комната
    Задача: Система «Умный дом»
    4

    View full-size slide

  9. Ванная
    Комната
    Задача: Система «Умный дом»
    4

    View full-size slide

  10. Ванная
    Комната
    Задача: Система «Умный дом»
    4

    View full-size slide

  11. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь

    View full-size slide

  12. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь

    View full-size slide

  13. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Датчик температуры фиксирует
    превышение температуры

    View full-size slide

  14. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Оповещается клиент
    Логируется в базу

    View full-size slide

  15. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Оповещается клиент
    Логируется в базу

    View full-size slide

  16. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Система включает
    кондиционер

    View full-size slide

  17. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Температура в комнате снижается

    View full-size slide

  18. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь

    View full-size slide

  19. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь

    View full-size slide

  20. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Система выключает кондиционер

    View full-size slide

  21. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Система выключает кондиционер

    View full-size slide

  22. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Влажность в ванной поднимается

    View full-size slide

  23. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Оповещается клиент
    Логируется в базу

    View full-size slide

  24. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Оповещается клиент
    Логируется в базу

    View full-size slide

  25. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Система включает
    вентилятор

    View full-size slide

  26. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Система включает
    вентилятор

    View full-size slide

  27. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Влажность в ванной снижается

    View full-size slide

  28. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь

    View full-size slide

  29. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь

    View full-size slide

  30. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Система выключает вентилятор

    View full-size slide

  31. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Система выключает вентилятор

    View full-size slide

  32. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Админ

    View full-size slide

  33. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Админ
    Админ настраивает
    пороговые значения

    View full-size slide

  34. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Админ
    Админ производит поиск
    новых устройств

    View full-size slide

  35. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Админ
    Система информирует о
    найденных устройствах

    View full-size slide

  36. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Админ
    Система информирует о
    найденных устройствах

    View full-size slide

  37. Ванная
    Комната
    Задача: Система «Умный дом»
    4
    Пользователь
    Админ

    View full-size slide

  38. Что такое WAMP
    5

    View full-size slide

  39. Что такое WAMP
    • Расшифровывается как «Web Application Messaging Protocol»
    5

    View full-size slide

  40. Что такое WAMP
    • Расшифровывается как «Web Application Messaging Protocol»
    • Предназначен для коммуникации между программными
    компонентами практически в режиме реального времени
    5

    View full-size slide

  41. Что такое WAMP
    • Расшифровывается как «Web Application Messaging Protocol»
    • Предназначен для коммуникации между программными
    компонентами практически в режиме реального времени
    • Предоставляет два механизма:
    • Publish/Subscribe (PubSub)
    • Remote Procedure Calls (RPC)
    5

    View full-size slide

  42. Что такое WAMP
    • Расшифровывается как «Web Application Messaging Protocol»
    • Предназначен для коммуникации между программными
    компонентами практически в режиме реального времени
    • Предоставляет два механизма:
    • Publish/Subscribe (PubSub)
    • Remote Procedure Calls (RPC)
    • Двунаправленный, упорядоченный
    5

    View full-size slide

  43. Что такое WAMP
    • Расшифровывается как «Web Application Messaging Protocol»
    • Предназначен для коммуникации между программными
    компонентами практически в режиме реального времени
    • Предоставляет два механизма:
    • Publish/Subscribe (PubSub)
    • Remote Procedure Calls (RPC)
    • Двунаправленный, упорядоченный
    • Для общения клиентов требуется WAMP-роутер
    5

    View full-size slide

  44. Почему WAMP?
    6

    View full-size slide

  45. Почему WAMP?
    •Открытая спецификация
    6

    View full-size slide

  46. Почему WAMP?
    •Открытая спецификация
    • Продуманный Publish/Subscribe
    6

    View full-size slide

  47. Почему WAMP?
    •Открытая спецификация
    • Продуманный Publish/Subscribe
    • Продуманный Remote Procedure Calls
    6

    View full-size slide

  48. Почему WAMP?
    •Открытая спецификация
    • Продуманный Publish/Subscribe
    • Продуманный Remote Procedure Calls
    • Роутинг сообщений
    6

    View full-size slide

  49. Почему WAMP?
    •Открытая спецификация
    • Продуманный Publish/Subscribe
    • Продуманный Remote Procedure Calls
    • Роутинг сообщений
    • Кроссплатформенность
    6

    View full-size slide

  50. Почему WAMP?
    •Открытая спецификация
    • Продуманный Publish/Subscribe
    • Продуманный Remote Procedure Calls
    • Роутинг сообщений
    • Кроссплатформенность
    • Есть реализации более чем на 15 языках
    6

    View full-size slide

  51. Альтернативы WAMP
    7
    Technology PubSub RPC
    Routed
    RPC
    Web native
    Cross
    Language
    Open
    Standard
    WAMP ✔ ✔ ✔ ✔ ✔ ✔
    AJAX - ✔ - ✔ ✔ -
    AMQP ✔ (✔) - - ✔ ✔
    Java JMS ✔ - - - - ✔
    JSON-RPC - ✔ - ✔ ✔ ✔
    MQTT ✔ - - - ✔ ✔
    REST - ✔ - ✔ ✔ -
    SOAP - ✔ - ✔ ✔ ✔
    socket.io ✔ - - ✔ - -
    XMPP ✔ - - ✔ ✔ ✔
    ZMQ ✔ - - - ✔ -

    View full-size slide

  52. WAMP: Пример сообщений
    8

    View full-size slide

  53. Архитектура WAMP
    9

    View full-size slide

  54. Архитектура WAMP
    10
    Клиент.
    Может предоставлять
    или потреблять
    ресурсы, такие как
    подписки и RPC.

    View full-size slide

  55. Архитектура WAMP
    11
    Роутер.
    Занимается
    авторизацией и
    маршрутизацией
    сообщений
    между клиентами.

    View full-size slide

  56. Архитектура WAMP
    12
    Peer, узел.
    Может быть клиентом
    или роутером,
    должен обладать
    хотя бы одной ролью.

    View full-size slide

  57. Архитектура WAMP
    13
    Роль.
    Определяет
    возможности узла.
    Есть 4 клиентских
    роли и 2 роли роутера.

    View full-size slide

  58. Архитектура WAMP
    14
    Сессия.
    Необходима для
    идентификации и
    авторизации клиентов,
    анонса ролей узлов.

    View full-size slide

  59. Архитектура WAMP
    15
    Realm.
    Домен, namespace,
    единое пространство
    в рамках которого
    определены ресурсы
    и происходит роутинг
    сообщений.

    View full-size slide

  60. Архитектура WAMP
    16
    Транспорт.
    Можно использовать:
    WebSockets, Raw TCP,
    Unix sockets и даже
    HTTP Long poll.

    View full-size slide

  61. Архитектура WAMP
    17
    Сериализатор.
    Все сообщения
    сериализуются
    с помощью
    JSON/MessagePack/
    CBOR.
    message

    View full-size slide

  62. Архитектура WAMP
    18
    Идентификаторы
    ресурсов, URI.
    Необходимы для
    топиков, процедур
    и ошибок.
    Например:
    Topic: «sensor.events»
    RPC: «discover.devices»
    message

    View full-size slide

  63. Основные понятия WAMP
    19

    View full-size slide

  64. Основные понятия WAMP
    • Клиент. Может предоставлять или потреблять ресурсы, такие как подписки и RPC.
    • Роутер. Занимается авторизацией и маршрутизацией сообщений между клиентами.
    • Peer, узел. Может быть клиентом или роутером, должен обладать хотя бы одной ролью.
    • Роль. Определяет возможности узла. Есть 4 клиентских роли и 2 роли роутера.
    • Сессия. Необходима для идентификации и авторизации клиентов, анонса ролей узлов.
    • Realm. Домен, namespace, в рамках которого происходит роутинг сообщений.
    • Транспорт. Можно использовать: WebSockets, Raw TCP, Unix sockets и даже HTTP Long poll.
    • Сериализатор. Cообщения сериализуются с помощью JSON/MessagePack/CBOR
    • Идентификаторы ресурсов, URI. Необходимы для топиков, процедур и ошибок.
    19

    View full-size slide

  65. WAMP: Features
    20

    View full-size slide

  66. WAMP: Features
    • Basic profile: базовые возможности RPC и PubSub
    20

    View full-size slide

  67. WAMP: Features
    • Basic profile: базовые возможности RPC и PubSub
    • Advanced profile:
    20

    View full-size slide

  68. 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

    View full-size slide

  69. WAMP: установка сессии
    21
    Клиент Роутер
    Realm

    View full-size slide

  70. WAMP: установка сессии
    21
    HELLO
    Клиент Роутер
    Realm
    [1, "homeapp", { "roles": { "publisher": {}, "subscriber": {} } }]

    View full-size slide

  71. WAMP: установка сессии
    21
    HELLO
    WELCOME
    Клиент Роутер
    Realm
    [2, 9129137332, { "roles": { "broker": {} } }]

    View full-size slide

  72. WAMP: установка сессии
    21
    HELLO
    WELCOME
    ABORT
    Клиент Роутер
    Realm
    [3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"]

    View full-size slide

  73. WAMP: установка сессии
    21
    HELLO
    WELCOME
    GOODBYE (init by client)
    ABORT
    Клиент Роутер
    Realm
    [6, {"message": "The host is shutting down now."}, "wamp.error.system_shutdown"]

    View full-size slide

  74. WAMP: установка сессии
    21
    HELLO
    WELCOME
    GOODBYE (init by client)
    ABORT
    GOODBYE
    Клиент Роутер
    Realm
    [6, {}, "wamp.error.goodbye_and_out"]

    View full-size slide

  75. WAMP: установка сессии
    21
    HELLO
    WELCOME
    GOODBYE (init by client)
    ABORT
    GOODBYE
    GOODBYE (init by router)
    Клиент Роутер
    Realm
    [6, {}, "wamp.error.close_realm"]

    View full-size slide

  76. WAMP: установка сессии
    21
    HELLO
    WELCOME
    GOODBYE (init by client)
    ABORT
    GOODBYE
    GOODBYE
    GOODBYE (init by router)
    Клиент Роутер
    Realm
    [6, {}, "wamp.error.goodbye_and_out"]

    View full-size slide

  77. WAMP: установка сессии
    21
    HELLO
    WELCOME
    GOODBYE (init by client)
    ABORT
    GOODBYE
    GOODBYE
    GOODBYE (init by router)
    Клиент Роутер
    Realm

    View full-size slide

  78. WAMP: Publish / Subscribe
    22
    Publisher Broker Subscriber
    Realm

    View full-size slide

  79. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    Publisher Broker Subscriber
    Realm
    [32, 713845233, {}, "sensor.events"]

    View full-size slide

  80. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    Publisher Broker Subscriber
    Realm
    [33, 713845233, 5512315355]

    View full-size slide

  81. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    ERROR
    Publisher Broker Subscriber
    Realm
    [8, 32, 713845233, {}, "wamp.error.not_authorized"]

    View full-size slide

  82. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    ERROR
    PUBLISH
    Publisher Broker Subscriber
    Realm
    [16, 239714735, {}, "sensor.events", [], {"sensorId ": 25, "temp": 27}]

    View full-size slide

  83. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    ERROR
    PUBLISH
    PUBLISHED
    Publisher Broker Subscriber
    Realm
    [17, 239714735, 4429313566]

    View full-size slide

  84. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    ERROR
    PUBLISH
    PUBLISHED
    ERROR
    Publisher Broker Subscriber
    Realm
    [8, 16, 239714735, {}, "wamp.error.not_authorized"]

    View full-size slide

  85. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    ERROR
    PUBLISH
    PUBLISHED
    ERROR
    EVENT
    Publisher Broker Subscriber
    Realm
    [36, 5512315355, 4429313566, {}, [], {"sensorId ": 25, "temp": 27}]

    View full-size slide

  86. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    UNSUBSCRIBE
    ERROR
    PUBLISH
    PUBLISHED
    ERROR
    EVENT
    Publisher Broker Subscriber
    Realm
    [34, 85346237, 5512315355]

    View full-size slide

  87. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    UNSUBSCRIBE
    UNSUBSCRIBED
    ERROR
    PUBLISH
    PUBLISHED
    ERROR
    EVENT
    Publisher Broker Subscriber
    Realm
    [35, 85346237]

    View full-size slide

  88. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    UNSUBSCRIBE
    UNSUBSCRIBED
    ERROR
    ERROR
    PUBLISH
    PUBLISHED
    ERROR
    EVENT
    Publisher Broker Subscriber
    Realm
    [8, 34, 85346237, {}, "wamp.error.no_such_subscription"]

    View full-size slide

  89. WAMP: Publish / Subscribe
    22
    SUBSCRIBE
    SUBSCRIBED
    UNSUBSCRIBE
    UNSUBSCRIBED
    ERROR
    ERROR
    PUBLISH
    PUBLISHED
    ERROR
    EVENT
    Publisher Broker Subscriber
    Realm

    View full-size slide

  90. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    Realm

    View full-size slide

  91. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    Realm
    [64, 25349185, {}, "dcs.fan.control"]

    View full-size slide

  92. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    Realm
    [65, 25349185, 2103333224]

    View full-size slide

  93. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    ERROR
    Realm
    [8, 64, 25349185, {}, "wamp.error.procedure_already_exists"]

    View full-size slide

  94. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    ERROR
    CALL
    Realm
    [48, 7814135, {}, "dcs.fan.control", [true]]

    View full-size slide

  95. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    ERROR
    CALL
    INVOCATION
    Realm
    [68, 6131533, 9823528, {}, [true]]

    View full-size slide

  96. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    ERROR
    CALL
    INVOCATION
    YIELD
    Realm
    [70, 6131533, {}]

    View full-size slide

  97. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    ERROR
    CALL
    RESULT
    INVOCATION
    YIELD
    Realm
    [50, 7814135, {}]

    View full-size slide

  98. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    ERROR
    CALL
    RESULT
    INVOCATION
    YIELD
    ERROR
    Realm
    [8, 68, 6131533, {}, "homeapp.error.hardware_not_found"]

    View full-size slide

  99. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    ERROR
    CALL
    RESULT
    INVOCATION
    YIELD
    ERROR
    ERROR
    Realm
    [8, 48, 7814135, {}, "homeapp.error.hardware_not_found"]

    View full-size slide

  100. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    UNREGISTER
    ERROR
    CALL
    RESULT
    INVOCATION
    YIELD
    ERROR
    ERROR
    Realm
    [66, 788923562, 2103333224]

    View full-size slide

  101. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    UNREGISTER
    UNREGISTERED
    ERROR
    CALL
    RESULT
    INVOCATION
    YIELD
    ERROR
    ERROR
    Realm
    [67, 788923562]

    View full-size slide

  102. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    UNREGISTER
    UNREGISTERED
    ERROR
    ERROR
    CALL
    RESULT
    INVOCATION
    YIELD
    ERROR
    ERROR
    Realm
    [8, 66, 788923562, {}, "wamp.error.no_such_registration"]

    View full-size slide

  103. WAMP: Remote Procedure Calls
    23
    Caller Dealer Callee
    REGISTER
    REGISTERED
    UNREGISTER
    UNREGISTERED
    ERROR
    ERROR
    CALL
    RESULT
    INVOCATION
    YIELD
    ERROR
    ERROR
    Realm

    View full-size slide

  104. WAMP как основа SOA-решений
    24

    View full-size slide

  105. WAMP как основа SOA-решений
    Распределённая архитектура
    24

    View full-size slide

  106. WAMP как основа SOA-решений
    Распределённая архитектура
    Слабая связанность компонентов
    24

    View full-size slide

  107. WAMP как основа SOA-решений
    Распределённая архитектура
    Слабая связанность компонентов
    Простой и понятный интерфейс взаимодействия
    24

    View full-size slide

  108. WAMP как основа SOA-решений
    Распределённая архитектура
    Слабая связанность компонентов
    Простой и понятный интерфейс взаимодействия
    Унифицированная маршрутизация
    24

    View full-size slide

  109. WAMP как основа SOA-решений
    Распределённая архитектура
    Слабая связанность компонентов
    Простой и понятный интерфейс взаимодействия
    Унифицированная маршрутизация
    Независимость от языка программирования
    24

    View full-size slide

  110. WAMP как основа SOA-решений
    Распределённая архитектура
    Слабая связанность компонентов
    Простой и понятный интерфейс взаимодействия
    Унифицированная маршрутизация
    Независимость от языка программирования
    Переиспользуемость компонентов
    24

    View full-size slide

  111. WAMP как основа SOA-решений
    Распределённая архитектура
    Слабая связанность компонентов
    Простой и понятный интерфейс взаимодействия
    Унифицированная маршрутизация
    Независимость от языка программирования
    Переиспользуемость компонентов
    WAMP удовлетворяет требованиям SOA
    24

    View full-size slide

  112. WAMP в качестве ESB
    25
    WAMP
    Router
    Service
    Providers
    Service
    Providers
    Service
    Providers
    Service
    Providers
    Service
    Providers
    Consumers
    Consumers
    Consumers
    Consumers
    Consumers
    Вызывают RPC
    Подписываются
    на топики
    Регистрируют RPC
    Публикуют события
    Подписываются
    на топики
    Публикуют события
    Сервер
    Сервер
    Сервер

    View full-size slide

  113. 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
    Сервер
    Сервер
    Сервер

    View full-size slide

  114. Сферы применения WAMP
    27

    View full-size slide

  115. Сферы применения WAMP
    27
    Распределённые приложения с большим количеством сервисов

    View full-size slide

  116. Сферы применения WAMP
    27
    Распределённые приложения с большим количеством сервисов
    Smart homes, Smart cities, Интернет вещей в целом

    View full-size slide

  117. Сферы применения WAMP
    27
    Распределённые приложения с большим количеством сервисов
    Smart homes, Smart cities, Интернет вещей в целом
    Системы с долго выполняющимися процессами

    View full-size slide

  118. Сферы применения WAMP
    27
    Распределённые приложения с большим количеством сервисов
    Smart homes, Smart cities, Интернет вещей в целом
    Системы с долго выполняющимися процессами
    Лёгкая современная альтернатива XMPP, XMLRPC

    View full-size slide

  119. Сферы применения WAMP
    27
    Распределённые приложения с большим количеством сервисов
    Smart homes, Smart cities, Интернет вещей в целом
    Системы с долго выполняющимися процессами
    Лёгкая современная альтернатива XMPP, XMLRPC
    Сетевые игры

    View full-size slide

  120. Применение WAMP: реальные проекты
    28

    View full-size slide

  121. Применение WAMP: реальные проекты
    • Kadecot API Server. Sony Computer Science Laboratories
    28

    View full-size slide

  122. Применение WAMP: реальные проекты
    • Kadecot API Server. Sony Computer Science Laboratories
    • ParaView. Parallel Data Analysis and Visualization Application, Kitware
    28

    View full-size slide

  123. Применение WAMP: реальные проекты
    • Kadecot API Server. Sony Computer Science Laboratories
    • ParaView. Parallel Data Analysis and Visualization Application, Kitware
    • Record.Evolution. Data-warehouse and Business Intelligence
    28

    View full-size slide

  124. Применение 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
    28

    View full-size slide

  125. Применение 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

    View full-size slide

  126. 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

    View full-size slide

  127. Loowy: WAMP-клиент на Lua
    30

    View full-size slide

  128. Loowy: WAMP-клиент на Lua
    30
    • Работает в Lua/Luajit на базе lua-ev

    View full-size slide

  129. Loowy: WAMP-клиент на Lua
    30
    • Работает в Lua/Luajit на базе lua-ev
    • Поддерживает JSON- и Msgpack-сериализаторы

    View full-size slide

  130. Loowy: WAMP-клиент на Lua
    30
    • Работает в Lua/Luajit на базе lua-ev
    • Поддерживает JSON- и Msgpack-сериализаторы
    • Поддерживает ряд фич из Advanced Profile

    View full-size slide

  131. Loowy: WAMP-клиент на Lua
    30
    • Работает в Lua/Luajit на базе lua-ev
    • Поддерживает JSON- и Msgpack-сериализаторы
    • Поддерживает ряд фич из Advanced Profile
    • Автоматическое переподключение и переподписка

    View full-size slide

  132. 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)

    View full-size slide

  133. 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
    })

    View full-size slide

  134. Loowy: Стек технологий
    32

    View full-size slide

  135. Loowy: Стек технологий
    32
    • Lua 5.1+, Luajit 2.0
    • lua-websockets (который работает через luasocket)
    • lua-ev
    • lua-rapidjson
    • lua-MessagePack (опционально)

    View full-size slide

  136. Wiola: WAMP роутер на Lua
    33

    View full-size slide

  137. Wiola: WAMP роутер на Lua
    • Работает на базе Nginx/Lua module
    33

    View full-size slide

  138. Wiola: WAMP роутер на Lua
    • Работает на базе Nginx/Lua module
    • Использует Redis для runtime storage
    33

    View full-size slide

  139. Wiola: WAMP роутер на Lua
    • Работает на базе Nginx/Lua module
    • Использует Redis для runtime storage
    • Поддерживает JSON- и MessagePack-сериализаторы
    33

    View full-size slide

  140. Wiola: WAMP роутер на Lua
    • Работает на базе Nginx/Lua module
    • Использует Redis для runtime storage
    • Поддерживает JSON- и MessagePack-сериализаторы
    • Поддерживает ряд фич из Advanced Profile
    33

    View full-size slide

  141. 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

    View full-size slide

  142. Wiola: стек технологий
    34

    View full-size slide

  143. Wiola: стек технологий
    34
    • Nginx или OpenResty, проще говоря lua-nginx-module
    • lua-resty-websocket
    • lua-resty-redis
    • Redis Server
    • lua-rapidjson
    • lua-resty-hmac (опционально, нужен для WAMP-CRA)
    • lua-MessagePack (опционально)

    View full-size slide

  144. 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;
    }

    View full-size slide

  145. Nginx
    Wiola: Общая схема
    36
    Web
    Client
    init_by_lua
    headers_filter_by_lua
    content_by_lua
    Redis
    Server

    View full-size slide

  146. Wiola: Особенности. JSON
    37

    View full-size slide

  147. Wiola: Особенности. JSON
    • cJSON
    37

    View full-size slide

  148. Wiola: Особенности. JSON
    • cJSON
    • нельзя указать способ сериализации пустых таблиц
    37

    View full-size slide

  149. Wiola: Особенности. JSON
    • cJSON
    • нельзя указать способ сериализации пустых таблиц
    • lua-resty-libcjson
    37

    View full-size slide

  150. Wiola: Особенности. JSON
    • cJSON
    • нельзя указать способ сериализации пустых таблиц
    • lua-resty-libcjson
    • не умеет работать с большими числами (int > 32bit)
    37

    View full-size slide

  151. Wiola: Особенности. JSON
    • cJSON
    • нельзя указать способ сериализации пустых таблиц
    • lua-resty-libcjson
    • не умеет работать с большими числами (int > 32bit)
    lua-rapidjson
    37

    View full-size slide

  152. Wiola: Особенности. JSON
    • cJSON
    • нельзя указать способ сериализации пустых таблиц
    • lua-resty-libcjson
    • не умеет работать с большими числами (int > 32bit)
    lua-rapidjson
    • пока новых проблем не нашлось :)
    37

    View full-size slide

  153. Wiola: Особенности. Runtime-хранилище
    38

    View full-size slide

  154. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти

    View full-size slide

  155. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler

    View full-size slide

  156. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler
    • проблемы с concurrent requests

    View full-size slide

  157. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler
    • проблемы с concurrent requests
    • Переменные модуля, загружаемого в init_by_lua

    View full-size slide

  158. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler
    • проблемы с concurrent requests
    • Переменные модуля, загружаемого в init_by_lua
    • Читать можно во всех воркерах

    View full-size slide

  159. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler
    • проблемы с concurrent requests
    • Переменные модуля, загружаемого в init_by_lua
    • Читать можно во всех воркерах
    • Но запись, спасибо CoW, создаст свою копию модуля для VM

    View full-size slide

  160. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler
    • проблемы с concurrent requests
    • Переменные модуля, загружаемого в init_by_lua
    • Читать можно во всех воркерах
    • Но запись, спасибо CoW, создаст свою копию модуля для VM
    • ngx.shared.DICT

    View full-size slide

  161. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler
    • проблемы с concurrent requests
    • Переменные модуля, загружаемого в init_by_lua
    • Читать можно во всех воркерах
    • Но запись, спасибо CoW, создаст свою копию модуля для VM
    • ngx.shared.DICT
    • Размер каждого словаря задаётся в конфиге и не может изменяться

    View full-size slide

  162. Wiola: Особенности. Runtime-хранилище
    38
    • Глобальные переменные в памяти
    • Создаются каждый раз на request handler
    • проблемы с concurrent requests
    • Переменные модуля, загружаемого в init_by_lua
    • Читать можно во всех воркерах
    • Но запись, спасибо CoW, создаст свою копию модуля для VM
    • ngx.shared.DICT
    • Размер каждого словаря задаётся в конфиге и не может изменяться
    Внешнее хранилище: Redis, Memcache, PostgreSQL, MySQL и прочие

    View full-size slide

  163. Wiola: Особенности. lua_code_cache
    39

    View full-size slide

  164. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;

    View full-size slide

  165. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;
    • удобно отлаживать код

    View full-size slide

  166. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;
    • удобно отлаживать код
    • каждый require() выполняется заново в каждом запросе

    View full-size slide

  167. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;
    • удобно отлаживать код
    • каждый require() выполняется заново в каждом запросе
    • даже модули, загруженные в init_by_lua, выполняются заново

    View full-size slide

  168. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;
    • удобно отлаживать код
    • каждый require() выполняется заново в каждом запросе
    • даже модули, загруженные в init_by_lua, выполняются заново
    • lua_code_cache on;

    View full-size slide

  169. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;
    • удобно отлаживать код
    • каждый require() выполняется заново в каждом запросе
    • даже модули, загруженные в init_by_lua, выполняются заново
    • lua_code_cache on;
    • для production-окружения

    View full-size slide

  170. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;
    • удобно отлаживать код
    • каждый require() выполняется заново в каждом запросе
    • даже модули, загруженные в init_by_lua, выполняются заново
    • lua_code_cache on;
    • для production-окружения
    • каждый require() выполняется один раз и кэшируется

    View full-size slide

  171. Wiola: Особенности. lua_code_cache
    39
    • lua_code_cache off;
    • удобно отлаживать код
    • каждый require() выполняется заново в каждом запросе
    • даже модули, загруженные в init_by_lua, выполняются заново
    • lua_code_cache on;
    • для production-окружения
    • каждый require() выполняется один раз и кэшируется
    • при любом изменении кода необходимо перегружать nginx

    View full-size slide

  172. Wiola: Публикация в luarocks, opm
    40

    View full-size slide

  173. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:

    View full-size slide

  174. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:
    - lua-resty-websocket

    View full-size slide

  175. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:
    - lua-resty-websocket
    - lua-resty-redis

    View full-size slide

  176. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:
    - lua-resty-websocket
    - lua-resty-redis
    ✓ rapidjson

    View full-size slide

  177. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:
    - lua-resty-websocket
    - lua-resty-redis
    ✓ rapidjson
    ✓ lua-resty-hmac

    View full-size slide

  178. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:
    - lua-resty-websocket
    - lua-resty-redis
    ✓ rapidjson
    ✓ lua-resty-hmac
    ✓ lua-messagepack

    View full-size slide

  179. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:
    - lua-resty-websocket
    - lua-resty-redis
    ✓ rapidjson
    ✓ lua-resty-hmac
    ✓ lua-messagepack
    • opm (OpenResty Package
    Manager): с точностью до
    «наоборот»:

    View full-size slide

  180. Wiola: Публикация в luarocks, opm
    40
    • luarocks: есть одна часть
    зависимостей,
    нет другой:
    - lua-resty-websocket
    - lua-resty-redis
    ✓ rapidjson
    ✓ lua-resty-hmac
    ✓ lua-messagepack
    • opm (OpenResty Package
    Manager): с точностью до
    «наоборот»:
    ✓ lua-resty-websocket

    View full-size slide

  181. 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

    View full-size slide

  182. 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

    View full-size slide

  183. 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

    View full-size slide

  184. 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

    View full-size slide

  185. Полезные ссылки про WAMP
    41

    View full-size slide

  186. Полезные ссылки про 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

    View full-size slide

  187. WAMP: Заключение
    42

    View full-size slide

  188. WAMP: Заключение
    • Простой и открытый протокол
    42

    View full-size slide

  189. WAMP: Заключение
    • Простой и открытый протокол
    • RPC и PubSub в одном транспорте/протоколе
    42

    View full-size slide

  190. WAMP: Заключение
    • Простой и открытый протокол
    • RPC и PubSub в одном транспорте/протоколе
    • Любой транспорт и сериализация
    42

    View full-size slide

  191. WAMP: Заключение
    • Простой и открытый протокол
    • RPC и PubSub в одном транспорте/протоколе
    • Любой транспорт и сериализация
    • Позволяет строить распределённые приложения
    со слабосвязанными компонентами
    42

    View full-size slide

  192. WAMP: Заключение
    • Простой и открытый протокол
    • RPC и PubSub в одном транспорте/протоколе
    • Любой транспорт и сериализация
    • Позволяет строить распределённые приложения
    со слабосвязанными компонентами
    • Есть реализации во многих языках
    42

    View full-size slide

  193. WAMP: Заключение
    • Простой и открытый протокол
    • RPC и PubSub в одном транспорте/протоколе
    • Любой транспорт и сериализация
    • Позволяет строить распределённые приложения
    со слабосвязанными компонентами
    • Есть реализации во многих языках
    • Open source
    42

    View full-size slide

  194. WAMP: Заключение
    • Простой и открытый протокол
    • RPC и PubSub в одном транспорте/протоколе
    • Любой транспорт и сериализация
    • Позволяет строить распределённые приложения
    со слабосвязанными компонентами
    • Есть реализации во многих языках
    • Open source
    • Небольшое, но дружелюбное сообщество
    42

    View full-size slide

  195. WAMP: Заключение
    43

    View full-size slide

  196. WAMP: Заключение
    • Полезное архитектурное решение
    43

    View full-size slide

  197. WAMP: Заключение
    • Полезное архитектурное решение
    • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT)
    43

    View full-size slide

  198. WAMP: Заключение
    • Полезное архитектурное решение
    • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT)
    • Попробуйте WAMP:
    43

    View full-size slide

  199. WAMP: Заключение
    • Полезное архитектурное решение
    • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT)
    • Попробуйте WAMP:
    • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router)
    43

    View full-size slide

  200. WAMP: Заключение
    • Полезное архитектурное решение
    • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT)
    • Попробуйте WAMP:
    • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router)
    • Используете docker?
    43

    View full-size slide

  201. WAMP: Заключение
    • Полезное архитектурное решение
    • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT)
    • Попробуйте WAMP:
    • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router)
    • Используете docker?
    • docker pull 421p/wiola
    43

    View full-size slide

  202. WAMP: Заключение
    • Полезное архитектурное решение
    • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT)
    • Попробуйте WAMP:
    • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router)
    • Используете docker?
    • docker pull 421p/wiola
    • docker pull crossbario/crossbar
    43

    View full-size slide

  203. 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

    View full-size slide

  204. Спасибо за внимание!
    И ваши вопросы :)
    44
    Константин Буркалёв
    • Mail: [email protected]
    • Twitter: @KSDaemon
    • GitHub: KSDaemon
    • Blog: blog.ksdaemon.ru
    • SDCast: sdcast.ksdaemon.ru

    View full-size slide