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

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

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

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.

Konstantin Burkalev

December 13, 2017
Tweet

More Decks by Konstantin Burkalev

Other Decks in Programming

Transcript

  1. WAMP as a platform for composite SOA applications and its

    implementation on Lua Konstantin Burkalev @KSDaemon
  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. 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. The system turns on a fan Bath room Living room

    Task: Smart Home System 4 User
  5. The system turns on a fan Bath room Living room

    Task: Smart Home System 4 User
  6. What is WAMP • It stands for "Web Application Messaging

    Protocol" • Is intended for communication between software components in near real-time 5
  7. 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
  8. 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
  9. 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
  10. Why WAMP? • Open specification • Thoughtful Publish / Subscribe

    • Thoughtful Remote Procedure Calls • Message routing 6
  11. Why WAMP? • Open specification • Thoughtful Publish / Subscribe

    • Thoughtful Remote Procedure Calls • Message routing • Cross-platform 6
  12. Why WAMP? • Open specification • Thoughtful Publish / Subscribe

    • Thoughtful Remote Procedure Calls • Message routing • Cross-platform • There are implementations in more than 15 languages 6
  13. 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 ✔ - - - ✔ -
  14. WAMP architecture 12 Peer. Can be a client or a

    router, must have at least one role.
  15. WAMP architecture 13 Role. Defines features of the node. There

    are 4 client roles and 2 roles of the router.
  16. WAMP architecture 14 Session. It is necessary for identification and

    authorization of clients, announce the roles of nodes.
  17. WAMP architecture 18 Resource identifiers, URI. Required for topics, procedures

    and errors. For example: Topic: «sensor.events» RPC: «discover.devices» message
  18. 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
  19. 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
  20. WAMP: session establishment 21 HELLO Client Router Realm [1, "homeapp",

    { "roles": { "publisher": {}, "subscriber": {} } }]
  21. WAMP: session establishment 21 HELLO WELCOME ABORT Client Router Realm

    [3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"]
  22. 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"]
  23. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client)

    ABORT GOODBYE Client Router Realm [6, {}, "wamp.error.goodbye_and_out"]
  24. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client)

    ABORT GOODBYE GOODBYE (init by router) Client Router Realm [6, {}, "wamp.error.close_realm"]
  25. 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"]
  26. WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client)

    ABORT GOODBYE GOODBYE GOODBYE (init by router) Client Router Realm
  27. WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR Publisher Broker

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    UNREGISTER UNREGISTERED ERROR ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm
  47. WAMP as a basis for SOA applications Distributed architecture Loose

    coupling of components A simple and intuitive interface for interaction 24
  48. WAMP as a basis for SOA applications Distributed architecture Loose

    coupling of components A simple and intuitive interface for interaction Unified Routing 24
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. WAMP Application fields 27 Distributed applications with a large number

    of services Smart homes, Smart cities, Internet of things in General
  55. 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
  56. 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
  57. 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
  58. WAMP: real projects • Kadecot API Server. Sony Computer Science

    Laboratories • ParaView. Parallel Data Analysis and Visualization Application, Kitware 28
  59. 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
  60. 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
  61. 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
  62. 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
  63. Loowy: WAMP client in Lua 30 • Works in Lua/Luajit

    environment on top of lua-ev • Supports JSON and Msgpack serializers
  64. 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
  65. 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
  66. 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
  67. 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 })
  68. 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)
  69. Wiola: WAMP router in Lua • Works on top of

    Nginx/Lua module • Uses Redis for runtime storage 33
  70. Wiola: WAMP router in Lua • Works on top of

    Nginx/Lua module • Uses Redis for runtime storage • Supports JSON and Msgpack serializers 33
  71. 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
  72. 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
  73. 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)
  74. 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; }
  75. Wiola: JSON caveats and limitations • cJSON • you cannot

    specify how to serialize empty tables 37
  76. Wiola: JSON caveats and limitations • cJSON • you cannot

    specify how to serialize empty tables • lua-resty-libcjson 37
  77. 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
  78. 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
  79. 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
  80. Wiola: Runtime storage options 38 • Global variables in memory

    • are created every time on request handler
  81. Wiola: Runtime storage options 38 • Global variables in memory

    • are created every time on request handler • problems with concurrent requests
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is

    convenient to debug the code • every require() is executed again in each request
  89. 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
  90. 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;
  91. 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
  92. 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
  93. 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
  94. Wiola: Publication in luarocks, opm 40 • luarocks: there is

    one part of the dependencies, there is no other:
  95. Wiola: Publication in luarocks, opm 40 • luarocks: there is

    one part of the dependencies, there is no other: - lua-resty-websocket
  96. Wiola: Publication in luarocks, opm 40 • luarocks: there is

    one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis
  97. 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
  98. 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
  99. 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
  100. 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":
  101. 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
  102. 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
  103. 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
  104. 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
  105. 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
  106. 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
  107. WAMP: Conclusion • A simple and open Protocol • RPC

    and PubSub in one transport/protocol 42
  108. WAMP: Conclusion • A simple and open Protocol • RPC

    and PubSub in one transport/protocol • Any transport and serialization 42
  109. 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
  110. 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
  111. 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
  112. 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
  113. WAMP: Conclusion • Useful architectural solution • A great option

    for your IoT project! (IMHO: better than MQTT) 43
  114. WAMP: Conclusion • Useful architectural solution • A great option

    for your IoT project! (IMHO: better than MQTT) • Try WAMP: 43
  115. 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
  116. 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
  117. 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
  118. 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
  119. 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
  120. Thank you for attention! And your questions :) 44 Konstantin

    Burkalev • Mail: [email protected] • Twitter: @KSDaemon • GitHub: KSDaemon • Blog: blog.ksdaemon.ru • SDCast: sdcast.ksdaemon.ru