Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

WAMP as a platform for composite SOA applications and its implementation on Lua

345 views

Published on

WAMP stands for Web Application Messaging Protocol. This is an open protocol that implements two patterns within a single protocol: RPC and Publish / Subscribe. As it seems to me, this is a great platform for the Internet of Things, Smart City and in general business applications with a lot of different components and services.

Published in: Engineering
  • Be the first to like this

WAMP as a platform for composite SOA applications and its implementation on Lua

  1. 1. WAMP as a platform for composite SOA applications and its implementation on Lua Konstantin Burkalev @KSDaemon
  2. 2. Few words about me… 2 • Software architect • 15+ years in IT • Author and host of podcasts: SDCast & RadioJS • Active member of WAMP protocol development group • Author and maintainer of a few WAMP implementations, some of them are written in Lua
  3. 3. Talk plan Example of system using WAMP What is WAMP and how it works WAMP as basis for SOA applications Application fields WAMP client in Lua WAMP router in Nginx/Lua 3
  4. 4. Task: Smart Home System 4
  5. 5. Living room Task: Smart Home System 4
  6. 6. Living room Task: Smart Home System 4
  7. 7. Living room Task: Smart Home System 4
  8. 8. Bath room Living room Task: Smart Home System 4
  9. 9. Bath room Living room Task: Smart Home System 4
  10. 10. Bath room Living room Task: Smart Home System 4
  11. 11. Bath room Living room Task: Smart Home System 4 User
  12. 12. Bath room Living room Task: Smart Home System 4 User
  13. 13. The temperature sensor detects the temperature raise Bath room Living room Task: Smart Home System 4 User
  14. 14. The client is notified Logged in database Bath room Living room Task: Smart Home System 4 User
  15. 15. The client is notified Logged in database Bath room Living room Task: Smart Home System 4 User
  16. 16. The system turns on air conditioning Bath room Living room Task: Smart Home System 4 User
  17. 17. The temperature in the room decreases Bath room Living room Task: Smart Home System 4 User
  18. 18. Bath room Living room Task: Smart Home System 4 User
  19. 19. Bath room Living room Task: Smart Home System 4 User
  20. 20. The system turns off the air conditioning Bath room Living room Task: Smart Home System 4 User
  21. 21. The system turns off the air conditioning Bath room Living room Task: Smart Home System 4 User
  22. 22. The humidity in the bathroom rises Bath room Living room Task: Smart Home System 4 User
  23. 23. The client is notified Logged in database Bath room Living room Task: Smart Home System 4 User
  24. 24. The client is notified Logged in database Bath room Living room Task: Smart Home System 4 User
  25. 25. The system turns on a fan Bath room Living room Task: Smart Home System 4 User
  26. 26. The system turns on a fan Bath room Living room Task: Smart Home System 4 User
  27. 27. The humidity in the bathroom drops Bath room Living room Task: Smart Home System 4 User
  28. 28. Bath room Living room Task: Smart Home System 4 User
  29. 29. Bath room Living room Task: Smart Home System 4 User
  30. 30. The system turns off the fan Bath room Living room Task: Smart Home System 4 User
  31. 31. The system turns off the fan Bath room Living room Task: Smart Home System 4 User
  32. 32. Bath room Living room Task: Smart Home System 4 User Admin
  33. 33. Admin configures threshold values Bath room Living room Task: Smart Home System 4 User Admin
  34. 34. Admin searches new devices Bath room Living room Task: Smart Home System 4 User Admin
  35. 35. The system informs about found devices Bath room Living room Task: Smart Home System 4 User Admin
  36. 36. The system informs about found devices Bath room Living room Task: Smart Home System 4 User Admin
  37. 37. Bath room Living room Task: Smart Home System 4 User Admin
  38. 38. What is WAMP 5
  39. 39. What is WAMP • It stands for "Web Application Messaging Protocol" 5
  40. 40. What is WAMP • It stands for "Web Application Messaging Protocol" • Is intended for communication between software components in near real-time 5
  41. 41. What is WAMP • It stands for "Web Application Messaging Protocol" • Is intended for communication between software components in near real-time • Provides two mechanisms: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) 5
  42. 42. What is WAMP • It stands for "Web Application Messaging Protocol" • Is intended for communication between software components in near real-time • Provides two mechanisms: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) • Bi-directional, ordered 5
  43. 43. What is WAMP • It stands for "Web Application Messaging Protocol" • Is intended for communication between software components in near real-time • Provides two mechanisms: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) • Bi-directional, ordered • For communication between clients is required WAMP-router 5
  44. 44. Why WAMP? 6
  45. 45. Why WAMP? • Open specification 6
  46. 46. Why WAMP? • Open specification • Thoughtful Publish / Subscribe 6
  47. 47. Why WAMP? • Open specification • Thoughtful Publish / Subscribe • Thoughtful Remote Procedure Calls 6
  48. 48. Why WAMP? • Open specification • Thoughtful Publish / Subscribe • Thoughtful Remote Procedure Calls • Message routing 6
  49. 49. Why WAMP? • Open specification • Thoughtful Publish / Subscribe • Thoughtful Remote Procedure Calls • Message routing • Cross-platform 6
  50. 50. Why WAMP? • Open specification • Thoughtful Publish / Subscribe • Thoughtful Remote Procedure Calls • Message routing • Cross-platform • There are implementations in more than 15 languages 6
  51. 51. WAMP alternatives 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. 52. WAMP: message examples 8
  53. 53. WAMP architecture 9
  54. 54. WAMP architecture 10 Client. Can provide or consume resources such as subscriptions and RPC.
  55. 55. WAMP architecture 11 Router. Deals with authorization and routing messages between clients.
  56. 56. WAMP architecture 12 Peer. Can be a client or a router, must have at least one role.
  57. 57. WAMP architecture 13 Role. Defines features of the node. There are 4 client roles and 2 roles of the router.
  58. 58. WAMP architecture 14 Session. It is necessary for identification and authorization of clients, announce the roles of nodes.
  59. 59. WAMP architecture 15 Realm. domain, namespace, single space within which resources and message routing takes place.
  60. 60. WAMP architecture 16 Transport. You can use: Websocket, Raw TCP, Unix sockets and even HTTP Long poll.
  61. 61. WAMP architecture 17 Serializer. All messages are serialized using JSON/MessagePack/ CBOR. message
  62. 62. WAMP architecture 18 Resource identifiers, URI. Required for topics, procedures and errors. For example: Topic: «sensor.events» RPC: «discover.devices» message
  63. 63. Basic WAMP concepts 19
  64. 64. Basic WAMP concepts • Client. Can provide or consume resources, such as subscriptions and RPC. • Router. Deals with authorization and message routing between clients. • Peer. Can be a client or a router, must have at least one role. • Role. Determines the capabilities of the node. There are 4 client roles and 2 router roles. • Session. It is necessary to identify and authorize clients, announce the role of nodes. • Realm. Domain, namespace, within which messages are routed. • Transport. You can use: WebSockets, Raw TCP, Unix sockets and even HTTP Long poll. • Serializer. Messages are serialized using JSON / MessagePack / CBOR / etc. • Resource identifiers, URIs. Required for topics, procedures and errors. 19
  65. 65. WAMP: Features 20
  66. 66. WAMP: Features • Basic profile: basic features of RPC and PubSub 20
  67. 67. WAMP: Features • Basic profile: basic features of RPC and PubSub • Advanced profile: 20
  68. 68. WAMP: Features • Basic profile: basic features of RPC and 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. 69. WAMP: session establishment 21 Client Router Realm
  70. 70. WAMP: session establishment 21 HELLO Client Router Realm [1, "homeapp", { "roles": { "publisher": {}, "subscriber": {} } }]
  71. 71. WAMP: session establishment 21 HELLO WELCOME Client Router Realm [2, 9129137332, { "roles": { "broker": {} } }]
  72. 72. WAMP: session establishment 21 HELLO WELCOME ABORT Client Router Realm [3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"]
  73. 73. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client) ABORT Client Router Realm [6, {"message": "The host is shutting down now."}, "wamp.error.system_shutdown"]
  74. 74. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE Client Router Realm [6, {}, "wamp.error.goodbye_and_out"]
  75. 75. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE GOODBYE (init by router) Client Router Realm [6, {}, "wamp.error.close_realm"]
  76. 76. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE GOODBYE GOODBYE (init by router) Client Router Realm [6, {}, "wamp.error.goodbye_and_out"]
  77. 77. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE GOODBYE GOODBYE (init by router) Client Router Realm
  78. 78. WAMP: Publish / Subscribe 22 Publisher Broker Subscriber Realm
  79. 79. WAMP: Publish / Subscribe 22 SUBSCRIBE Publisher Broker Subscriber Realm [32, 713845233, {}, "sensor.events"]
  80. 80. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED Publisher Broker Subscriber Realm [33, 713845233, 5512315355]
  81. 81. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR Publisher Broker Subscriber Realm [8, 32, 713845233, {}, "wamp.error.not_authorized"]
  82. 82. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH Publisher Broker Subscriber Realm [16, 239714735, {}, "sensor.events", [], {"sensorId ": 25, "temp": 27}]
  83. 83. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH PUBLISHED Publisher Broker Subscriber Realm [17, 239714735, 4429313566]
  84. 84. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH PUBLISHED ERROR Publisher Broker Subscriber Realm [8, 16, 239714735, {}, "wamp.error.not_authorized"]
  85. 85. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm [36, 5512315355, 4429313566, {}, [], {"sensorId ": 25, "temp": 27}]
  86. 86. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE ERROR PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm [34, 85346237, 5512315355]
  87. 87. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE UNSUBSCRIBED ERROR PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm [35, 85346237]
  88. 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. 89. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE UNSUBSCRIBED ERROR ERROR PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm
  90. 90. WAMP: Remote Procedure Calls 23 Caller Dealer Callee Realm
  91. 91. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTERRealm [64, 25349185, {}, "dcs.fan.control"]
  92. 92. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED Realm [65, 25349185, 2103333224]
  93. 93. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED ERROR Realm [8, 64, 25349185, {}, "wamp.error.procedure_already_exists"]
  94. 94. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED ERROR CALL Realm [48, 7814135, {}, "dcs.fan.control", [true]]
  95. 95. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED ERROR CALL INVOCATION Realm [68, 6131533, 9823528, {}, [true]]
  96. 96. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED ERROR CALL INVOCATION YIELD Realm [70, 6131533, {}]
  97. 97. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED ERROR CALL RESULT INVOCATION YIELD Realm [50, 7814135, {}]
  98. 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. 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. 100. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED UNREGISTER ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm [66, 788923562, 2103333224]
  101. 101. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED UNREGISTER UNREGISTERED ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm [67, 788923562]
  102. 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. 103. WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED UNREGISTER UNREGISTERED ERROR ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm
  104. 104. WAMP as a basis for SOA applications 24
  105. 105. WAMP as a basis for SOA applications Distributed architecture 24
  106. 106. WAMP as a basis for SOA applications Distributed architecture Loose coupling of components 24
  107. 107. WAMP as a basis for SOA applications Distributed architecture Loose coupling of components A simple and intuitive interface for interaction 24
  108. 108. WAMP as a basis for SOA applications Distributed architecture Loose coupling of components A simple and intuitive interface for interaction Unified Routing 24
  109. 109. WAMP as a basis for SOA applications Distributed architecture Loose coupling of components A simple and intuitive interface for interaction Unified Routing Independence from programming language 24
  110. 110. WAMP as a basis for SOA applications Distributed architecture Loose coupling of components A simple and intuitive interface for interaction Unified Routing Independence from programming language Re-usability of components 24
  111. 111. WAMP as a basis for SOA applications Distributed architecture Loose coupling of components A simple and intuitive interface for interaction Unified Routing Independence from programming language Re-usability of components WAMP satisfies the requirements of SOA 24
  112. 112. WAMP as ESB 25 WAMP Router Service Providers Service Providers Service Providers Service Providers Service Providers Consumers Consumers Consumers Consumers Consumers call RPC Subscribe to topics Register RPC Publish events Subscribe to topics Publish events Сервер Сервер Server
  113. 113. WAMP in heterogeneous systems 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 Сервер Сервер Server
  114. 114. WAMP Application fields 27
  115. 115. WAMP Application fields 27 Distributed applications with a large number of services
  116. 116. WAMP Application fields 27 Distributed applications with a large number of services Smart homes, Smart cities, Internet of things in General
  117. 117. WAMP Application fields 27 Distributed applications with a large number of services Smart homes, Smart cities, Internet of things in General Systems with long-running processes
  118. 118. WAMP Application fields 27 Distributed applications with a large number of services Smart homes, Smart cities, Internet of things in General Systems with long-running processes Easy modern alternative to XMPP, XMLRPC
  119. 119. WAMP Application fields 27 Distributed applications with a large number of services Smart homes, Smart cities, Internet of things in General Systems with long-running processes Easy modern alternative to XMPP, XMLRPC Network multiplayer games
  120. 120. WAMP: real projects 28
  121. 121. WAMP: real projects • Kadecot API Server. Sony Computer Science Laboratories 28
  122. 122. WAMP: real projects • Kadecot API Server. Sony Computer Science Laboratories • ParaView. Parallel Data Analysis and Visualization Application, Kitware 28
  123. 123. WAMP: real projects • Kadecot API Server. Sony Computer Science Laboratories • ParaView. Parallel Data Analysis and Visualization Application, Kitware • Record.Evolution. Data-warehouse and Business Intelligence 28
  124. 124. WAMP: real projects • 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. 125. WAMP: real projects • 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 Server Management Subsystem 28
  126. 126. Health monitor Nginx Server Management Subsystem 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. 127. Loowy: WAMP client in Lua 30
  128. 128. Loowy: WAMP client in Lua 30 • Works in Lua/Luajit environment on top of lua-ev
  129. 129. Loowy: WAMP client in Lua 30 • Works in Lua/Luajit environment on top of lua-ev • Supports JSON and Msgpack serializers
  130. 130. Loowy: WAMP client in Lua 30 • Works in Lua/Luajit environment on top of lua-ev • Supports JSON and Msgpack serializers • Supports a number of features from Advanced Profile
  131. 131. Loowy: WAMP client in Lua 30 • Works in Lua/Luajit environment on top of lua-ev • Supports JSON and Msgpack serializers • Supports a number of features from Advanced Profile • Automatic reconnection and re-subscription
  132. 132. Loowy: WAMP client in Lua 30 • Works in Lua/Luajit environment on top of lua-ev • Supports JSON and Msgpack serializers • Supports a number of features from Advanced Profile • Automatic reconnection and re-subscription • TODO: Raw socket transport • TODO: Meta API • TODO: Challenge-Response Authorization (WAMP-CRA) • TODO: work on the basis of coroutines
  133. 133. Loowy: api calls examples 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. 134. Loowy: Technology stack 32
  135. 135. Loowy: Technology stack 32 • Lua 5.1+, Luajit 2.0 • lua-websockets (which uses luasocket under the hood) • lua-ev • lua-rapidjson • lua-MessagePack (optional)
  136. 136. Wiola: WAMP router in Lua 33
  137. 137. Wiola: WAMP router in Lua • Works on top of Nginx/Lua module 33
  138. 138. Wiola: WAMP router in Lua • Works on top of Nginx/Lua module • Uses Redis for runtime storage 33
  139. 139. Wiola: WAMP router in Lua • Works on top of Nginx/Lua module • Uses Redis for runtime storage • Supports JSON and Msgpack serializers 33
  140. 140. Wiola: WAMP router in Lua • Works on top of Nginx/Lua module • Uses Redis for runtime storage • Supports JSON and Msgpack serializers • Supports a number of features from Advanced Profile 33
  141. 141. Wiola: WAMP router in Lua • Works on top of Nginx/Lua module • Uses Redis for runtime storage • Supports JSON and Msgpack serializers • Supports a number of features from Advanced Profile • TODO: Raw socket transport • TODO: Meta API • TODO: lua-resty-postgres 33
  142. 142. Wiola: Technology stack 34
  143. 143. Wiola: Technology stack 34 • Nginx or OpenResty, simply put lua-nginx-module • lua-resty-websocket • lua-resty-redis • Redis Server • lua-rapidjson • lua-resty-hmac (optional, is required for WAMP-CRA) • lua-MessagePack (optional)
  144. 144. Wiola: Nginx config 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. 145. Nginx Wiola: Common scheme 36 Web Client init_by_lua headers_filter_by_lua content_by_lua Redis Server
  146. 146. Wiola: JSON caveats and limitations 37
  147. 147. Wiola: JSON caveats and limitations • cJSON 37
  148. 148. Wiola: JSON caveats and limitations • cJSON • you cannot specify how to serialize empty tables 37
  149. 149. Wiola: JSON caveats and limitations • cJSON • you cannot specify how to serialize empty tables • lua-resty-libcjson 37
  150. 150. Wiola: JSON caveats and limitations • cJSON • you cannot specify how to serialize empty tables • lua-resty-libcjson • not able to work with large numbers (int > 32bit) 37
  151. 151. Wiola: JSON caveats and limitations • cJSON • you cannot specify how to serialize empty tables • lua-resty-libcjson • not able to work with large numbers (int > 32bit) lua-rapidjson 37
  152. 152. Wiola: JSON caveats and limitations • cJSON • you cannot specify how to serialize empty tables • lua-resty-libcjson • not able to work with large numbers (int > 32bit) lua-rapidjson • So far, no new problems have been found :) 37
  153. 153. Wiola: Runtime storage options 38
  154. 154. Wiola: Runtime storage options 38 • Global variables in memory
  155. 155. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler
  156. 156. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler • problems with concurrent requests
  157. 157. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler • problems with concurrent requests • Module variables loaded in init_by_lua
  158. 158. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler • problems with concurrent requests • Module variables loaded in init_by_lua • You can read in all workers
  159. 159. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler • problems with concurrent requests • Module variables loaded in init_by_lua • You can read in all workers • But the write, thanks to CoW, will create a copy of the module for the VM
  160. 160. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler • problems with concurrent requests • Module variables loaded in init_by_lua • You can read in all workers • But the write, thanks to CoW, will create a copy of the module for the VM • ngx.shared.DICT
  161. 161. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler • problems with concurrent requests • Module variables loaded in init_by_lua • You can read in all workers • But the write, thanks to CoW, will create a copy of the module for the VM • ngx.shared.DICT • The size of each dictionary is specified in the config file and can not be changed
  162. 162. Wiola: Runtime storage options 38 • Global variables in memory • are created every time on request handler • problems with concurrent requests • Module variables loaded in init_by_lua • You can read in all workers • But the write, thanks to CoW, will create a copy of the module for the VM • ngx.shared.DICT • The size of each dictionary is specified in the config file and can not be changed External storage: Redis, Memcache, PostgreSQL, MySQL and others
  163. 163. Wiola: Особенности. lua_code_cache 39
  164. 164. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off;
  165. 165. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is convenient to debug the code
  166. 166. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is convenient to debug the code • every require() is executed again in each request
  167. 167. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is convenient to debug the code • every require() is executed again in each request • Even the modules loaded into init_by_lua are re-executed
  168. 168. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is convenient to debug the code • every require() is executed again in each request • Even the modules loaded into init_by_lua are re-executed • lua_code_cache on;
  169. 169. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is convenient to debug the code • every require() is executed again in each request • Even the modules loaded into init_by_lua are re-executed • lua_code_cache on; • for production environment
  170. 170. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is convenient to debug the code • every require() is executed again in each request • Even the modules loaded into init_by_lua are re-executed • lua_code_cache on; • for production environment • each require() is executed once and is cached
  171. 171. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is convenient to debug the code • every require() is executed again in each request • Even the modules loaded into init_by_lua are re-executed • lua_code_cache on; • for production environment • each require() is executed once and is cached • whenever you change the code, you need to reload nginx
  172. 172. Wiola: Publication in luarocks, opm 40
  173. 173. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other:
  174. 174. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket
  175. 175. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis
  176. 176. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson
  177. 177. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac
  178. 178. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack
  179. 179. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): accurate to "reverse":
  180. 180. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): accurate to "reverse": ✓ lua-resty-websocket
  181. 181. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): accurate to "reverse": ✓ lua-resty-websocket ✓ lua-resty-redis
  182. 182. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): accurate to "reverse": ✓ lua-resty-websocket ✓ lua-resty-redis - rapidjson
  183. 183. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): accurate to "reverse": ✓ lua-resty-websocket ✓ lua-resty-redis - rapidjson ✓ lua-resty-hmac
  184. 184. Wiola: Publication in luarocks, opm 40 • luarocks: there is one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): accurate to "reverse": ✓ lua-resty-websocket ✓ lua-resty-redis - rapidjson ✓ lua-resty-hmac - lua-messagepack
  185. 185. Useful links about WAMP 41
  186. 186. Useful links about WAMP • WAMP main site: http://wamp-proto.org/ • WAMP spec on 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. 187. WAMP: Conclusion 42
  188. 188. WAMP: Conclusion • A simple and open Protocol 42
  189. 189. WAMP: Conclusion • A simple and open Protocol • RPC and PubSub in one transport/protocol 42
  190. 190. WAMP: Conclusion • A simple and open Protocol • RPC and PubSub in one transport/protocol • Any transport and serialization 42
  191. 191. WAMP: Conclusion • A simple and open Protocol • RPC and PubSub in one transport/protocol • Any transport and serialization • Allows you to build distributed applications with loosely coupled components 42
  192. 192. WAMP: Conclusion • A simple and open Protocol • RPC and PubSub in one transport/protocol • Any transport and serialization • Allows you to build distributed applications with loosely coupled components • There are implementations in many languages 42
  193. 193. WAMP: Conclusion • A simple and open Protocol • RPC and PubSub in one transport/protocol • Any transport and serialization • Allows you to build distributed applications with loosely coupled components • There are implementations in many languages • Open source 42
  194. 194. WAMP: Conclusion • A simple and open Protocol • RPC and PubSub in one transport/protocol • Any transport and serialization • Allows you to build distributed applications with loosely coupled components • There are implementations in many languages • Open source • A small but friendly community 42
  195. 195. WAMP: Conclusion 43
  196. 196. WAMP: Conclusion • Useful architectural solution 43
  197. 197. WAMP: Conclusion • Useful architectural solution • A great option for your IoT project! (IMHO: better than MQTT) 43
  198. 198. WAMP: Conclusion • Useful architectural solution • A great option for your IoT project! (IMHO: better than MQTT) • Try WAMP: 43
  199. 199. WAMP: Conclusion • Useful architectural solution • A great option for your IoT project! (IMHO: better than MQTT) • Try WAMP: • Already have nginx/openresty? — try Wiola (bit.ly/wiola-router) 43
  200. 200. WAMP: Conclusion • Useful architectural solution • A great option for your IoT project! (IMHO: better than MQTT) • Try WAMP: • Already have nginx/openresty? — try Wiola (bit.ly/wiola-router) • Are you using a docker? 43
  201. 201. WAMP: Conclusion • Useful architectural solution • A great option for your IoT project! (IMHO: better than MQTT) • Try WAMP: • Already have nginx/openresty? — try Wiola (bit.ly/wiola-router) • Are you using a docker? • docker pull 421p/wiola 43
  202. 202. WAMP: Conclusion • Useful architectural solution • A great option for your IoT project! (IMHO: better than MQTT) • Try WAMP: • Already have nginx/openresty? — try Wiola (bit.ly/wiola-router) • Are you using a docker? • docker pull 421p/wiola • docker pull crossbario/crossbar 43
  203. 203. WAMP: Conclusion • Useful architectural solution • A great option for your IoT project! (IMHO: better than MQTT) • Try WAMP: • Already have nginx/openresty? — try Wiola (bit.ly/wiola-router) • Are you using a docker? • docker pull 421p/wiola • docker pull crossbario/crossbar • WAMP client for every taste and color (wamp-proto.org/implementations/) 43
  204. 204. Thank you for attention! And your questions :) 44 Konstantin Burkalev • Mail: kostik@ksdaemon.ru • Twitter: @KSDaemon • GitHub: KSDaemon • Blog: blog.ksdaemon.ru • SDCast: sdcast.ksdaemon.ru

×