Share
Embed
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
Transcript
204 slides
-
WAMP as a platform for composite SOA applications and its
implementation on Lua Konstantin Burkalev @KSDaemon -
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 -
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 -
The temperature sensor detects the temperature raise Bath room Living
room Task: Smart Home System 4 User -
The client is notified Logged in database Bath room Living
room Task: Smart Home System 4 User -
The client is notified Logged in database Bath room Living
room Task: Smart Home System 4 User -
The system turns on air conditioning Bath room Living room
Task: Smart Home System 4 User -
The temperature in the room decreases Bath room Living room
Task: Smart Home System 4 User -
The system turns off the air conditioning Bath room Living
room Task: Smart Home System 4 User -
The system turns off the air conditioning Bath room Living
room Task: Smart Home System 4 User -
The humidity in the bathroom rises Bath room Living room
Task: Smart Home System 4 User -
The client is notified Logged in database Bath room Living
room Task: Smart Home System 4 User -
The client is notified Logged in database Bath room Living
room Task: Smart Home System 4 User -
The system turns on a fan Bath room Living room
Task: Smart Home System 4 User -
The system turns on a fan Bath room Living room
Task: Smart Home System 4 User -
The humidity in the bathroom drops Bath room Living room
Task: Smart Home System 4 User -
The system turns off the fan Bath room Living room
Task: Smart Home System 4 User -
The system turns off the fan Bath room Living room
Task: Smart Home System 4 User -
Admin configures threshold values Bath room Living room Task: Smart
Home System 4 User Admin -
Admin searches new devices Bath room Living room Task: Smart
Home System 4 User Admin -
The system informs about found devices Bath room Living room
Task: Smart Home System 4 User Admin -
The system informs about found devices Bath room Living room
Task: Smart Home System 4 User Admin -
What is WAMP • It stands for "Web Application Messaging
Protocol" • Is intended for communication between software components in near real-time 5 -
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 -
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 -
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 -
Why WAMP? • Open specification • Thoughtful Publish / Subscribe
• Thoughtful Remote Procedure Calls 6 -
Why WAMP? • Open specification • Thoughtful Publish / Subscribe
• Thoughtful Remote Procedure Calls • Message routing 6 -
Why WAMP? • Open specification • Thoughtful Publish / Subscribe
• Thoughtful Remote Procedure Calls • Message routing • Cross-platform 6 -
Why WAMP? • Open specification • Thoughtful Publish / Subscribe
• Thoughtful Remote Procedure Calls • Message routing • Cross-platform • There are implementations in more than 15 languages 6 -
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 ✔ - - - ✔ - -
WAMP architecture 10 Client. Can provide or consume resources such
as subscriptions and RPC. -
WAMP architecture 12 Peer. Can be a client or a
router, must have at least one role. -
WAMP architecture 13 Role. Defines features of the node. There
are 4 client roles and 2 roles of the router. -
WAMP architecture 14 Session. It is necessary for identification and
authorization of clients, announce the roles of nodes. -
WAMP architecture 15 Realm. domain, namespace, single space within which
resources and message routing takes place. -
WAMP architecture 16 Transport. You can use: Websocket, Raw TCP,
Unix sockets and even HTTP Long poll. -
WAMP architecture 18 Resource identifiers, URI. Required for topics, procedures
and errors. For example: Topic: «sensor.events» RPC: «discover.devices» message -
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 -
WAMP: Features • Basic profile: basic features of RPC and
PubSub • Advanced profile: 20 -
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 -
WAMP: session establishment 21 HELLO Client Router Realm [1, "homeapp",
{ "roles": { "publisher": {}, "subscriber": {} } }] -
WAMP: session establishment 21 HELLO WELCOME Client Router Realm [2,
9129137332, { "roles": { "broker": {} } }] -
WAMP: session establishment 21 HELLO WELCOME ABORT Client Router Realm
[3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"] -
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"] -
WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client)
ABORT GOODBYE Client Router Realm [6, {}, "wamp.error.goodbye_and_out"] -
WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client)
ABORT GOODBYE GOODBYE (init by router) Client Router Realm [6, {}, "wamp.error.close_realm"] -
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"] -
WAMP: session establishment 21 HELLO WELCOME GOODBYE (init by client)
ABORT GOODBYE GOODBYE GOODBYE (init by router) Client Router Realm -
WAMP: Publish / Subscribe 22 SUBSCRIBE Publisher Broker Subscriber Realm
[32, 713845233, {}, "sensor.events"] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED Publisher Broker Subscriber
Realm [33, 713845233, 5512315355] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR Publisher Broker
Subscriber Realm [8, 32, 713845233, {}, "wamp.error.not_authorized"] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH Publisher
Broker Subscriber Realm [16, 239714735, {}, "sensor.events", [], {"sensorId ": 25, "temp": 27}] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH PUBLISHED
Publisher Broker Subscriber Realm [17, 239714735, 4429313566] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH PUBLISHED
ERROR Publisher Broker Subscriber Realm [8, 16, 239714735, {}, "wamp.error.not_authorized"] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED ERROR PUBLISH PUBLISHED
ERROR EVENT Publisher Broker Subscriber Realm [36, 5512315355, 4429313566, {}, [], {"sensorId ": 25, "temp": 27}] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE ERROR PUBLISH
PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm [34, 85346237, 5512315355] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE UNSUBSCRIBED ERROR
PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm [35, 85346237] -
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"] -
WAMP: Publish / Subscribe 22 SUBSCRIBE SUBSCRIBED UNSUBSCRIBE UNSUBSCRIBED ERROR
ERROR PUBLISH PUBLISHED ERROR EVENT Publisher Broker Subscriber Realm -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER Realm
[64, 25349185, {}, "dcs.fan.control"] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
Realm [65, 25349185, 2103333224] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
ERROR Realm [8, 64, 25349185, {}, "wamp.error.procedure_already_exists"] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
ERROR CALL Realm [48, 7814135, {}, "dcs.fan.control", [true]] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
ERROR CALL INVOCATION Realm [68, 6131533, 9823528, {}, [true]] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
ERROR CALL INVOCATION YIELD Realm [70, 6131533, {}] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
ERROR CALL RESULT INVOCATION YIELD Realm [50, 7814135, {}] -
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"] -
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"] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
UNREGISTER ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm [66, 788923562, 2103333224] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
UNREGISTER UNREGISTERED ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm [67, 788923562] -
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"] -
WAMP: Remote Procedure Calls 23 Caller Dealer Callee REGISTER REGISTERED
UNREGISTER UNREGISTERED ERROR ERROR CALL RESULT INVOCATION YIELD ERROR ERROR Realm -
WAMP as a basis for SOA applications Distributed architecture Loose
coupling of components 24 -
WAMP as a basis for SOA applications Distributed architecture Loose
coupling of components A simple and intuitive interface for interaction 24 -
WAMP as a basis for SOA applications Distributed architecture Loose
coupling of components A simple and intuitive interface for interaction Unified Routing 24 -
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 -
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 -
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 -
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 -
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 -
WAMP Application fields 27 Distributed applications with a large number
of services Smart homes, Smart cities, Internet of things in General -
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 -
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 -
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 -
WAMP: real projects • Kadecot API Server. Sony Computer Science
Laboratories 28 -
WAMP: real projects • Kadecot API Server. Sony Computer Science
Laboratories • ParaView. Parallel Data Analysis and Visualization Application, Kitware 28 -
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 -
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 -
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 -
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 -
Loowy: WAMP client in Lua 30 • Works in Lua/Luajit
environment on top of lua-ev -
Loowy: WAMP client in Lua 30 • Works in Lua/Luajit
environment on top of lua-ev • Supports JSON and Msgpack serializers -
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 -
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 -
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 -
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 }) -
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) -
Wiola: WAMP router in Lua • Works on top of
Nginx/Lua module 33 -
Wiola: WAMP router in Lua • Works on top of
Nginx/Lua module • Uses Redis for runtime storage 33 -
Wiola: WAMP router in Lua • Works on top of
Nginx/Lua module • Uses Redis for runtime storage • Supports JSON and Msgpack serializers 33 -
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 -
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 -
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) -
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; } -
Wiola: JSON caveats and limitations • cJSON • you cannot
specify how to serialize empty tables 37 -
Wiola: JSON caveats and limitations • cJSON • you cannot
specify how to serialize empty tables • lua-resty-libcjson 37 -
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 -
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 -
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 -
Wiola: Runtime storage options 38 • Global variables in memory
• are created every time on request handler -
Wiola: Runtime storage options 38 • Global variables in memory
• are created every time on request handler • problems with concurrent requests -
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 -
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 -
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 -
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 -
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 -
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 -
Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is
convenient to debug the code -
Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • it is
convenient to debug the code • every require() is executed again in each request -
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 -
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; -
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 -
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 -
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 -
Wiola: Publication in luarocks, opm 40 • luarocks: there is
one part of the dependencies, there is no other: -
Wiola: Publication in luarocks, opm 40 • luarocks: there is
one part of the dependencies, there is no other: - lua-resty-websocket -
Wiola: Publication in luarocks, opm 40 • luarocks: there is
one part of the dependencies, there is no other: - lua-resty-websocket - lua-resty-redis -
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 -
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 -
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 -
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": -
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 -
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 -
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 -
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 -
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 -
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 -
WAMP: Conclusion • A simple and open Protocol • RPC
and PubSub in one transport/protocol 42 -
WAMP: Conclusion • A simple and open Protocol • RPC
and PubSub in one transport/protocol • Any transport and serialization 42 -
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 -
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 -
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 -
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 -
WAMP: Conclusion • Useful architectural solution • A great option
for your IoT project! (IMHO: better than MQTT) 43 -
WAMP: Conclusion • Useful architectural solution • A great option
for your IoT project! (IMHO: better than MQTT) • Try WAMP: 43 -
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 -
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 -
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 -
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 -
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 -
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