Interaction safety in Web service orchestrations
Jonathan Michaux 6/11/2012
Just sessionize it !
I am going to present to you:
• The meaning and purpose of Web service orchestrations
• Runtime errors that we would like to be able to avoid
• A simple orchestration language
• A new approach to behavioural typing: session-based programming
• How the approach helps us avoid the runtime errors
at compile-time
To do so, I am going to:
• Introduce Web services, orchestration, and interaction errors
• Present a simple orchestration language with a
promising new feature: typed sessions (a concurrent programming paradigm with lots of potential)
• Jump into an example of an orchestration
– Implement the orchestration
– Show that the implementation contains errors – Show how the errors are detected
– Correct the code
Service Oriented Architecture (SOA)
(w3c.org)
• Message-based communication
• Loosely coupled
services
Web service orchestration
Orchestrator
Web service Web service
Web service client
Web service
instance Web service
instance
Web service
instance
Interactions errors
or
A service client is awaiting message
… but the message queue contains
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e) s ? c(arg_c)
Traditional computation
tasks can be done externally.
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
•Session types: Behavioural types that specify allowed interactions.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e)
T_Service service type:
s ? c(arg_c)
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e)
T_Service service type:
s ? c(arg_c)
•Session types: Behavioural types that specify allowed interactions.
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e)
T_Service service type:
s ? c(arg_c)
•Session types: Behavioural types that specify allowed interactions.
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e)
T_Service service type:
s ? c(arg_c)
•Session types: Behavioural types that specify allowed interactions.
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e)
T_Service service type:
s ? c(arg_c)
•Session types: Behavioural types that specify allowed interactions.
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e)
T_Service service type:
s ? c(arg_c)
•Session types: Behavioural types that specify allowed interactions.
A simple orchestration language with typed sessions
•Atomic activities: Invocation, Reception, Session initiation
•Structured activities: Sequence, Parallel, Pick, Recursion…
•Control links: Synchronisation of parallel activities.
p = addr : T_Service s @ p
s ! a(arg_a) s ? b(arg_b)
s ! d(arg_d) s ! e(arg_e)
T_Service service type:
s ? c(arg_c)
•Session types: Behavioural types that specify allowed interactions.
Example service orchestration:
The Event Booking System
The Event Booking System chooses a date from a previously set up
Doodle page and books a room by using EOLE and some equipment
by using the DSI service.
Example service orchestration:
The Event Booking System
The Event Booking System chooses a date from a previously set up Doodle page and books a room by using EOLE and some equipment by using the DSI service.
Doodle Session
Type
EOLE Session
Type
DSI Session EBS
Session
Type
Required Session types
Provided Session type Required Session types
String date;
String room;
String event;
String equip;
s ? bookEvent(event,equip) Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi String date;
String room;
String event;
String equip;
PARALLEL
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
s ? bookEvent(event,equip)
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi String date;
String room;
String event;
String equip;
PARALLEL
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
s ? bookEvent(event,equip)
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
s ? bookEvent(event,equip) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
e ? noRoom()
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room) s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
e ? noRoom()
i ? refuse()
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
e ? noRoom()
i ? refuse()
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
What happens if we push the button ?
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
4 errors detected
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
3 variable errors
PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
1 error left
3 variable errors
= valid state
= error state Part of the Event
Booking System’s control graph.
s ? bookEvent(event,equip) d @ doodle
e @ eole i @ dsi
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
1 error left
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
1 type errors
Provided Session type Required Session types
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room) String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()
1 type errors
Provided Session type
s ! eventFailed() s ! eventBooked(date,room)
s ? bookEvent(event,equip)
or
Network Web service client
b @ EBS
b ! bookEvent(« dbweb seminar », « laptop ») b ? eventBooked(room,date)
s ! eventFailed() s ! eventBooked(date,room)
s ? bookEvent(event,equip)
or
Network Web service client
b @ EBS
b ! bookEvent(« dbweb seminar », « laptop ») b ? eventBooked(room,date)
b @ EBS
s ! eventFailed() s ! eventBooked(date,room)
s ? bookEvent(event,equip)
or
Network Web service client
b @ EBS
b ! bookEvent(« dbweb seminar », « laptop ») b ? eventBooked(room,date)
b @ EBS
b @ EBS
s ! eventFailed() s ! eventBooked(date,room)
s ? bookEvent(event,equip)
or
Network Web service client
b @ EBS
b ! bookEvent(« dbweb seminar », « laptop ») b ? eventBooked(room,date)
b @ EBS
b @ EBS
b ! bookEvent(…)
s ! eventFailed() s ! eventBooked(date,room)
s ? bookEvent(event,equip)
or
Network Web service client
b @ EBS
b ! bookEvent(« dbweb seminar », « laptop ») b ? eventBooked(room,date)
b @ EBS
b @ EBS
b ! bookEvent(…)
b ! bookEvent(…)
s ! eventFailed() s ! eventBooked(date,room)
s ? bookEvent(event,equip)
or
Network Web service client
b @ EBS
b ! bookEvent(« dbweb seminar », « laptop ») b ? eventBooked(room,date)
b @ EBS
b @ EBS
b ! bookEvent(…)
b ! bookEvent(…)
! eventFailed()
s ! eventFailed() s ! eventBooked(date,room)
s ? bookEvent(event,equip)
or
Network Web service client
b @ EBS
b ! bookEvent(« dbweb seminar », « laptop ») b ? eventBooked(room,date)
b @ EBS
b @ EBS
b ! bookEvent(…)
b ! bookEvent(…)
! eventFailed()
! eventFailed()
Solution:
d @ doodle e @ eole i @ dsi PARALLEL
d ! findDate(event) d ? date(date)
d ! validateAndNotify(date)
e ! setDate(date)
e ! setRoomType(« meeting ») e ? getRoom(room)
e ! bookRoom()
i ! setRequest(equip,date) i ! setRoom(room)
s ! eventBooked(date,room) s ! eventFailed()
s ? bookEvent(event,equip)
i ? accept(room)
Error free
String date;
String room;
String event;
String equip;
Doodle_t doodle = @1;
EOLE eole = @2;
DSI dsi = @3;
EBS_T s;
or e ? noRoom()
i ? refuse()