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 как основа
композитных
SOA-приложений и
его реализация на Lua
Константин Буркалёв
@KSDaemon
Пара	слов	о	себе…
2
• Системный	архитектор	
• 15+	лет	опыта	в	ИТ	
• Автор	и	ведущий	подкастов	о	разработке:	SDCast	&	Radio...
План	доклада
Пример	системы	с	применением	WAMP	
Что	такое	протокол	WAMP,	и	как	он	устроен	
WAMP	как	основа	SOA-решений	
Сф...
Задача:	Система	«Умный	дом»
4
Комната
Задача:	Система	«Умный	дом»
4
Комната
Задача:	Система	«Умный	дом»
4
Комната
Задача:	Система	«Умный	дом»
4
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Датчик	температуры	фиксирует	
превышение	температуры
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Оповещается	клиент	
Логируется	в	базу
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Оповещается	клиент	
Логируется	в	базу
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Система	включает	
кондиционер
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Температура	в	комнате	снижается
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Система	выключает	кондиционер
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Система	выключает	кондиционер
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Влажность	в	ванной	поднимается
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Оповещается	клиент	
Логируется	в	базу
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Оповещается	клиент	
Логируется	в	базу
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Система	включает	
вентилятор
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Система	включает	
вентилятор
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Влажность	в	ванной	снижается
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Система	выключает	вентилятор
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Система	выключает	вентилятор
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Админ
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Админ
Админ	настраивает		
пороговые	значения
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Админ
Админ	производит	поиск		
новых	устройств
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Админ
Система	информирует	о		
найденных	устройствах
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Админ
Система	информирует	о		
найденных	устройствах
Ванная
Комната
Задача:	Система	«Умный	дом»
4
Пользователь
Админ
Что	такое	WAMP
5
Что	такое	WAMP
• Расшифровывается	как	«Web	Application	Messaging	Protocol»
5
Что	такое	WAMP
• Расшифровывается	как	«Web	Application	Messaging	Protocol»
• Предназначен	для	коммуникации	между	программн...
Что	такое	WAMP
• Расшифровывается	как	«Web	Application	Messaging	Protocol»
• Предназначен	для	коммуникации	между	программн...
Что	такое	WAMP
• Расшифровывается	как	«Web	Application	Messaging	Protocol»
• Предназначен	для	коммуникации	между	программн...
Что	такое	WAMP
• Расшифровывается	как	«Web	Application	Messaging	Protocol»
• Предназначен	для	коммуникации	между	программн...
Почему	WAMP?
6
Почему	WAMP?
•Открытая	спецификация
6
Почему	WAMP?
•Открытая	спецификация
• Продуманный	Publish/Subscribe
6
Почему	WAMP?
•Открытая	спецификация
• Продуманный	Publish/Subscribe
• Продуманный	Remote	Procedure	Calls
6
Почему	WAMP?
•Открытая	спецификация
• Продуманный	Publish/Subscribe
• Продуманный	Remote	Procedure	Calls
• Роутинг	сообщен...
Почему	WAMP?
•Открытая	спецификация
• Продуманный	Publish/Subscribe
• Продуманный	Remote	Procedure	Calls
• Роутинг	сообщен...
Почему	WAMP?
•Открытая	спецификация
• Продуманный	Publish/Subscribe
• Продуманный	Remote	Procedure	Calls
• Роутинг	сообщен...
Альтернативы	WAMP
7
Technology PubSub RPC
Routed
RPC
Web native
Cross
Language
Open
Standard
WAMP ✔ ✔ ✔ ✔ ✔ ✔
AJAX - ✔ - ✔...
WAMP:	Пример	сообщений
8
Архитектура	WAMP
9
Архитектура	WAMP
10
Клиент.		
Может	предоставлять		
или	потреблять		
ресурсы,	такие	как		
подписки	и	RPC.
Архитектура	WAMP
11
Роутер.		
Занимается		
авторизацией	и		
маршрутизацией		
сообщений		
между	клиентами.
Архитектура	WAMP
12
Peer,	узел.		
Может	быть	клиентом		
или	роутером,		
должен	обладать		
хотя	бы	одной	ролью.
Архитектура	WAMP
13
Роль.		
Определяет		
возможности	узла.		
Есть	4	клиентских		
роли	и	2	роли	роутера.
Архитектура	WAMP
14
Сессия.		
Необходима	для		
идентификации	и		
авторизации	клиентов,		
анонса	ролей	узлов.
Архитектура	WAMP
15
Realm.		
Домен,	namespace,		
единое	пространство	
в	рамках	которого		
определены	ресурсы	
и	происходит...
Архитектура	WAMP
16
Транспорт.		
Можно	использовать:		
WebSockets,	Raw	TCP,		
Unix	sockets	и	даже		
HTTP	Long	poll.
Архитектура	WAMP
17
Сериализатор.		
Все	сообщения		
сериализуются		
с	помощью		
JSON/MessagePack/	
CBOR.
message
Архитектура	WAMP
18
Идентификаторы	
ресурсов,	URI.	
Необходимы	для		
топиков,	процедур		
и	ошибок.	
Например:	
Topic:	«sen...
Основные	понятия	WAMP
19
Основные	понятия	WAMP
• Клиент.	Может	предоставлять	или	потреблять	ресурсы,	такие	как	подписки	и	RPC.	
• Роутер.	Занимаетс...
WAMP:	Features
20
WAMP:	Features
• Basic	profile:	базовые	возможности	RPC	и	PubSub
20
WAMP:	Features
• Basic	profile:	базовые	возможности	RPC	и	PubSub
• Advanced	profile:
20
WAMP:	Features
• Basic	profile:	базовые	возможности	RPC	и	PubSub
• Advanced	profile:
• Challenge-Response	Authentication
•...
WAMP:	установка	сессии
21
Клиент Роутер
Realm
WAMP:	установка	сессии
21
HELLO
Клиент Роутер
Realm
[1,	"homeapp",	{	"roles":	{	"publisher":	{},	"subscriber":	{}	}	}]
WAMP:	установка	сессии
21
HELLO
WELCOME
Клиент Роутер
Realm
[2,	9129137332,	{	"roles":	{	"broker":	{}	}	}]
WAMP:	установка	сессии
21
HELLO
WELCOME
ABORT
Клиент Роутер
Realm
[3,	{"message":	"The	realm	does	not	exist."},	"wamp.erro...
WAMP:	установка	сессии
21
HELLO
WELCOME
GOODBYE (init by client)
ABORT
Клиент Роутер
Realm
[6,	{"message":	"The	host	is	sh...
WAMP:	установка	сессии
21
HELLO
WELCOME
GOODBYE (init by client)
ABORT
GOODBYE
Клиент Роутер
Realm
[6,	{},	"wamp.error.goo...
WAMP:	установка	сессии
21
HELLO
WELCOME
GOODBYE (init by client)
ABORT
GOODBYE
GOODBYE (init by router)
Клиент Роутер
Real...
WAMP:	установка	сессии
21
HELLO
WELCOME
GOODBYE (init by client)
ABORT
GOODBYE
GOODBYE
GOODBYE (init by router)
Клиент Роу...
WAMP:	установка	сессии
21
HELLO
WELCOME
GOODBYE (init by client)
ABORT
GOODBYE
GOODBYE
GOODBYE (init by router)
Клиент Роу...
WAMP:	Publish	/	Subscribe
22
Publisher Broker Subscriber
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.err...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
ERROR
PUBLISH
Publisher Broker Subscriber
Realm
[16,	239714735,	{},	"sen...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
ERROR
PUBLISH
PUBLISHED
Publisher Broker Subscriber
Realm
[17,	239714735...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
ERROR
PUBLISH
PUBLISHED
ERROR
Publisher Broker Subscriber
Realm
[8,	16,	...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
ERROR
PUBLISH
PUBLISHED
ERROR
EVENT
Publisher Broker Subscriber
Realm
[3...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
UNSUBSCRIBE
ERROR
PUBLISH
PUBLISHED
ERROR
EVENT
Publisher Broker Subscri...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
UNSUBSCRIBE
UNSUBSCRIBED
ERROR
PUBLISH
PUBLISHED
ERROR
EVENT
Publisher B...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
UNSUBSCRIBE
UNSUBSCRIBED
ERROR
ERROR
PUBLISH
PUBLISHED
ERROR
EVENT
Publi...
WAMP:	Publish	/	Subscribe
22
SUBSCRIBE
SUBSCRIBED
UNSUBSCRIBE
UNSUBSCRIBED
ERROR
ERROR
PUBLISH
PUBLISHED
ERROR
EVENT
Publi...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
Realm
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTERRealm
[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.pro...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
ERROR
CALL
Realm
[48,	7814135,	{},	"dcs.fan.contr...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
ERROR
CALL
INVOCATION
Realm
[68,	6131533,	9823528...
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,	781...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
ERROR
CALL
RESULT
INVOCATION
YIELD
ERROR
Realm
[8...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
ERROR
CALL
RESULT
INVOCATION
YIELD
ERROR
ERROR
Re...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
UNREGISTER
ERROR
CALL
RESULT
INVOCATION
YIELD
ERR...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
UNREGISTER
UNREGISTERED
ERROR
CALL
RESULT
INVOCAT...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
UNREGISTER
UNREGISTERED
ERROR
ERROR
CALL
RESULT
I...
WAMP:	Remote	Procedure	Calls
23
Caller Dealer Callee
REGISTER
REGISTERED
UNREGISTER
UNREGISTERED
ERROR
ERROR
CALL
RESULT
I...
WAMP	как	основа	SOA-решений
24
WAMP	как	основа	SOA-решений
Распределённая	архитектура
24
WAMP	как	основа	SOA-решений
Распределённая	архитектура
Слабая	связанность	компонентов
24
WAMP	как	основа	SOA-решений
Распределённая	архитектура
Слабая	связанность	компонентов
Простой	и	понятный	интерфейс	взаимод...
WAMP	как	основа	SOA-решений
Распределённая	архитектура
Слабая	связанность	компонентов
Простой	и	понятный	интерфейс	взаимод...
WAMP	как	основа	SOA-решений
Распределённая	архитектура
Слабая	связанность	компонентов
Простой	и	понятный	интерфейс	взаимод...
WAMP	как	основа	SOA-решений
Распределённая	архитектура
Слабая	связанность	компонентов
Простой	и	понятный	интерфейс	взаимод...
WAMP	как	основа	SOA-решений
Распределённая	архитектура
Слабая	связанность	компонентов
Простой	и	понятный	интерфейс	взаимод...
WAMP	в	качестве	ESB
25
WAMP	
Router
Service	
Providers
Service	
Providers
Service	
Providers
Service	
Providers
Service	
P...
WAMP	в	гетерогенных	системах
26
WAMP	
Router
File	
uploader	
(python)
Web	
Client	
(js)
Backoffice	
Client	
(c#)
Video	
pr...
Сферы	применения	WAMP
27
Сферы	применения	WAMP
27
Распределённые	приложения	с	большим	количеством	сервисов
Сферы	применения	WAMP
27
Распределённые	приложения	с	большим	количеством	сервисов
Smart	homes,	Smart	cities,	Интернет	веще...
Сферы	применения	WAMP
27
Распределённые	приложения	с	большим	количеством	сервисов
Smart	homes,	Smart	cities,	Интернет	веще...
Сферы	применения	WAMP
27
Распределённые	приложения	с	большим	количеством	сервисов
Smart	homes,	Smart	cities,	Интернет	веще...
Сферы	применения	WAMP
27
Распределённые	приложения	с	большим	количеством	сервисов
Smart	homes,	Smart	cities,	Интернет	веще...
Применение	WAMP:	реальные	проекты
28
Применение	WAMP:	реальные	проекты
• Kadecot	API	Server.	Sony	Computer	Science	Laboratories
28
Применение	WAMP:	реальные	проекты
• Kadecot	API	Server.	Sony	Computer	Science	Laboratories
• ParaView.	Parallel	Data	Analy...
Применение	WAMP:	реальные	проекты
• Kadecot	API	Server.	Sony	Computer	Science	Laboratories
• ParaView.	Parallel	Data	Analy...
Применение	WAMP:	реальные	проекты
• Kadecot	API	Server.	Sony	Computer	Science	Laboratories
• ParaView.	Parallel	Data	Analy...
Применение	WAMP:	реальные	проекты
• Kadecot	API	Server.	Sony	Computer	Science	Laboratories
• ParaView.	Parallel	Data	Analy...
Health	monitor
Nginx
Подсистема	управления	сервером
29
WAMP	
Router
Admin	
App	
(c#)
Shaman
RPC:	set.network
RPC:	get.netw...
Loowy:	WAMP-клиент	на	Lua
30
Loowy:	WAMP-клиент	на	Lua
30
• Работает	в	Lua/Luajit	на	базе	lua-ev
Loowy:	WAMP-клиент	на	Lua
30
• Работает	в	Lua/Luajit	на	базе	lua-ev
• Поддерживает	JSON-	и	Msgpack-сериализаторы
Loowy:	WAMP-клиент	на	Lua
30
• Работает	в	Lua/Luajit	на	базе	lua-ev
• Поддерживает	JSON-	и	Msgpack-сериализаторы
• Поддерж...
Loowy:	WAMP-клиент	на	Lua
30
• Работает	в	Lua/Luajit	на	базе	lua-ev
• Поддерживает	JSON-	и	Msgpack-сериализаторы
• Поддерж...
Loowy:	WAMP-клиент	на	Lua
30
• Работает	в	Lua/Luajit	на	базе	lua-ev
• Поддерживает	JSON-	и	Msgpack-сериализаторы
• Поддерж...
Loowy:	примеры	вызовов
31
client = loowy.new("ws://localhost/ws/", { realm = "gv" })
client:publish('sensor.events', { sen...
Loowy:	Стек	технологий
32
Loowy:	Стек	технологий
32
• Lua	5.1+,	Luajit	2.0
• lua-websockets	(который	работает	через	luasocket)
• lua-ev
• lua-rapidj...
Wiola:	WAMP	роутер	на	Lua
33
Wiola:	WAMP	роутер	на	Lua
• Работает	на	базе	Nginx/Lua	module
33
Wiola:	WAMP	роутер	на	Lua
• Работает	на	базе	Nginx/Lua	module
• Использует	Redis	для	runtime	storage
33
Wiola:	WAMP	роутер	на	Lua
• Работает	на	базе	Nginx/Lua	module
• Использует	Redis	для	runtime	storage
• Поддерживает	JSON-	...
Wiola:	WAMP	роутер	на	Lua
• Работает	на	базе	Nginx/Lua	module
• Использует	Redis	для	runtime	storage
• Поддерживает	JSON-	...
Wiola:	WAMP	роутер	на	Lua
• Работает	на	базе	Nginx/Lua	module
• Использует	Redis	для	runtime	storage
• Поддерживает	JSON-	...
Wiola:	стек	технологий
34
Wiola:	стек	технологий
34
• Nginx	или	OpenResty,	проще	говоря	lua-nginx-module
• lua-resty-websocket
• lua-resty-redis
• R...
Wiola:	конфиг	Nginx
35
location /ws/ {
set $wiola_socket_timeout 10;
set $wiola_max_payload_len 65535;
lua_check_client_ab...
Nginx
Wiola:	Общая	схема
36
Web	
Client
init_by_lua
headers_filter_by_lua
content_by_lua
Redis	
Server
Wiola:	Особенности.	JSON
37
Wiola:	Особенности.	JSON
• cJSON
37
Wiola:	Особенности.	JSON
• cJSON
• нельзя	указать	способ	сериализации	пустых	таблиц
37
Wiola:	Особенности.	JSON
• cJSON
• нельзя	указать	способ	сериализации	пустых	таблиц
• lua-resty-libcjson
37
Wiola:	Особенности.	JSON
• cJSON
• нельзя	указать	способ	сериализации	пустых	таблиц
• lua-resty-libcjson
• не	умеет	работа...
Wiola:	Особенности.	JSON
• cJSON
• нельзя	указать	способ	сериализации	пустых	таблиц
• lua-resty-libcjson
• не	умеет	работа...
Wiola:	Особенности.	JSON
• cJSON
• нельзя	указать	способ	сериализации	пустых	таблиц
• lua-resty-libcjson
• не	умеет	работа...
Wiola:	Особенности.	Runtime-хранилище
38
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
• проб...
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
• проб...
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
• проб...
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
• проб...
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
• проб...
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
• проб...
Wiola:	Особенности.	Runtime-хранилище
38
• Глобальные	переменные	в	памяти
• Создаются	каждый	раз	на	request	handler
• проб...
Wiola:	Особенности.	lua_code_cache
39
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
• удобно	отлаживать	код
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
• удобно	отлаживать	код
• каждый	require()	выполняется	заново	...
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
• удобно	отлаживать	код
• каждый	require()	выполняется	заново	...
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
• удобно	отлаживать	код
• каждый	require()	выполняется	заново	...
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
• удобно	отлаживать	код
• каждый	require()	выполняется	заново	...
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
• удобно	отлаживать	код
• каждый	require()	выполняется	заново	...
Wiola:	Особенности.	lua_code_cache
39
• lua_code_cache	off;
• удобно	отлаживать	код
• каждый	require()	выполняется	заново	...
Wiola:	Публикация	в	luarocks,	opm
40
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Wiola:	Публикация	в	luarocks,	opm
40
• luarocks:	есть	одна	часть	
зависимостей,																							
нет	другой:
- 	lua-...
Полезные	ссылки	про	WAMP
41
Полезные	ссылки	про	WAMP
• Основной	сайт	про	WAMP:	http://wamp-proto.org/
• Спека	WAMP	на	github:	github.com/wamp-proto/wa...
WAMP:	Заключение
42
WAMP:	Заключение
• Простой	и	открытый	протокол
42
WAMP:	Заключение
• Простой	и	открытый	протокол
• RPC	и	PubSub	в	одном	транспорте/протоколе
42
WAMP:	Заключение
• Простой	и	открытый	протокол
• RPC	и	PubSub	в	одном	транспорте/протоколе
• Любой	транспорт	и	сериализаци...
WAMP:	Заключение
• Простой	и	открытый	протокол
• RPC	и	PubSub	в	одном	транспорте/протоколе
• Любой	транспорт	и	сериализаци...
WAMP:	Заключение
• Простой	и	открытый	протокол
• RPC	и	PubSub	в	одном	транспорте/протоколе
• Любой	транспорт	и	сериализаци...
WAMP:	Заключение
• Простой	и	открытый	протокол
• RPC	и	PubSub	в	одном	транспорте/протоколе
• Любой	транспорт	и	сериализаци...
WAMP:	Заключение
• Простой	и	открытый	протокол
• RPC	и	PubSub	в	одном	транспорте/протоколе
• Любой	транспорт	и	сериализаци...
WAMP:	Заключение
43
WAMP:	Заключение
• Полезное	архитектурное	решение
43
WAMP:	Заключение
• Полезное	архитектурное	решение
• Отличный	вариант	для	IoT-проекта!	(имхо:	лучше	чем	MQTT)
43
WAMP:	Заключение
• Полезное	архитектурное	решение
• Отличный	вариант	для	IoT-проекта!	(имхо:	лучше	чем	MQTT)
• Попробуйте	...
WAMP:	Заключение
• Полезное	архитектурное	решение
• Отличный	вариант	для	IoT-проекта!	(имхо:	лучше	чем	MQTT)
• Попробуйте	...
WAMP:	Заключение
• Полезное	архитектурное	решение
• Отличный	вариант	для	IoT-проекта!	(имхо:	лучше	чем	MQTT)
• Попробуйте	...
WAMP:	Заключение
• Полезное	архитектурное	решение
• Отличный	вариант	для	IoT-проекта!	(имхо:	лучше	чем	MQTT)
• Попробуйте	...
WAMP:	Заключение
• Полезное	архитектурное	решение
• Отличный	вариант	для	IoT-проекта!	(имхо:	лучше	чем	MQTT)
• Попробуйте	...
WAMP:	Заключение
• Полезное	архитектурное	решение
• Отличный	вариант	для	IoT-проекта!	(имхо:	лучше	чем	MQTT)
• Попробуйте	...
Спасибо	за	внимание!
И	ваши	вопросы	:)
44
Константин Буркалёв
• Mail: kostik@ksdaemon.ru
• Twitter: @KSDaemon
• GitHub: KS...
Upcoming SlideShare
Loading in …5
×

WAMP как основа композитных SOA-приложений и его имплементация на Lua

50 views

Published on

WAMP расшифровывается как Web Application Messaging Protocol. Это открытый протокол, реализующий два паттерна в рамках одного протокола: RPC и Publish/Subscribe. Как мне кажется, это отличная платформа для сферы Internet of Things, Smart City и вообще бизнес-приложений с большим количеством различных компонентов и сервисов.

Published in: Engineering
  • Be the first to like this

WAMP как основа композитных SOA-приложений и его имплементация на Lua

  1. 1. WAMP как основа композитных SOA-приложений и его реализация на Lua Константин Буркалёв @KSDaemon
  2. 2. Пара слов о себе… 2 • Системный архитектор • 15+ лет опыта в ИТ • Автор и ведущий подкастов о разработке: SDCast & RadioJS • Активный участник группы разработки самого протокола WAMP • Автор и мейнтейнер нескольких реализаций WAMP, в том числе и на Lua
  3. 3. План доклада Пример системы с применением WAMP Что такое протокол WAMP, и как он устроен WAMP как основа SOA-решений Сферы применения WAMP-клиент на Lua WAMP-роутер на Nginx/Lua 3
  4. 4. Задача: Система «Умный дом» 4
  5. 5. Комната Задача: Система «Умный дом» 4
  6. 6. Комната Задача: Система «Умный дом» 4
  7. 7. Комната Задача: Система «Умный дом» 4
  8. 8. Ванная Комната Задача: Система «Умный дом» 4
  9. 9. Ванная Комната Задача: Система «Умный дом» 4
  10. 10. Ванная Комната Задача: Система «Умный дом» 4
  11. 11. Ванная Комната Задача: Система «Умный дом» 4 Пользователь
  12. 12. Ванная Комната Задача: Система «Умный дом» 4 Пользователь
  13. 13. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Датчик температуры фиксирует превышение температуры
  14. 14. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Оповещается клиент Логируется в базу
  15. 15. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Оповещается клиент Логируется в базу
  16. 16. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Система включает кондиционер
  17. 17. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Температура в комнате снижается
  18. 18. Ванная Комната Задача: Система «Умный дом» 4 Пользователь
  19. 19. Ванная Комната Задача: Система «Умный дом» 4 Пользователь
  20. 20. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Система выключает кондиционер
  21. 21. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Система выключает кондиционер
  22. 22. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Влажность в ванной поднимается
  23. 23. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Оповещается клиент Логируется в базу
  24. 24. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Оповещается клиент Логируется в базу
  25. 25. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Система включает вентилятор
  26. 26. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Система включает вентилятор
  27. 27. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Влажность в ванной снижается
  28. 28. Ванная Комната Задача: Система «Умный дом» 4 Пользователь
  29. 29. Ванная Комната Задача: Система «Умный дом» 4 Пользователь
  30. 30. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Система выключает вентилятор
  31. 31. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Система выключает вентилятор
  32. 32. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Админ
  33. 33. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Админ Админ настраивает пороговые значения
  34. 34. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Админ Админ производит поиск новых устройств
  35. 35. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Админ Система информирует о найденных устройствах
  36. 36. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Админ Система информирует о найденных устройствах
  37. 37. Ванная Комната Задача: Система «Умный дом» 4 Пользователь Админ
  38. 38. Что такое WAMP 5
  39. 39. Что такое WAMP • Расшифровывается как «Web Application Messaging Protocol» 5
  40. 40. Что такое WAMP • Расшифровывается как «Web Application Messaging Protocol» • Предназначен для коммуникации между программными компонентами практически в режиме реального времени 5
  41. 41. Что такое WAMP • Расшифровывается как «Web Application Messaging Protocol» • Предназначен для коммуникации между программными компонентами практически в режиме реального времени • Предоставляет два механизма: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) 5
  42. 42. Что такое WAMP • Расшифровывается как «Web Application Messaging Protocol» • Предназначен для коммуникации между программными компонентами практически в режиме реального времени • Предоставляет два механизма: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) • Двунаправленный, упорядоченный 5
  43. 43. Что такое WAMP • Расшифровывается как «Web Application Messaging Protocol» • Предназначен для коммуникации между программными компонентами практически в режиме реального времени • Предоставляет два механизма: • Publish/Subscribe (PubSub) • Remote Procedure Calls (RPC) • Двунаправленный, упорядоченный • Для общения клиентов требуется WAMP-роутер 5
  44. 44. Почему WAMP? 6
  45. 45. Почему WAMP? •Открытая спецификация 6
  46. 46. Почему WAMP? •Открытая спецификация • Продуманный Publish/Subscribe 6
  47. 47. Почему WAMP? •Открытая спецификация • Продуманный Publish/Subscribe • Продуманный Remote Procedure Calls 6
  48. 48. Почему WAMP? •Открытая спецификация • Продуманный Publish/Subscribe • Продуманный Remote Procedure Calls • Роутинг сообщений 6
  49. 49. Почему WAMP? •Открытая спецификация • Продуманный Publish/Subscribe • Продуманный Remote Procedure Calls • Роутинг сообщений • Кроссплатформенность 6
  50. 50. Почему WAMP? •Открытая спецификация • Продуманный Publish/Subscribe • Продуманный Remote Procedure Calls • Роутинг сообщений • Кроссплатформенность • Есть реализации более чем на 15 языках 6
  51. 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. 52. WAMP: Пример сообщений 8
  53. 53. Архитектура WAMP 9
  54. 54. Архитектура WAMP 10 Клиент. Может предоставлять или потреблять ресурсы, такие как подписки и RPC.
  55. 55. Архитектура WAMP 11 Роутер. Занимается авторизацией и маршрутизацией сообщений между клиентами.
  56. 56. Архитектура WAMP 12 Peer, узел. Может быть клиентом или роутером, должен обладать хотя бы одной ролью.
  57. 57. Архитектура WAMP 13 Роль. Определяет возможности узла. Есть 4 клиентских роли и 2 роли роутера.
  58. 58. Архитектура WAMP 14 Сессия. Необходима для идентификации и авторизации клиентов, анонса ролей узлов.
  59. 59. Архитектура WAMP 15 Realm. Домен, namespace, единое пространство в рамках которого определены ресурсы и происходит роутинг сообщений.
  60. 60. Архитектура WAMP 16 Транспорт. Можно использовать: WebSockets, Raw TCP, Unix sockets и даже HTTP Long poll.
  61. 61. Архитектура WAMP 17 Сериализатор. Все сообщения сериализуются с помощью JSON/MessagePack/ CBOR. message
  62. 62. Архитектура WAMP 18 Идентификаторы ресурсов, URI. Необходимы для топиков, процедур и ошибок. Например: Topic: «sensor.events» RPC: «discover.devices» message
  63. 63. Основные понятия WAMP 19
  64. 64. Основные понятия WAMP • Клиент. Может предоставлять или потреблять ресурсы, такие как подписки и RPC. • Роутер. Занимается авторизацией и маршрутизацией сообщений между клиентами. • Peer, узел. Может быть клиентом или роутером, должен обладать хотя бы одной ролью. • Роль. Определяет возможности узла. Есть 4 клиентских роли и 2 роли роутера. • Сессия. Необходима для идентификации и авторизации клиентов, анонса ролей узлов. • Realm. Домен, namespace, в рамках которого происходит роутинг сообщений. • Транспорт. Можно использовать: WebSockets, Raw TCP, Unix sockets и даже HTTP Long poll. • Сериализатор. Cообщения сериализуются с помощью JSON/MessagePack/CBOR • Идентификаторы ресурсов, URI. Необходимы для топиков, процедур и ошибок. 19
  65. 65. WAMP: Features 20
  66. 66. WAMP: Features • Basic profile: базовые возможности RPC и PubSub 20
  67. 67. WAMP: Features • Basic profile: базовые возможности RPC и PubSub • Advanced profile: 20
  68. 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. 69. WAMP: установка сессии 21 Клиент Роутер Realm
  70. 70. WAMP: установка сессии 21 HELLO Клиент Роутер Realm [1, "homeapp", { "roles": { "publisher": {}, "subscriber": {} } }]
  71. 71. WAMP: установка сессии 21 HELLO WELCOME Клиент Роутер Realm [2, 9129137332, { "roles": { "broker": {} } }]
  72. 72. WAMP: установка сессии 21 HELLO WELCOME ABORT Клиент Роутер Realm [3, {"message": "The realm does not exist."}, "wamp.error.no_such_realm"]
  73. 73. WAMP: установка сессии 21 HELLO WELCOME GOODBYE (init by client) ABORT Клиент Роутер Realm [6, {"message": "The host is shutting down now."}, "wamp.error.system_shutdown"]
  74. 74. WAMP: установка сессии 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE Клиент Роутер Realm [6, {}, "wamp.error.goodbye_and_out"]
  75. 75. WAMP: установка сессии 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE GOODBYE (init by router) Клиент Роутер Realm [6, {}, "wamp.error.close_realm"]
  76. 76. WAMP: установка сессии 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE GOODBYE GOODBYE (init by router) Клиент Роутер Realm [6, {}, "wamp.error.goodbye_and_out"]
  77. 77. WAMP: установка сессии 21 HELLO WELCOME GOODBYE (init by client) ABORT GOODBYE GOODBYE GOODBYE (init by 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 как основа SOA-решений 24
  105. 105. WAMP как основа SOA-решений Распределённая архитектура 24
  106. 106. WAMP как основа SOA-решений Распределённая архитектура Слабая связанность компонентов 24
  107. 107. WAMP как основа SOA-решений Распределённая архитектура Слабая связанность компонентов Простой и понятный интерфейс взаимодействия 24
  108. 108. WAMP как основа SOA-решений Распределённая архитектура Слабая связанность компонентов Простой и понятный интерфейс взаимодействия Унифицированная маршрутизация 24
  109. 109. WAMP как основа SOA-решений Распределённая архитектура Слабая связанность компонентов Простой и понятный интерфейс взаимодействия Унифицированная маршрутизация Независимость от языка программирования 24
  110. 110. WAMP как основа SOA-решений Распределённая архитектура Слабая связанность компонентов Простой и понятный интерфейс взаимодействия Унифицированная маршрутизация Независимость от языка программирования Переиспользуемость компонентов 24
  111. 111. WAMP как основа SOA-решений Распределённая архитектура Слабая связанность компонентов Простой и понятный интерфейс взаимодействия Унифицированная маршрутизация Независимость от языка программирования Переиспользуемость компонентов WAMP удовлетворяет требованиям SOA 24
  112. 112. WAMP в качестве ESB 25 WAMP Router Service Providers Service Providers Service Providers Service Providers Service Providers Consumers Consumers Consumers Consumers Consumers Вызывают RPC Подписываются на топики Регистрируют RPC Публикуют события Подписываются на топики Публикуют события Сервер Сервер Сервер
  113. 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. 114. Сферы применения WAMP 27
  115. 115. Сферы применения WAMP 27 Распределённые приложения с большим количеством сервисов
  116. 116. Сферы применения WAMP 27 Распределённые приложения с большим количеством сервисов Smart homes, Smart cities, Интернет вещей в целом
  117. 117. Сферы применения WAMP 27 Распределённые приложения с большим количеством сервисов Smart homes, Smart cities, Интернет вещей в целом Системы с долго выполняющимися процессами
  118. 118. Сферы применения WAMP 27 Распределённые приложения с большим количеством сервисов Smart homes, Smart cities, Интернет вещей в целом Системы с долго выполняющимися процессами Лёгкая современная альтернатива XMPP, XMLRPC
  119. 119. Сферы применения WAMP 27 Распределённые приложения с большим количеством сервисов Smart homes, Smart cities, Интернет вещей в целом Системы с долго выполняющимися процессами Лёгкая современная альтернатива XMPP, XMLRPC Сетевые игры
  120. 120. Применение WAMP: реальные проекты 28
  121. 121. Применение WAMP: реальные проекты • Kadecot API Server. Sony Computer Science Laboratories 28
  122. 122. Применение WAMP: реальные проекты • Kadecot API Server. Sony Computer Science Laboratories • ParaView. Parallel Data Analysis and Visualization Application, Kitware 28
  123. 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. 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. 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. 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. 127. Loowy: WAMP-клиент на Lua 30
  128. 128. Loowy: WAMP-клиент на Lua 30 • Работает в Lua/Luajit на базе lua-ev
  129. 129. Loowy: WAMP-клиент на Lua 30 • Работает в Lua/Luajit на базе lua-ev • Поддерживает JSON- и Msgpack-сериализаторы
  130. 130. Loowy: WAMP-клиент на Lua 30 • Работает в Lua/Luajit на базе lua-ev • Поддерживает JSON- и Msgpack-сериализаторы • Поддерживает ряд фич из Advanced Profile
  131. 131. Loowy: WAMP-клиент на Lua 30 • Работает в Lua/Luajit на базе lua-ev • Поддерживает JSON- и Msgpack-сериализаторы • Поддерживает ряд фич из Advanced Profile • Автоматическое переподключение и переподписка
  132. 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. 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. 134. Loowy: Стек технологий 32
  135. 135. Loowy: Стек технологий 32 • Lua 5.1+, Luajit 2.0 • lua-websockets (который работает через luasocket) • lua-ev • lua-rapidjson • lua-MessagePack (опционально)
  136. 136. Wiola: WAMP роутер на Lua 33
  137. 137. Wiola: WAMP роутер на Lua • Работает на базе Nginx/Lua module 33
  138. 138. Wiola: WAMP роутер на Lua • Работает на базе Nginx/Lua module • Использует Redis для runtime storage 33
  139. 139. Wiola: WAMP роутер на Lua • Работает на базе Nginx/Lua module • Использует Redis для runtime storage • Поддерживает JSON- и MessagePack-сериализаторы 33
  140. 140. Wiola: WAMP роутер на Lua • Работает на базе Nginx/Lua module • Использует Redis для runtime storage • Поддерживает JSON- и MessagePack-сериализаторы • Поддерживает ряд фич из Advanced Profile 33
  141. 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. 142. Wiola: стек технологий 34
  143. 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. 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. 145. Nginx Wiola: Общая схема 36 Web Client init_by_lua headers_filter_by_lua content_by_lua Redis Server
  146. 146. Wiola: Особенности. JSON 37
  147. 147. Wiola: Особенности. JSON • cJSON 37
  148. 148. Wiola: Особенности. JSON • cJSON • нельзя указать способ сериализации пустых таблиц 37
  149. 149. Wiola: Особенности. JSON • cJSON • нельзя указать способ сериализации пустых таблиц • lua-resty-libcjson 37
  150. 150. Wiola: Особенности. JSON • cJSON • нельзя указать способ сериализации пустых таблиц • lua-resty-libcjson • не умеет работать с большими числами (int > 32bit) 37
  151. 151. Wiola: Особенности. JSON • cJSON • нельзя указать способ сериализации пустых таблиц • lua-resty-libcjson • не умеет работать с большими числами (int > 32bit) lua-rapidjson 37
  152. 152. Wiola: Особенности. JSON • cJSON • нельзя указать способ сериализации пустых таблиц • lua-resty-libcjson • не умеет работать с большими числами (int > 32bit) lua-rapidjson • пока новых проблем не нашлось :) 37
  153. 153. Wiola: Особенности. Runtime-хранилище 38
  154. 154. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти
  155. 155. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler
  156. 156. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests
  157. 157. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests • Переменные модуля, загружаемого в init_by_lua
  158. 158. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests • Переменные модуля, загружаемого в init_by_lua • Читать можно во всех воркерах
  159. 159. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests • Переменные модуля, загружаемого в init_by_lua • Читать можно во всех воркерах • Но запись, спасибо CoW, создаст свою копию модуля для VM
  160. 160. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests • Переменные модуля, загружаемого в init_by_lua • Читать можно во всех воркерах • Но запись, спасибо CoW, создаст свою копию модуля для VM • ngx.shared.DICT
  161. 161. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests • Переменные модуля, загружаемого в init_by_lua • Читать можно во всех воркерах • Но запись, спасибо CoW, создаст свою копию модуля для VM • ngx.shared.DICT • Размер каждого словаря задаётся в конфиге и не может изменяться
  162. 162. Wiola: Особенности. Runtime-хранилище 38 • Глобальные переменные в памяти • Создаются каждый раз на request handler • проблемы с concurrent requests • Переменные модуля, загружаемого в init_by_lua • Читать можно во всех воркерах • Но запись, спасибо CoW, создаст свою копию модуля для VM • ngx.shared.DICT • Размер каждого словаря задаётся в конфиге и не может изменяться Внешнее хранилище: Redis, Memcache, PostgreSQL, MySQL и прочие
  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; • удобно отлаживать код
  166. 166. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • удобно отлаживать код • каждый require() выполняется заново в каждом запросе
  167. 167. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • удобно отлаживать код • каждый require() выполняется заново в каждом запросе • даже модули, загруженные в init_by_lua, выполняются заново
  168. 168. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • удобно отлаживать код • каждый require() выполняется заново в каждом запросе • даже модули, загруженные в init_by_lua, выполняются заново • lua_code_cache on;
  169. 169. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • удобно отлаживать код • каждый require() выполняется заново в каждом запросе • даже модули, загруженные в init_by_lua, выполняются заново • lua_code_cache on; • для production-окружения
  170. 170. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • удобно отлаживать код • каждый require() выполняется заново в каждом запросе • даже модули, загруженные в init_by_lua, выполняются заново • lua_code_cache on; • для production-окружения • каждый require() выполняется один раз и кэшируется
  171. 171. Wiola: Особенности. lua_code_cache 39 • lua_code_cache off; • удобно отлаживать код • каждый require() выполняется заново в каждом запросе • даже модули, загруженные в init_by_lua, выполняются заново • lua_code_cache on; • для production-окружения • каждый require() выполняется один раз и кэшируется • при любом изменении кода необходимо перегружать nginx
  172. 172. Wiola: Публикация в luarocks, opm 40
  173. 173. Wiola: Публикация в luarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой:
  174. 174. Wiola: Публикация в luarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой: - lua-resty-websocket
  175. 175. Wiola: Публикация в luarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой: - lua-resty-websocket - lua-resty-redis
  176. 176. Wiola: Публикация в luarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой: - lua-resty-websocket - lua-resty-redis ✓ rapidjson
  177. 177. Wiola: Публикация в luarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac
  178. 178. Wiola: Публикация в luarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack
  179. 179. Wiola: Публикация в luarocks, opm 40 • luarocks: есть одна часть зависимостей, нет другой: - lua-resty-websocket - lua-resty-redis ✓ rapidjson ✓ lua-resty-hmac ✓ lua-messagepack • opm (OpenResty Package Manager): с точностью до «наоборот»:
  180. 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. 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. 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. 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. 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. 185. Полезные ссылки про WAMP 41
  186. 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. 187. WAMP: Заключение 42
  188. 188. WAMP: Заключение • Простой и открытый протокол 42
  189. 189. WAMP: Заключение • Простой и открытый протокол • RPC и PubSub в одном транспорте/протоколе 42
  190. 190. WAMP: Заключение • Простой и открытый протокол • RPC и PubSub в одном транспорте/протоколе • Любой транспорт и сериализация 42
  191. 191. WAMP: Заключение • Простой и открытый протокол • RPC и PubSub в одном транспорте/протоколе • Любой транспорт и сериализация • Позволяет строить распределённые приложения со слабосвязанными компонентами 42
  192. 192. WAMP: Заключение • Простой и открытый протокол • RPC и PubSub в одном транспорте/протоколе • Любой транспорт и сериализация • Позволяет строить распределённые приложения со слабосвязанными компонентами • Есть реализации во многих языках 42
  193. 193. WAMP: Заключение • Простой и открытый протокол • RPC и PubSub в одном транспорте/протоколе • Любой транспорт и сериализация • Позволяет строить распределённые приложения со слабосвязанными компонентами • Есть реализации во многих языках • Open source 42
  194. 194. WAMP: Заключение • Простой и открытый протокол • RPC и PubSub в одном транспорте/протоколе • Любой транспорт и сериализация • Позволяет строить распределённые приложения со слабосвязанными компонентами • Есть реализации во многих языках • Open source • Небольшое, но дружелюбное сообщество 42
  195. 195. WAMP: Заключение 43
  196. 196. WAMP: Заключение • Полезное архитектурное решение 43
  197. 197. WAMP: Заключение • Полезное архитектурное решение • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT) 43
  198. 198. WAMP: Заключение • Полезное архитектурное решение • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT) • Попробуйте WAMP: 43
  199. 199. WAMP: Заключение • Полезное архитектурное решение • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT) • Попробуйте WAMP: • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router) 43
  200. 200. WAMP: Заключение • Полезное архитектурное решение • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT) • Попробуйте WAMP: • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router) • Используете docker? 43
  201. 201. WAMP: Заключение • Полезное архитектурное решение • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT) • Попробуйте WAMP: • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router) • Используете docker? • docker pull 421p/wiola 43
  202. 202. WAMP: Заключение • Полезное архитектурное решение • Отличный вариант для IoT-проекта! (имхо: лучше чем MQTT) • Попробуйте WAMP: • Есть nginx/openresty? — попробуйте Wiola (bit.ly/wiola-router) • Используете docker? • docker pull 421p/wiola • docker pull crossbario/crossbar 43
  203. 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. 204. Спасибо за внимание! И ваши вопросы :) 44 Константин Буркалёв • Mail: kostik@ksdaemon.ru • Twitter: @KSDaemon • GitHub: KSDaemon • Blog: blog.ksdaemon.ru • SDCast: sdcast.ksdaemon.ru

×