65ο DotNetZone event: Tpl data flow και railway oriented programming
-
Upload
panagiotis-kanavos -
Category
Software
-
view
61 -
download
0
Transcript of 65ο DotNetZone event: Tpl data flow και railway oriented programming
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);
Railway Oriented Programming
Ζητούνται ομιλητές!• Δόξα • Rep!