Visual Dataflow Coordination2010

61
A Hybrid Visual Dataflow Language For Coordination in Mobile Ad Hoc Networks Andoni Lombide Carreton and Theo D’Hondt Department of Computer Science Vrije Universiteit Brussel 12th International Conference on Coordination Models and Languages June 7-10 2010 Amsterdam, the Netherlands 1 Wednesday 9 June 2010

Transcript of Visual Dataflow Coordination2010

Page 1: Visual Dataflow Coordination2010

A Hybrid Visual Dataflow Language For Coordination in Mobile Ad Hoc Networks

Andoni Lombide Carreton and Theo D’Hondt

Department of Computer ScienceVrije Universiteit Brussel

12th International Conference on Coordination Models and LanguagesJune 7-10 2010Amsterdam, the Netherlands 1

Wednesday 9 June 2010

Page 2: Visual Dataflow Coordination2010

Mobile Reactive Applications

2

Wednesday 9 June 2010

Page 3: Visual Dataflow Coordination2010

Mobile Reactive Applications

Mobile devices

2

Wednesday 9 June 2010

Page 4: Visual Dataflow Coordination2010

Mobile Reactive Applications

Mobile devices

2

Wednesday 9 June 2010

Page 5: Visual Dataflow Coordination2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Wednesday 9 June 2010

Page 6: Visual Dataflow Coordination2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Spontaneous interactions

Wednesday 9 June 2010

Page 7: Visual Dataflow Coordination2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Scarce infrastructure

Spontaneous interactions

Wednesday 9 June 2010

Page 8: Visual Dataflow Coordination2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Wednesday 9 June 2010

Page 9: Visual Dataflow Coordination2010

Distributed Event-driven Architecture

Mobile Reactive Applications

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

3

Wednesday 9 June 2010

Page 10: Visual Dataflow Coordination2010

Distributed Event-driven Architecture

Mobile Reactive Applications

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Ad Hoc Discovery

3

Wednesday 9 June 2010

Page 11: Visual Dataflow Coordination2010

Distributed Event-driven Architecture

Mobile Reactive Applications

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Decentralized

Ad Hoc Discovery

3

Wednesday 9 June 2010

Page 12: Visual Dataflow Coordination2010

Distributed Event-driven Architecture

Mobile Reactive Applications

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Decentralized

Resilient

Ad Hoc Discovery

3

Wednesday 9 June 2010

Page 13: Visual Dataflow Coordination2010

Distributed Event-driven Architecture

Mobile Reactive Applications

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Event streams

Decentralized

Resilient

Ad Hoc Discovery

3

Wednesday 9 June 2010

Page 14: Visual Dataflow Coordination2010

Distributed Event-driven Architecture

Mobile Reactive Applications

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

Event streams

Decentralized

Resilient

Ad Hoc Discovery Broadcasting

3

Wednesday 9 June 2010

Page 15: Visual Dataflow Coordination2010

AmbientTalk

whenever: Product discovered: { |product|

}

4

Distributed Event-driven Architecture

Wednesday 9 June 2010

Page 16: Visual Dataflow Coordination2010

AmbientTalk

def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);

}

whenever: Product discovered: { |product|

}

4

Distributed Event-driven Architecture

Wednesday 9 June 2010

Page 17: Visual Dataflow Coordination2010

AmbientTalk

def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);

}

whenever: Product discovered: { |product|

}

whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };

4

Distributed Event-driven Architecture

Wednesday 9 June 2010

Page 18: Visual Dataflow Coordination2010

AmbientTalk

def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);

}

whenever: Product discovered: { |product|

}

whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };

Decentralized discovery based on UDP broadcasting

4

Distributed Event-driven Architecture

Wednesday 9 June 2010

Page 19: Visual Dataflow Coordination2010

AmbientTalk

def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);

}

whenever: Product discovered: { |product|

}

whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };

Decentralized discovery based on UDP broadcasting

Resilient asynchronous

messages

4

Distributed Event-driven Architecture

Wednesday 9 June 2010

Page 20: Visual Dataflow Coordination2010

AmbientTalk

def future := product<-getSerial(); when: future becomes: { |serial| println(“Product discovered: ” + serial);

}

