Visual Dataflow Coordination2010

Preview:

Citation preview

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

Mobile Reactive Applications

2

Wednesday 9 June 2010

Mobile Reactive Applications

Mobile devices

2

Wednesday 9 June 2010

Mobile Reactive Applications

Mobile devices

2

Wednesday 9 June 2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Wednesday 9 June 2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Spontaneous interactions

Wednesday 9 June 2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Scarce infrastructure

Spontaneous interactions

Wednesday 9 June 2010

Mobile Reactive Applications

Mobile devices

Intermittent connectivity

2

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Wednesday 9 June 2010

Distributed Event-driven Architecture

Mobile Reactive Applications

Scarce infrastructure

Representation of physical objects

Spontaneous interactions

Intermittent connectivity

Mobile devices

3

Wednesday 9 June 2010

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

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

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

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

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

AmbientTalk

whenever: Product discovered: { |product|

}

4

Distributed Event-driven Architecture

Wednesday 9 June 2010

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

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

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

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

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

Dataflow Programming

f(x,y,z)

x y z

5

Wednesday 9 June 2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

The Ambient Vinyl Store

6

Wednesday 9 June 2010

7

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

productsInBag

products

1

1

1

1

Wednesday 9 June 2010

UserDatabase -> DB.getRecommendationsWithProducts(products);

7

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

productsInBag

products

1

1

1

1

Wednesday 9 June 2010

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Editing Dataflow Graphs

14

Wednesday 9 June 2010

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

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