O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
TPL DataFlow και Railway
oriented programming
Παναγιώτης Καναβός
Έτυχε ποτέ
• Να γράφουν πολλά threads σε ένα αρχείο?
• Να επεξεργαστείτε μεγάλα logs?
• Αρχεία τόσο μεγάλα που κρεμάει το ...
DataFlow
• Επεξεργασία ως ροή δεδομένων
• Pipeline από βήματα
• Ανεξάρτητη επεξεργασία κάθε βήματος
• SQL Server Integrati...
TPL Dataflow
• Διαθέσιμο ως NuGet package
• Από .NET 4.5 και άνω – δηλαδή παντού
• Υπάρχει και στο Mono
Blocks
• ActionBlock
• Το πασπαρτού
• Fire and Forget
• Log writer
Άλλα Blocks
• TransformBlock
• Μετατροπή από ένα Input σε ένα output
• Σαν το LINQ SELECT
• TransformManyBlock
• LINQ Sele...
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);
valid...
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 i...
Οδηγία: Μετατρέψτε τα 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.Su...
Ζητούνται ομιλητές!
• Δόξα
• Rep!
65ο DotNetZone event: Tpl data flow και railway oriented programming
65ο DotNetZone event: Tpl data flow και railway oriented programming
Próximos SlideShares
Carregando em…5
×

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

124 visualizações

Publicada em

Χρειάστηκε ποτέ να γράψετε σε ένα log ή Sqlite από 3 threads? Ή να διαβάσετε ενός μήνα logs χωρίς να σκάσει το μηχάνημα? Το κρυφό διαμάντι του .NET, μπορεί απλουστεύει από απλά fire-and-forget tasks μέχρι βαρά processing pipelines

Publicada em: Software
  • Entre para ver os comentários

  • Seja a primeira pessoa a gostar disto

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

  1. 1. TPL DataFlow και Railway oriented programming Παναγιώτης Καναβός
  2. 2. Έτυχε ποτέ • Να γράφουν πολλά threads σε ένα αρχείο? • Να επεξεργαστείτε μεγάλα logs? • Αρχεία τόσο μεγάλα που κρεμάει το μηχάνημα?
  3. 3. DataFlow • Επεξεργασία ως ροή δεδομένων • Pipeline από βήματα • Ανεξάρτητη επεξεργασία κάθε βήματος • SQL Server Integration Services?
  4. 4. TPL Dataflow • Διαθέσιμο ως NuGet package • Από .NET 4.5 και άνω – δηλαδή παντού • Υπάρχει και στο Mono
  5. 5. Blocks • ActionBlock • Το πασπαρτού • Fire and Forget • Log writer
  6. 6. Άλλα Blocks • TransformBlock • Μετατροπή από ένα Input σε ένα output • Σαν το LINQ SELECT • TransformManyBlock • LINQ SelectMany • BufferBlock
  7. 7. Linking • blockA.LinkTo(blockB) • Αλλάζει στον αέρα • PropagateCompletion • Συνηθισμένη γκάφα
  8. 8. Filters! • LinkTo Με φίλτρο • blockA.LinkTo(blockB, x=>x.IsSomething || x.IsOther) • Ακούει κανείς? • Πρέπει πάντα να υπάρχει διέξοδος • Άλλη συνήθης γκάφα
  9. 9. Completion • Complete() στην αρχή • fistBlock.Complete(); • Περιμένουμε στο τέλος • await lastBlock.Completion; • Τελευταίο μήνυμα • Πρέπει να αδειάσουν όλα τα βήματα, και το τελευταίο • Άλλη συνήθης γκάφα
  10. 10. Exception Handling • Ακύρωση pipeline • Απόρριψη μηνυμάτων • To await Complete ρίχνει
  11. 11. Μα δεν θέλω να σταματήσω στη μέση! • Πρόβλημα και για functional programming • Λύση από functional programming
  12. 12. Railway oriented programming • Προτάθηκε από τον Scott Wlaschin το 2014 • F# • Ταχεία αντιγραφή σε Java, Stream Processing
  13. 13. Happy Path • Read from User • Validate input • Update database • Send email readBlock.LinkTo(validateBlock,options); validatBlock.LinkTo(updateBlock,options); updateBlock.LinkTo(sendBlock,options);
  14. 14. What could go wrong?
  15. 15. Συνήθως • Status codes και checks? • Catch, catch, catch? • Ξανά από την αρχή?
  16. 16. Κι αν είχαμε δύο output? Input Success Failure
  17. 17. Σύνδεση με το επόμενο βήμα Validate Update DBSuccess Bypass Validate Update DB
  18. 18. Αποτέλεσμα? Validate Update DB Send Email Validate Update DB Send Email
  19. 19. Εύκολο στην F# • type TwoTrack<'TEntity> = | Success of 'Tentity | Failure of string • Pattern matching • Binding
  20. 20. Εμείς 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; } }
  21. 21. Οδηγία: Μετατρέψτε τα Exceptions σε Failures “Do or do not, there is no try".
  22. 22. Και στο Dataflow? • Filters! • LinkTo(…, env => env.Success);
  23. 23. Πως μοιάζει τώρα? 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);
  24. 24. Ζητούνται ομιλητές! • Δόξα • Rep!

×