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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  44. Почему WAMP?
    6

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  65. WAMP: Features
    20

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 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 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 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 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 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 Slide

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

    View 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide