SlideShare a Scribd company logo
1 of 26
TPL DataFlow και Railway
oriented programming
Παναγιώτης Καναβός
Έτυχε ποτέ
• Να γράφουν πολλά threads σε ένα αρχείο?
• Να επεξεργαστείτε μεγάλα logs?
• Αρχεία τόσο μεγάλα που κρεμάει το μηχάνημα?
DataFlow
• Επεξεργασία ως ροή δεδομένων
• Pipeline από βήματα
• Ανεξάρτητη επεξεργασία κάθε βήματος
• SQL Server Integration Services?
TPL Dataflow
• Διαθέσιμο ως NuGet package
• Από .NET 4.5 και άνω – δηλαδή παντού
• Υπάρχει και στο Mono
Blocks
• ActionBlock
• Το πασπαρτού
• Fire and Forget
• Log writer
Άλλα Blocks
• TransformBlock
• Μετατροπή από ένα Input σε ένα output
• Σαν το LINQ SELECT
• TransformManyBlock
• LINQ SelectMany
• BufferBlock
Linking
• blockA.LinkTo(blockB)
• Αλλάζει στον αέρα
• PropagateCompletion
• Συνηθισμένη γκάφα
Filters!
• LinkTo Με φίλτρο
• blockA.LinkTo(blockB, x=>x.IsSomething || x.IsOther)
• Ακούει κανείς?
• Πρέπει πάντα να υπάρχει διέξοδος
• Άλλη συνήθης γκάφα
Completion
• Complete() στην αρχή
• fistBlock.Complete();
• Περιμένουμε στο τέλος
• await lastBlock.Completion;
• Τελευταίο μήνυμα
• Πρέπει να αδειάσουν όλα τα βήματα, και το
τελευταίο
• Άλλη συνήθης γκάφα
Exception Handling
• Ακύρωση pipeline
• Απόρριψη μηνυμάτων
• To await Complete ρίχνει
Μα δεν θέλω να σταματήσω στη μέση!
• Πρόβλημα και για functional programming
• Λύση από functional programming
Railway oriented programming
• Προτάθηκε από τον Scott Wlaschin το 2014
• F#
• Ταχεία αντιγραφή σε Java, Stream Processing
Happy Path
• Read from User
• Validate input
• Update database
• Send email
readBlock.LinkTo(validateBlock,options);
validatBlock.LinkTo(updateBlock,options);
updateBlock.LinkTo(sendBlock,options);
What could go wrong?
Συνήθως
• Status codes και checks?
• Catch, catch, catch?
• Ξανά από την αρχή?
Κι αν είχαμε δύο output?
Input Success
Failure
Σύνδεση με το επόμενο βήμα
Validate Update DBSuccess
Bypass
Validate Update DB
Αποτέλεσμα?
Validate Update DB Send Email
Validate Update DB Send Email
Εύκολο στην F#
• type TwoTrack<'TEntity> =
| Success of 'Tentity
| Failure of string
• Pattern matching
• Binding
Εμείς interfaces και covariance
public interface IFlowEnvelope
{
bool Success { get; }
string Messages { get; }
}
public interface IFlowEnvelope<TPayload>
:IFlowEnvelope
{
TPayload PayLoad{ get; }
}
public class FlowEnvelope<TPayload>
:IFlowEnvelope<TPayload>
{
public bool Success { get; }
public string Messages { get; }
public TPayload Payload { get; }
}
Οδηγία: Μετατρέψτε τα Exceptions σε
Failures
“Do or do not, there is no try".
Και στο Dataflow?
• Filters!
• LinkTo(…, env => env.Success);
Πως μοιάζει τώρα?
readBlock.LinkTo(validateBlock,options,env=>env.Success);
readBlock.LinkTo(logBlock,options,env=>!env.Success);
validatBlock.LinkTo(updateBlock,options,env=>env.Success);
updateBlock.LinkTo(sendBlock,options,env=>env.Success);
Ζητούνται ομιλητές!
• Δόξα
• Rep!
65ο DotNetZone event: Tpl data flow και railway oriented programming

More Related Content

More from Panagiotis Kanavos

The server side story: Parallel and Asynchronous programming in .NET - ITPro...
The server side story:  Parallel and Asynchronous programming in .NET - ITPro...The server side story:  Parallel and Asynchronous programming in .NET - ITPro...
The server side story: Parallel and Asynchronous programming in .NET - ITPro...Panagiotis Kanavos
 
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...Panagiotis Kanavos
 
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone Event
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone EventΤο Azure δεν είναι χορτοφάγο! - 59ο DotNetZone Event
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone EventPanagiotis Kanavos
 
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (English)Parallel and Asynchronous Programming -  ITProDevConnections 2012 (English)
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)Panagiotis Kanavos
 
Pithos - Architecture and .NET Technologies
Pithos - Architecture and .NET TechnologiesPithos - Architecture and .NET Technologies
Pithos - Architecture and .NET TechnologiesPanagiotis Kanavos
 
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)Panagiotis Kanavos
 
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)Panagiotis Kanavos
 

More from Panagiotis Kanavos (8)

The server side story: Parallel and Asynchronous programming in .NET - ITPro...
The server side story:  Parallel and Asynchronous programming in .NET - ITPro...The server side story:  Parallel and Asynchronous programming in .NET - ITPro...
The server side story: Parallel and Asynchronous programming in .NET - ITPro...
 
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
77o dotNETZone Meetup: Pattern matching expressions. One small step for one l...
 
Ο βασιλιάς Git!
Ο βασιλιάς Git!Ο βασιλιάς Git!
Ο βασιλιάς Git!
 
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone Event
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone EventΤο Azure δεν είναι χορτοφάγο! - 59ο DotNetZone Event
Το Azure δεν είναι χορτοφάγο! - 59ο DotNetZone Event
 
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (English)Parallel and Asynchronous Programming -  ITProDevConnections 2012 (English)
Parallel and Asynchronous Programming - ITProDevConnections 2012 (English)
 
Pithos - Architecture and .NET Technologies
Pithos - Architecture and .NET TechnologiesPithos - Architecture and .NET Technologies
Pithos - Architecture and .NET Technologies
 
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)
 
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
Real Life Task Parallel Library, ITProDevConnections 2011 (Greek)
 

65ο DotNetZone event: Tpl data flow και railway oriented programming