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

Post on 14-Apr-2017

61 views 0 download

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!