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

26
TPL DataFlow και Railway oriented programming Παναγιώτης Καναβός

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

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

TPL DataFlow και Railway oriented

programmingΠαναγιώτης Καναβός

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

Έτυχε ποτέ• Να γράφουν πολλά threads σε ένα αρχείο?• Να επεξεργαστείτε μεγάλα logs?• Αρχεία τόσο μεγάλα που κρεμάει το μηχάνημα?

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

DataFlow• Επεξεργασία ως ροή δεδομένων• Pipeline από βήματα• Ανεξάρτητη επεξεργασία κάθε βήματος• SQL Server Integration Services?

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

TPL Dataflow• Διαθέσιμο ως NuGet package• Από .NET 4.5 και άνω – δηλαδή παντού• Υπάρχει και στο Mono

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

Blocks• ActionBlock• Το πασπαρτού• Fire and Forget• Log writer

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

Άλλα Blocks• TransformBlock• Μετατροπή από ένα Input σε ένα output• Σαν το LINQ SELECT

• TransformManyBlock• LINQ SelectMany

• BufferBlock

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

Linking• blockA.LinkTo(blockB)• Αλλάζει στον αέρα• PropagateCompletion• Συνηθισμένη γκάφα

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

Filters!• LinkTo Με φίλτρο• blockA.LinkTo(blockB, x=>x.IsSomething || x.IsOther)

• Ακούει κανείς?• Πρέπει πάντα να υπάρχει διέξοδος• Άλλη συνήθης γκάφα

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

Completion• Complete() στην αρχή• fistBlock.Complete();

• Περιμένουμε στο τέλος• await lastBlock.Completion;

• Τελευταίο μήνυμα•Πρέπει να αδειάσουν όλα τα βήματα, και το

τελευταίο• Άλλη συνήθης γκάφα

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

Exception Handling• Ακύρωση pipeline• Απόρριψη μηνυμάτων• To await Complete ρίχνει

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

Μα δεν θέλω να σταματήσω στη μέση!• Πρόβλημα και για functional programming• Λύση από functional programming

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

Railway oriented programming

• Προτάθηκε από τον Scott Wlaschin το 2014• F#• Ταχεία αντιγραφή σε Java, Stream Processing

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

Happy Path• Read from User• Validate input• Update database• Send email

readBlock.LinkTo(validateBlock,options);validatBlock.LinkTo(updateBlock,options);updateBlock.LinkTo(sendBlock,options);

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

What could go wrong?

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

Συνήθως• Status codes και checks?• Catch, catch, catch?• Ξανά από την αρχή?

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

Κι αν είχαμε δύο output?

Input Success

Failure

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

Σύνδεση με το επόμενο βήμαValidate Update DBSuccess

Bypass

Validate Update DB

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

Αποτέλεσμα?Validate Update DB Send Email

Validate Update DB Send Email

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

Εύκολο στην F#• type TwoTrack<'TEntity> =

| Success of 'Tentity | Failure of string

• Pattern matching• Binding

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

Εμείς 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; } }

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

Οδηγία: Μετατρέψτε τα Exceptions σε Failures

“Do or do not, there is no try".

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

Και στο Dataflow?• Filters!• LinkTo(…, env => env.Success);

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

Πως μοιάζει τώρα?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);

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

Railway Oriented Programming

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

Ζητούνται ομιλητές!• Δόξα • Rep!

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