Distributed Reactive Programming Tools2010

59
Loosely-coupled Distributed Reactive Programming in Mobile Ad Hoc Networks Andoni Lombide Carreton, Stijn Mostinckx, Tom Van Cutsem and Wolfgang De Meuter Department of Computer Science Vrije Universiteit Brussel 48th International Conference on Objects, Models, Components, Patterns -- TOOLS 2010 June 28 - July 2 2010 Malàga, Spain Tuesday 29 June 2010

description

 

Transcript of Distributed Reactive Programming Tools2010

Page 1: Distributed Reactive Programming Tools2010

Loosely-coupled Distributed Reactive Programming in Mobile Ad Hoc Networks

Andoni Lombide Carreton, Stijn Mostinckx, Tom Van Cutsem and Wolfgang De Meuter

Department of Computer ScienceVrije Universiteit Brussel

48th International Conference on Objects, Models, Components, Patterns -- TOOLS 2010June 28 - July 2 2010Malàga, Spain

Tuesday 29 June 2010

Page 2: Distributed Reactive Programming Tools2010

The mobile ticket trader application

Tuesday 29 June 2010

Page 3: Distributed Reactive Programming Tools2010

Pervasive Computing and Mobile Ad Hoc Networks

Tuesday 29 June 2010

Page 4: Distributed Reactive Programming Tools2010

Pervasive Computing and Mobile Ad Hoc Networks

Mobile devices

Tuesday 29 June 2010

Page 5: Distributed Reactive Programming Tools2010

Pervasive Computing and Mobile Ad Hoc Networks

Mobile devices

Tuesday 29 June 2010

Page 6: Distributed Reactive Programming Tools2010

Pervasive Computing and Mobile Ad Hoc Networks

Mobile devices

Intermittent connectivity

Tuesday 29 June 2010

Page 7: Distributed Reactive Programming Tools2010

Pervasive Computing and Mobile Ad Hoc Networks

Mobile devices

Intermittent connectivity

Spontaneous interactions

Tuesday 29 June 2010

Page 8: Distributed Reactive Programming Tools2010

Pervasive Computing and Mobile Ad Hoc Networks

Mobile devices

Intermittent connectivity

Scarce infrastructure

Spontaneous interactions

Tuesday 29 June 2010

Page 9: Distributed Reactive Programming Tools2010

Pervasive Computing and Mobile Ad Hoc Networks

Mobile devices

Intermittent connectivity

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Tuesday 29 June 2010

Page 10: Distributed Reactive Programming Tools2010

Distributed Event-driven Architecture

Pervasive Computing and Mobile Ad Hoc Networks

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Tuesday 29 June 2010

Page 11: Distributed Reactive Programming Tools2010

Distributed Event-driven Architecture

Pervasive Computing and Mobile Ad Hoc Networks

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Ad Hoc Discovery

Tuesday 29 June 2010

Page 12: Distributed Reactive Programming Tools2010

Distributed Event-driven Architecture

Pervasive Computing and Mobile Ad Hoc Networks

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Decentralized

Ad Hoc Discovery

Tuesday 29 June 2010

Page 13: Distributed Reactive Programming Tools2010

Distributed Event-driven Architecture

Pervasive Computing and Mobile Ad Hoc Networks

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Decentralized

Resilient

Ad Hoc Discovery

Tuesday 29 June 2010

Page 14: Distributed Reactive Programming Tools2010

Distributed Event-driven Architecture

Pervasive Computing and Mobile Ad Hoc Networks

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Event streams

Decentralized

Resilient

Ad Hoc Discovery

Tuesday 29 June 2010

Page 15: Distributed Reactive Programming Tools2010

Distributed Event-driven Architecture

Pervasive Computing and Mobile Ad Hoc Networks

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Event streams

Decentralized

Resilient

Ad Hoc Discovery Broadcasting

Tuesday 29 June 2010

Page 16: Distributed Reactive Programming Tools2010

Distributed Event-driven Architecture

• Spontaneous discovery of nearby peers and their ticket offers

• Disconnection/reconnection

• Location of interesting peers changed

• Own location changed

• Price of interesting ticket offers changed

Tuesday 29 June 2010

Page 17: Distributed Reactive Programming Tools2010

Event Loop Concurrency in AmbientTalk

Tuesday 29 June 2010

Page 18: Distributed Reactive Programming Tools2010

Event Loop Concurrency in AmbientTalk

“do m immediately”

obj

obj.m()

Tuesday 29 June 2010

Page 19: Distributed Reactive Programming Tools2010

Event Loop Concurrency in AmbientTalk

“do m eventually”

obj<-m()

Tuesday 29 June 2010