whenever: Product discovered: { |product|

}

whenever: product disconnected: { println("Product disconnected: " + serial); }; whenever: product reconnected: { println("Product reconnected: " + serial); };

Decentralized discovery based on UDP broadcasting

Resilient asynchronous

messages

Control flow driven by events, but specified by textual, sequential blocks

4

Distributed Event-driven Architecture

Wednesday 9 June 2010

Page 21: Visual Dataflow Coordination2010

Dataflow Programming

f(x,y,z)

x y z

5

Wednesday 9 June 2010

Page 22: Visual Dataflow Coordination2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

Page 23: Visual Dataflow Coordination2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

Page 24: Visual Dataflow Coordination2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

Page 25: Visual Dataflow Coordination2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

Page 26: Visual Dataflow Coordination2010

7

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Wednesday 9 June 2010

Page 27: Visual Dataflow Coordination2010

UserDatabase -> DB.getRecommendationsWithProducts(products);

7

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Wednesday 9 June 2010

Page 28: Visual Dataflow Coordination2010

UserDatabase -> DB.getRecommendationsWithProducts(products);

Shelf -> filterOutPresentProducts(recommendToUser);

7

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products recommendToUser

1

1

1

1 1

*

Wednesday 9 June 2010

Page 29: Visual Dataflow Coordination2010

UserDatabase -> DB.getRecommendationsWithProducts(products);

Shelf -> filterOutPresentProducts(recommendToUser);

7

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

recommendations

recommendToUser

1

1

1

1 1

1

1

*

Wednesday 9 June 2010

Page 30: Visual Dataflow Coordination2010

UserDatabase -> DB.getRecommendationsWithProducts(products);

Shelf -> filterOutPresentProducts(recommendToUser);

7

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

recommendations

nearbyRecommendations

recommendToUser

1

1

1

1 1

1 1

1

1

*

Wednesday 9 June 2010

Page 31: Visual Dataflow Coordination2010

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

Shelf -> filterOutPresentProducts(recommendToUser);

7

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

recommendations

nearbyRecommendations

recommendToUser

1

1

1

1 1

1 1

1

1

*

Wednesday 9 June 2010

Page 32: Visual Dataflow Coordination2010

A Visual Dataflow Language For Coordination in Mobile Ad Hoc Networks

Role -> << par1, par2, par3 << code

dependency1

dependency4dependen

cy2

dependen

cy31

1

*

1

1

1

1

*

JVM

AmbientTalk VMJVM

AmbientTalk VM

8

Role- method1- method2- method3

Role- method1- method2- method3

Wednesday 9 June 2010

Page 33: Visual Dataflow Coordination2010

Executing Mobile AmbientTalk Code Resilient

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

productsInBag recommendations nearbyRecommendations

1 1 1

[ record1, record2, record3, record4 ]

[ record1, record2, record4 ]

[ record2, record4 ]

