$30 off During Our Annual Pro Sale. View Details »

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
  2. Пара слов о себе… 2 • Системный архитектор • 15+

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

    WAMP, и как он устроен WAMP как основа SOA-решений Сферы применения WAMP-клиент на Lua WAMP-роутер на Nginx/Lua 3
  4. Задача: Система «Умный дом» 4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • Предназначен для коммуникации между программными компонентами практически в режиме реального времени • Предоставляет два механизма: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) • Двунаправленный, упорядоченный • Для общения клиентов требуется WAMP-роутер 5
  44. Почему WAMP? 6

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

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

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

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

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

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

    Procedure Calls • Роутинг сообщений • Кроссплатформенность • Есть реализации более чем на 15 языках 6
  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 ✔ - - - ✔ -
  52. WAMP: Пример сообщений 8

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

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

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

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

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

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

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

    которого определены ресурсы и происходит роутинг сообщений.
  60. Архитектура WAMP 16 Транспорт. Можно использовать: WebSockets, Raw TCP, Unix

    sockets и даже HTTP Long poll.
  61. Архитектура WAMP 17 Сериализатор. Все сообщения сериализуются с помощью JSON/MessagePack/

    CBOR. message
  62. Архитектура WAMP 18 Идентификаторы ресурсов, URI. Необходимы для топиков, процедур

    и ошибок. Например: Topic: «sensor.events» RPC: «discover.devices» message
  63. Основные понятия WAMP 19

  64. Основные понятия WAMP • Клиент. Может предоставлять или потреблять ресурсы,

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

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

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

    • Advanced profile: 20
  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
  69. WAMP: установка сессии 21 Клиент Роутер Realm

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

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

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

    [3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"]
  73. WAMP: установка сессии 21 HELLO WELCOME GOODBYE (init by client)

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

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

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

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

    ABORT GOODBYE GOODBYE GOODBYE (init by router) Клиент Роутер Realm
  78. WAMP: Publish / Subscribe 22 Publisher Broker Subscriber Realm

  79. WAMP: Publish / Subscribe 22 SUBSCRIBE Publisher Broker Subscriber Realm

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

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

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

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

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

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

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

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

    PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm [35, 85346237]
  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"]
  89. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE UNSUBSCRIBED ERROR

    ERROR PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm
  90. WAMP: Remote Procedure Calls 23 Caller Dealer Callee Realm

  91. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER Realm

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

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

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

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

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

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

    ERROR CALL RESULT INVOCATION YIELD Realm [50, 7814135, {}]
  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"]
  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"]
  100. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED

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

    UNREGISTER UNREGISTERED ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm [67, 788923562]
  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"]
  103. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED

    UNREGISTER UNREGISTERED ERROR ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm
  104. WAMP как основа SOA-решений 24

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

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

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

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

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

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

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

    и понятный интерфейс взаимодействия Унифицированная маршрутизация Независимость от языка программирования Переиспользуемость компонентов WAMP удовлетворяет требованиям SOA 24
  112. WAMP в качестве ESB 25 WAMP Router Service Providers Service

    Providers Service Providers Service Providers Service Providers Consumers Consumers Consumers Consumers Consumers Вызывают RPC Подписываются на топики Регистрируют RPC Публикуют события Подписываются на топики Публикуют события Сервер Сервер Сервер
  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 Сервер Сервер Сервер
  114. Сферы применения WAMP 27

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

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

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

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

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

    Smart homes, Smart cities, Интернет вещей в целом Системы с долго выполняющимися процессами Лёгкая современная альтернатива XMPP, XMLRPC Сетевые игры
  120. Применение WAMP: реальные проекты 28

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

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

    Science Laboratories • ParaView. Parallel Data Analysis and Visualization Application, Kitware 28
  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
  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
  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
  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
  127. Loowy: WAMP-клиент на Lua 30

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

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

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

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

    базе lua-ev • Поддерживает JSON- и Msgpack-сериализаторы • Поддерживает ряд фич из Advanced Profile • Автоматическое переподключение и переподписка
  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)
  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 })
  134. Loowy: Стек технологий 32

  135. Loowy: Стек технологий 32 • Lua 5.1+, Luajit 2.0 •

    lua-websockets (который работает через luasocket) • lua-ev • lua-rapidjson • lua-MessagePack (опционально)
  136. Wiola: WAMP роутер на Lua 33

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

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

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

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

    module • Использует Redis для runtime storage • Поддерживает JSON- и MessagePack-сериализаторы • Поддерживает ряд фич из Advanced Profile 33
  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
  142. Wiola: стек технологий 34

  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 (опционально)
  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; }
  145. Nginx Wiola: Общая схема 36 Web Client init_by_lua headers_filter_by_lua content_by_lua

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    часть зависимостей, нет другой: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): с точностью до «наоборот»:
  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
  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
  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
  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
  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
  185. Полезные ссылки про WAMP 41

  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
  187. WAMP: Заключение 42

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

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

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

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

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

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

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

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

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

  197. WAMP: Заключение • Полезное архитектурное решение • Отличный вариант для

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

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

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

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

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

    IoT-проекта! (имхо: лучше чем MQTT) • Попробуйте WAMP: • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router) • Используете docker? • docker pull 421p/wiola • docker pull crossbario/crossbar 43
  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
  204. Спасибо за внимание! И ваши вопросы :) 44 Константин Буркалёв

    • Mail: kostik@ksdaemon.ru • Twitter: @KSDaemon • GitHub: KSDaemon • Blog: blog.ksdaemon.ru • SDCast: sdcast.ksdaemon.ru