Page 20: Distributed Reactive Programming Tools2010

Event Loop Concurrency in AmbientTalk

“do m eventually”

obj<-m()

Tuesday 29 June 2010

Page 21: Distributed Reactive Programming Tools2010

Event Loop Concurrency in AmbientTalk

?

future

Tuesday 29 June 2010

Page 22: Distributed Reactive Programming Tools2010

Event Loop Concurrency in AmbientTalk

?

future

when: future becomes: { |value| // process reply}

Tuesday 29 June 2010

Page 23: Distributed Reactive Programming Tools2010

Event Loop Concurrency in AmbientTalk

?

future

when: future becomes: { |value| // process reply}

Tuesday 29 June 2010

Page 24: Distributed Reactive Programming Tools2010

Publishing & discovering objects by topic

ticketVendor

Tuesday 29 June 2010

Page 25: Distributed Reactive Programming Tools2010

Publishing & discovering objects by topic

ticketVendor

deftype TicketVendor deftype TicketVendor

Tuesday 29 June 2010

Page 26: Distributed Reactive Programming Tools2010

Publishing & discovering objects by topic

ticketVendor

export: ticketVendor as: TicketVendordeftype TicketVendor deftype TicketVendor

Tuesday 29 June 2010

Page 27: Distributed Reactive Programming Tools2010

Publishing & discovering objects by topic

ticketVendor

export: ticketVendor as: TicketVendorwhenever: TicketVendor discovered: { |ticketVendor| // React on ticketVendor appearance when: ticketVendor disconnected: { // React on disappearance } when: ticketVendor reconnected: { // React on reappearance }}

deftype TicketVendor deftype TicketVendor

Tuesday 29 June 2010

Page 28: Distributed Reactive Programming Tools2010

Publishing & discovering objects by topic

ticketVendor

export: ticketVendor as: TicketVendorwhenever: TicketVendor discovered: { |ticketVendor| // React on ticketVendor appearance when: ticketVendor disconnected: { // React on disappearance } when: ticketVendor reconnected: { // React on reappearance }}

deftype TicketVendor deftype TicketVendor

Tuesday 29 June 2010

Page 29: Distributed Reactive Programming Tools2010

Publishing & discovering objects by topic

ticketVendor

export: ticketVendor as: TicketVendorwhenever: TicketVendor discovered: { |ticketVendor| // React on ticketVendor appearance when: ticketVendor disconnected: { // React on disappearance } when: ticketVendor reconnected: { // React on reappearance }}

deftype TicketVendor deftype TicketVendor

Ad Hoc Discovery

Tuesday 29 June 2010

Page 30: Distributed Reactive Programming Tools2010

Publishing & discovering objects by topic

ticketVendor

export: ticketVendor as: TicketVendorwhenever: TicketVendor discovered: { |ticketVendor| // React on ticketVendor appearance when: ticketVendor disconnected: { // React on disappearance } when: ticketVendor reconnected: { // React on reappearance }}

deftype TicketVendor deftype TicketVendor

Ad Hoc Discovery

Decentralized

Tuesday 29 June 2010

Page 31: Distributed Reactive Programming Tools2010

Asynchronous communication

ticketVendor

getLocation

when: TicketVendor discovered: { |ticketVendor| when: ticketVendor<-getLocation()@Due(timeout) becomes: { |loc| // Update user interface with the location } catch: TimeoutException using: { |e| // Remove ticket offer from user interface }}

Tuesday 29 June 2010

Page 32: Distributed Reactive Programming Tools2010

Asynchronous communication

ticketVendor

getLocation

when: TicketVendor discovered: { |ticketVendor| when: ticketVendor<-getLocation()@Due(timeout) becomes: { |loc| // Update user interface with the location } catch: TimeoutException using: { |e| // Remove ticket offer from user interface }}

Tuesday 29 June 2010

Page 33: Distributed Reactive Programming Tools2010

Asynchronous communication

ticketVendor

getLocation

when: TicketVendor discovered: { |ticketVendor| when: ticketVendor<-getLocation()@Due(timeout) becomes: { |loc| // Update user interface with the location } catch: TimeoutException using: { |e| // Remove ticket offer from user interface }}

Tuesday 29 June 2010

Page 34: Distributed Reactive Programming Tools2010

Asynchronous communication

ticketVendor

when: TicketVendor discovered: { |ticketVendor| when: ticketVendor<-getLocation()@Due(timeout) becomes: { |loc| // Update user interface with the location } catch: TimeoutException using: { |e| // Remove ticket offer from user interface }}

Tuesday 29 June 2010

Page 35: Distributed Reactive Programming Tools2010

Asynchronous communication

ticketVendor

when: TicketVendor discovered: { |ticketVendor| when: ticketVendor<-getLocation()@Due(timeout) becomes: { |loc| // Update user interface with the location } catch: TimeoutException using: { |e| // Remove ticket offer from user interface }}

Tuesday 29 June 2010

Page 36: Distributed Reactive Programming Tools2010

Asynchronous communication

ticketVendor

when: TicketVendor discovered: { |ticketVendor| when: ticketVendor<-getLocation()@Due(timeout) becomes: { |loc| // Update user interface with the location } catch: TimeoutException using: { |e| // Remove ticket offer from user interface }}

Tuesday 29 June 2010

Page 37: Distributed Reactive Programming Tools2010

Asynchronous communication

ticketVendor

when: TicketVendor discovered: { |ticketVendor| when: ticketVendor<-getLocation()@Due(timeout) becomes: { |loc| // Update user interface with the location } catch: TimeoutException using: { |e| // Remove ticket offer from user interface }}

Resilient

Tuesday 29 June 2010

Page 38: Distributed Reactive Programming Tools2010

Ambient References

def werchterVendors := ambient: TicketVendor where: { |tv| tv.event == “Rock Werchter”};

whenAll: werchterVendors<-getLocation()@Expires(5.seconds) becomes: { |locations| // Update the map GUI with the locations }

werchterVendors

Broadcasting

Tuesday 29 June 2010

Page 39: Distributed Reactive Programming Tools2010

Ambient References

def werchterVendors := ambient: TicketVendor where: { |tv| tv.event == “Rock Werchter”};

whenAll: werchterVendors<-getLocation()@Expires(5.seconds) becomes: { |locations| // Update the map GUI with the locations }

werchterVendors

Broadcasting

Tuesday 29 June 2010

Page 40: Distributed Reactive Programming Tools2010

AmbientTalk/R

gui.centerOn(GPS_Location.latitude, GPS_Location.longitude);

GPS_Location

latitude longitude

_.latitude _.longitude

gui.centerOn(_, _)

GPS_Location

Tuesday 29 June 2010

Page 41: Distributed Reactive Programming Tools2010

AmbientTalk/R

gui.centerOn(GPS_Location.latitude, GPS_Location.longitude);

GPS_Location

latitude longitude

_.latitude _.longitude

gui.centerOn(_, _)

_.latitude _.longitude

latitude longitude

Tuesday 29 June 2010

Page 42: Distributed Reactive Programming Tools2010

AmbientTalk/R

gui.centerOn(GPS_Location.latitude, GPS_Location.longitude);

GPS_Location

latitude longitude

_.latitude _.longitude

gui.centerOn(_, _)gui.centerOn(_, _)

Tuesday 29 June 2010

Page 43: Distributed Reactive Programming Tools2010

AmbientTalk/R

def Coordinate := isolate: { def latitude := 0; def longitude := 0;

def distanceTo(anotherCoordinate) { // Compute via Haversine formula };

def @Mutator update(newLatitude, newLongitude) { latitude := newLatitude; longitude := newLongitude; };};

def GPS_Location := makeReactive(Coordinate.new());

GPS.addLocationObserver: { |lat, lon| GPS_Location.update(lat, lon)};

GPS_Location

Tuesday 29 June 2010

Page 44: Distributed Reactive Programming Tools2010

AmbientTalk/R

def Coordinate := isolate: { def latitude := 0; def longitude := 0;

def distanceTo(anotherCoordinate) { // Compute via Haversine formula };

def @Mutator update(newLatitude, newLongitude) { latitude := newLatitude; longitude := newLongitude; };};

def GPS_Location := makeReactive(Coordinate.new());

GPS.addLocationObserver: { |lat, lon| GPS_Location.update(lat, lon)};

GPS_Location

Event streams

Tuesday 29 June 2010

Page 45: Distributed Reactive Programming Tools2010

vendorLocation

vendorLocation

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @Any vendorLocation := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” };

GUI.showLocationOnM

GPS_Location

_.latitude _.longitude

latitude longitude

gui.centerOn(_, _)

Tuesday 29 June 2010

Page 46: Distributed Reactive Programming Tools2010

vendorLocation

vendorLocation

TicketVendorLocation

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @Any vendorLocation := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” };

GUI.showLocationOnM

GPS_Location

_.latitude _.longitude

latitude longitude

gui.centerOn(_, _)

Tuesday 29 June 2010

Page 47: Distributed Reactive Programming Tools2010

vendorLocation

vendorLocation

TicketVendorLocation

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @Any vendorLocation := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” };

GUI.showLocationOnM

GPS_Location

_.latitude _.longitude

latitude longitude

gui.centerOn(_, _)

Tuesday 29 June 2010

Page 48: Distributed Reactive Programming Tools2010

vendorLocation

vendorLocation

TicketVendorLocation

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @Any vendorLocation := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” };

GUI.showLocationOnM

GPS_Location

_.latitude _.longitude

latitude longitude

gui.centerOn(_, _)

Tuesday 29 June 2010

Page 49: Distributed Reactive Programming Tools2010

vendorLocation

vendorLocation

vendorLocation

TicketVendorLocation

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @Any vendorLocation := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” };

GUI.showLocationOnM

GPS_Location

_.latitude _.longitude

latitude longitude

gui.centerOn(_, _)

Tuesday 29 June 2010

Page 50: Distributed Reactive Programming Tools2010

vendorLocation

vendorLocation

vendorLocation

TicketVendorLocation

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @Any vendorLocation := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” };

GUI.showLocationOnM

GPS_Location

_.latitude _.longitude

latitude longitude

gui.centerOn(_, _)

Tuesday 29 June 2010

Page 51: Distributed Reactive Programming Tools2010

vendorLocations

vendorLocations

vendorLocations

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @All vendorLocations := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” } timeout: 2000;

GPS_Location

GPS_Location

Tuesday 29 June 2010

Page 52: Distributed Reactive Programming Tools2010

vendorLocations

vendorLocations

vendorLocations

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @All vendorLocations := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” } timeout: 2000;

GPS_Location

GPS_Location

GPS_Location

Tuesday 29 June 2010

Page 53: Distributed Reactive Programming Tools2010

vendorLocations

vendorLocations

vendorLocations

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @All vendorLocations := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” } timeout: 2000;

GPS_Location

GPS_Location

GPS_Location

Tuesday 29 June 2010

Page 54: Distributed Reactive Programming Tools2010

vendorLocations

vendorLocations

vendorLocations

Ambient Behaviors

exportBehavior: GPS_Location as: TicketVendorLocation to: { |buyer| buyer.interestedIn == “Rock Werchter” };

def @All vendorLocations := ambientBehavior: TicketVendorLocation where: { def interestedIn := “Rock Werchter” } timeout: 2000;

GPS_Location

GPS_Location

Tuesday 29 June 2010

Page 55: Distributed Reactive Programming Tools2010

Ambient Behaviors

def findOffers(event, maxPrice, maxDistance) { // Subscribe to ticket offers def @All allNearbyOffers := ambientBehavior: TicketOfferT timeout: 2000;

// Filter out interesting ticket offers allNearbyOffers.filter: { |offer| (offer.eventName == event).and: { (offer.price <= maxPrice).and: { GPS_Location.distanceTo(offer.location) <= maxDistance }}};};

• Disconnection/reconnection

• Location of interesting peers changed

• Own location changed

• Price of interesting ticket offers changed

def werchterVendors := findOffers(“Rock Werchter”, 120, 500);

gui.updateWithOffers(werchterVendors);

Tuesday 29 June 2010

Page 56: Distributed Reactive Programming Tools2010

Reactive Queries

def werchterVendors := ambient: TicketVendor where: { |tv| tv.event == “Rock Werchter”};

def locations := werchterVendors<-getLocation()@Refresh(2.seconds);

locations.each: { |coordinates| GUI.showLocationOnMap(coordinates) };

werchterVendors

Tuesday 29 June 2010

Page 57: Distributed Reactive Programming Tools2010

Reactive Queries

def werchterVendors := ambient: TicketVendor where: { |tv| tv.event == “Rock Werchter”};

def locations := werchterVendors<-getLocation()@Refresh(2.seconds);

locations.each: { |coordinates| GUI.showLocationOnMap(coordinates) };

werchterVendors

Tuesday 29 June 2010

Page 58: Distributed Reactive Programming Tools2010

Limitations and Future Work

• AmbientTalk/R yields a higher computational overhead than plain AmbientTalk.

• Event message order preservation not guaranteed on very fine-grained levels over different communication partners.

• No real-time guarantees.

• Event consumers can only create and cancel their distributed dependencies: they cannot limit the number of propagated events.

Tuesday 29 June 2010

Page 59: Distributed Reactive Programming Tools2010

Conclusion

• Decentralized publish/subscribe architecture based on UDP broadcasting allows spontaneous and loosely-coupled group interactions.

• Reactive interpreter allows reacting to and processing of events without relying on “callback-spaghetti”.

• Ambient behaviors and reactive queries reconcile both programming styles.

• Event propagation happens with asynchronous messages among distributed event loops: no concurrency issues and resilient to intermittent network connectivity.

http://soft.vub.ac.be/soft/research/amopcopTuesday 29 June 2010