def customer := extend: OperatorHostInterface with: { // ... Private fields ... def GUI := extend: JFrame with: { def showProductsInBag(products) { ... }; def showRecommendations(products) { ... }; def showRecommendationsInShop(products) { ... }; } }

JVM

AmbientTalk VM9

Wednesday 9 June 2010

Page 34: Visual Dataflow Coordination2010

Propagating and Reacting to EventsEvent streams

Resilient

Shelf -> filterOutPresentProducts(recommendToUser);

nearbyRecommendations

recommendToUser

1

*

[ record1, record2, record3, record4 ]

[ record2, record4 ]

filterOutPresentProducts( )

>> system.println(recommendToUser) [ record1, record2 ]

10

Wednesday 9 June 2010

Page 35: Visual Dataflow Coordination2010

Propagating and Reacting to EventsEvent streams

Resilient

Shelf -> filterOutPresentProducts(recommendToUser);

nearbyRecommendations

recommendToUser

1

*

[ record1, record2, record3, record4 ]

[ record2, record4 ]

filterOutPresentProducts( )

>> system.println(recommendToUser) [ record1, record2 ]

10

[ record1, record2, record3 ]

Wednesday 9 June 2010

Page 36: Visual Dataflow Coordination2010

Propagating and Reacting to EventsEvent streams

Resilient

Shelf -> filterOutPresentProducts(recommendToUser);

nearbyRecommendations

recommendToUser

1

*

[ record1, record2, record3, record4 ]

[ record2, record4 ]

filterOutPresentProducts( )

>> system.println(recommendToUser) [ record1, record2 ]

10

[ record1, record2, record3 ][ ]

Wednesday 9 June 2010

Page 37: Visual Dataflow Coordination2010

Propagating and Reacting to EventsEvent streams

Resilient

Shelf -> filterOutPresentProducts(recommendToUser);

nearbyRecommendations

recommendToUser

1

*

[ record1, record2, record3, record4 ]

[ record2, record4 ]

filterOutPresentProducts( )

>> system.println(recommendToUser) [ record1, record2 ]

10

[ record1, record2, record3 ][ ][ record4 ]

Wednesday 9 June 2010

Page 38: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 39: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 40: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 41: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

[ record1, record2, ... recordN ]

Resilient

11

Wednesday 9 June 2010

Page 42: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 43: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 44: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 45: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 46: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 47: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 48: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 49: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

[ record1, record2, ... recordN ]

Resilient

11

Wednesday 9 June 2010

Page 50: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 51: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 52: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 53: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 54: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

products

1

1

1

1

Resilient

11

Wednesday 9 June 2010

Page 55: Visual Dataflow Coordination2010

Discovering NodesAd Hoc Discovery

Decentralized

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

ListeningStation -> rfidTags.map: { |t| t.getProduct() };

productsInBag

1

1

UserDatabase -> DB.getRecommendationsWithProducts(products);

products

1

1

Resilient

11

Wednesday 9 June 2010

Page 56: Visual Dataflow Coordination2010

Dependency Arities

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

Shelf -> filterOutPresentProducts(recommendToUser);

nearbyRecommendations

recommendToUser

1

1

1

*

incoming 1 incoming *

outgoing 1send one

recommendationbroadcast one

recommendation

outgoing * send list of recommendations

broadcast list of recommendations

12

Broadcasting

Wednesday 9 June 2010

Page 57: Visual Dataflow Coordination2010

Dependency Arities

Customer -> GUI.showProductsInBag(productsInBag); GUI.showRecommendations(recommendations); GUI.showRecommendationsInShop(nearbyRecommendations);

UserDatabase -> DB.getRecommendationsWithProducts(products);

Shelf -> filterOutPresentProducts(recommendToUser);

nearbyRecommendations

recommendToUser

1

*

incoming 1 incoming *

outgoing 1send one

recommendationbroadcast one

recommendation

outgoing * send list of recommendations

broadcast list of recommendations

1

*

send list of recommendations

12

Broadcasting

Wednesday 9 June 2010

Page 58: Visual Dataflow Coordination2010

Remembering State

Averager -> << buffer << if: (buffer == nil) then: { buffer := Buffer.new(5); }; buffer.put(value); def accumulated := 0; buffer.each: { |val| accumulated := accumulated + val }; accumulated / 5;

value

1

1

average

1

1

Event streams

13

Wednesday 9 June 2010

Page 59: Visual Dataflow Coordination2010

Editing Dataflow Graphs

14

Wednesday 9 June 2010

Page 60: Visual Dataflow Coordination2010

Limitations and Future Work

• Node discovery based on role names may cause name clashes: look into more advanced publish/subscribe mechanisms?

• Security: build a secure environment to execute mobile AmbientTalk code.

• Current editor prototype is still very rudimentary.

• Dataflow debugging support.

15

Wednesday 9 June 2010

Page 61: Visual Dataflow Coordination2010

Conclusion

• Hybrid visual dataflow language to coordinate distributed AmbientTalk components.

• Coarse grained control flow encoded in dataflow graph and separated from fine grained control flow (AmbientTalk statement level).

• Dynamically reconfiguring dataflow graph when mobile network topology changes.

• Based on reactive programming.

• Extends basic dataflow coordination model with broadcasting primitives by means of dependency arities.

16

Ad Hoc Discovery

Decentralized

Resilient

Event streams

http://soft.vub.ac.be/soft/research/amopcop

Broadcasting

Wednesday 9 June 2010