SlideShare a Scribd company logo
F# Server side programming
Dave Thomas
MoiraeSoftware.com
twitter.com/7sharp9
F# Server based programming
Why F#
• Concise succinct code
• Advanced asynchronous support
• Language Orientated Programming
• Generic by default
• Immutable by default
Fundamental Concepts
• Pure Functions
– No side effects
– memoization
• Immutability
– No threading issues
• Lambda expressions
• Higher order functions
• Recursion
Patterns and Practices
C#
• Inheritance
• Polymorphism
F#
• Higher order functions
• Type augmentation
Patterns / similarities
• Discriminated unions -> Small class hierarchies
• Higher Order Functions -> Command Pattern
• Fold -> Visitor pattern
A comparison of styles
F#
• 1 source file
• 43 lines
• 2 types
C#
• 2 source files
• 166 lines
• 2 type
75% reduction in code
C# ObjectPool
F# ObjectPool
//Agent alias for MailboxProcessor
type Agent<'T> = MailboxProcessor<'T>
///One of three messages for our Object Pool agent
typePoolMessage<'a> =
| Get ofAsyncReplyChannel<'a>
| Put of 'a
| Clear ofAsyncReplyChannel<List<'a>>
/// Object pool representing a reusable pool of objects
typeObjectPool<'a>(generate: unit -> 'a, initialPoolCount) =
let initial = List.initinitialPoolCount (fun (x) -> generate())
let agent = Agent.Start(fun inbox ->
letrecloop(x) = async {
let!msg = inbox.Receive()
matchmsgwith
| Get(reply) ->
let res = matchxwith
| a :: b->
reply.Reply(a);b
| [] as empty->
reply.Reply(generate());empty
return!loop(res)
| Put(value)->
return!loop(value :: x)
| Clear(reply) ->
reply.Reply(x)
return!loop(List.empty<'a>) }
loop(initial))
/// Clears the object pool, returning all of the data that was in the
pool.
memberthis.ToListAndClear() =
agent.PostAndAsyncReply(Clear)
/// Puts an item into the pool
memberthis.Put(item ) =
agent.Post(item)
/// Gets an item from the pool or if there are none present use the
generator
memberthis.Get(item) =
agent.PostAndAsyncReply(Get)
F# - Fracture IO
Open source high performance
Socket, Pipeline, and agent library
Sockets
2 Models of Operation
• AsyncResult Model
• SocketAsyncEventArgs Model
IAsyncResults Model
Pros
• Well documented API
• Can be simplified with helpers in
Asynchronous workflows in F#
• Fast to get an initial result
Cons
• Allocation of IAsyncResult on every Operation
• Consumes more CPU for each send and
receive operation
F# AsyncResult
SocketAsyncEventArgs Model
Pros
• Less memory allocations
• Better performance
• Closer to the metal
Cons
• Not a well understood or documented API
• Can be complex to get right
Performance Differences
• 5 minute test
• 50 clients connecting to
the server
• 15ms interval between
each one
• Server sends each client
a 128 byte message
every 100ms
• Total of 500 messages
per second
Test Harness
CPU & Threads
SocketAsyncEventArgs IAsyncResult
Memory
SocketAsyncEventArgs IAsyncResult
Garbage collection
SocketAsyncEventArgs IAsyncResult
Fracture Socket Implementation
Agents
• Provide a message passing mechanism
• Agents read and respond to a queue of
messages
• Typically a discriminated union is used to
describe messages
Introducing Fracture-IO
• High performance Socket library
• Highly compositional pipeline library
Pipelines
• Closed Pipelines
– Tomas Petricek
• Image Processing Pipeline
• Open Pipelines
– Pipelets
Closed Pipelines
Image Processing Pipeline
1: // Phase 1: Load images from disk and put them into a queue
2: letloadImages=async {
3: letclockOffset=Environment.TickCount
4: letrec numbers n=seq { yieldn; yield! numbers (n+1) }
5: for count, imginfileNames|>Seq.zip (numbers 0) do
6: let info =loadImageimgsourceDir count clockOffset
7: do!loadedImages.AsyncAdd(info) }
8:
9: // Phase 2: Scale to a thumbnail size and add frame
10: letscalePipelinedImages=async {
11: whiletruedo
12: let! info =loadedImages.AsyncGet()
13: scaleImage info
14: do!scaledImages.AsyncAdd(info) }
1: letloadedImages=newBlockingQueueAgent<_>(queueLength)
2: letscaledImages=newBlockingQueueAgent<_>(queueLength)
3: letfilteredImages=newBlockingQueueAgent<_>(queueLength)
1: // Phase 4: Display images as they become available
2: letdisplayPipelinedImages=async {
3: whiletruedo
4: let! info =filteredImages.AsyncGet()
5: info.QueueCount1 <-loadedImages.Count
6: info.QueueCount2 <-scaledImages.Count
7: info.QueueCount3 <-filteredImages.Count
8: displayImage info }
9:
10: // Start workflows that implement pipeline phases
11: Async.Start(loadImages, cts.Token)
12: Async.Start(scalePipelinedImages, cts.Token)
13: Async.Start(filterPipelinedImages, cts.Token)
14: tryAsync.RunSynchronously(displayPipelinedImages, cancellationToken=cts.Token)
15: with:?OperationCanceledException-> ()
Open Pipelines
Advantages
• Composability
• Reusability
• Can be used at any stage of processing
• Separation of concerns
• Flexible routing arrangements i.e. round robin, multicast,
content based routing
Disadvantages
• Pipeline stages need to be balanced
• Developers can have trouble debugging and visualizing
Pipelets Implementation
Pipelets in use
Future Directions
• Distributed Pipelets
– Wave Pipelines
– Synchronous buffered Pipeline
• Advanced agent based programming
- Supervision
- Pooling
- Control Messages

More Related Content

PDF
Tweet2vec learning tweet_embeddings_using_characterlevel_cnn_lstm_encoder_dec...
PPT
Compilation
PDF
Compiler type
PDF
CNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
PPTX
Types of Compilers
PDF
1 introduction to compiler
PPT
Introduction to course
Tweet2vec learning tweet_embeddings_using_characterlevel_cnn_lstm_encoder_dec...
Compilation
Compiler type
CNIT 127 Ch 16: Fault Injection and 17: The Art of Fuzzing
Types of Compilers
1 introduction to compiler
Introduction to course

What's hot (20)

PDF
Compiler.design.in.c.docs
PPTX
Python programming 2nd
PDF
CNIT 126 Ch 7: Analyzing Malicious Windows Programs
PPTX
compiler and their types
PPTX
Pros and cons of c as a compiler language
PDF
The compilation process
PDF
CNIT 127 Ch 4: Introduction to format string bugs
PDF
Compiler Design Quiz
PPTX
Compilation of c
PDF
CNIT 127 Ch 8: Windows overflows (Part 1)
PDF
CNIT 127 Lecture 7: Intro to 64-Bit Assembler
PPTX
COMPILER DESIGN OPTIONS
PPSX
PDF
Messaging With Erlang And Jabber
PDF
Compiler Construction | Lecture 1 | What is a compiler?
PPT
Classification of Compilers
PPT
Introduction to Compiler
PPT
Introduction to compiler
PDF
CNIT 127: 8: Windows overflows (Part 2)
PDF
COMPILER DESIGN- Introduction & Lexical Analysis:
Compiler.design.in.c.docs
Python programming 2nd
CNIT 126 Ch 7: Analyzing Malicious Windows Programs
compiler and their types
Pros and cons of c as a compiler language
The compilation process
CNIT 127 Ch 4: Introduction to format string bugs
Compiler Design Quiz
Compilation of c
CNIT 127 Ch 8: Windows overflows (Part 1)
CNIT 127 Lecture 7: Intro to 64-Bit Assembler
COMPILER DESIGN OPTIONS
Messaging With Erlang And Jabber
Compiler Construction | Lecture 1 | What is a compiler?
Classification of Compilers
Introduction to Compiler
Introduction to compiler
CNIT 127: 8: Windows overflows (Part 2)
COMPILER DESIGN- Introduction & Lexical Analysis:
Ad

Similar to F# Server-side programming (20)

PDF
10600122065_Animesh mani (CD).pdf
PPTX
Realtime traffic analyser
PPTX
Compiler Construction
PDF
Building a company-wide data pipeline on Apache Kafka - engineering for 150 b...
PPTX
Fastest Servlets in the West
PDF
Performance and Abstractions
PDF
009478419.pdf
PPTX
Spark Kernel Talk - Apache Spark Meetup San Francisco (July 2015)
PDF
NoSQL afternoon in Japan kumofs & MessagePack
PDF
NoSQL afternoon in Japan Kumofs & MessagePack
PDF
Intro to elixir and phoenix
PPTX
Tuning kafka pipelines
PDF
Computer Architecture And Design-Introduction.pdf
PPT
Rpc (Distributed computing)
PPTX
CSC 204 PASSES IN COMPILER CONSTURCTION.pptx
PPTX
An eclipse client server architecture with asynchronous messaging
PPTX
Real-Time Voice Actuation
PDF
XMPP/Jingle(VoIP)/Perl Ocean 2012/03
PDF
Scaling Machine Learning Systems up to Billions of Predictions per Day
PPTX
Scheduling Thread
10600122065_Animesh mani (CD).pdf
Realtime traffic analyser
Compiler Construction
Building a company-wide data pipeline on Apache Kafka - engineering for 150 b...
Fastest Servlets in the West
Performance and Abstractions
009478419.pdf
Spark Kernel Talk - Apache Spark Meetup San Francisco (July 2015)
NoSQL afternoon in Japan kumofs & MessagePack
NoSQL afternoon in Japan Kumofs & MessagePack
Intro to elixir and phoenix
Tuning kafka pipelines
Computer Architecture And Design-Introduction.pdf
Rpc (Distributed computing)
CSC 204 PASSES IN COMPILER CONSTURCTION.pptx
An eclipse client server architecture with asynchronous messaging
Real-Time Voice Actuation
XMPP/Jingle(VoIP)/Perl Ocean 2012/03
Scaling Machine Learning Systems up to Billions of Predictions per Day
Scheduling Thread
Ad

Recently uploaded (20)

PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Mushroom cultivation and it's methods.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
TLE Review Electricity (Electricity).pptx
PPTX
Tartificialntelligence_presentation.pptx
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
A Presentation on Artificial Intelligence
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Spectral efficient network and resource selection model in 5G networks
Unlocking AI with Model Context Protocol (MCP)
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Mushroom cultivation and it's methods.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Advanced methodologies resolving dimensionality complications for autism neur...
TLE Review Electricity (Electricity).pptx
Tartificialntelligence_presentation.pptx
SOPHOS-XG Firewall Administrator PPT.pptx
Diabetes mellitus diagnosis method based random forest with bat algorithm
Accuracy of neural networks in brain wave diagnosis of schizophrenia
gpt5_lecture_notes_comprehensive_20250812015547.pdf
TechTalks-8-2019-Service-Management-ITIL-Refresh-ITIL-4-Framework-Supports-Ou...
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Mobile App Security Testing_ A Comprehensive Guide.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Encapsulation_ Review paper, used for researhc scholars
A Presentation on Artificial Intelligence
A comparative analysis of optical character recognition models for extracting...
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf

F# Server-side programming

  • 1. F# Server side programming Dave Thomas MoiraeSoftware.com twitter.com/7sharp9
  • 2. F# Server based programming Why F# • Concise succinct code • Advanced asynchronous support • Language Orientated Programming • Generic by default • Immutable by default
  • 3. Fundamental Concepts • Pure Functions – No side effects – memoization • Immutability – No threading issues • Lambda expressions • Higher order functions • Recursion
  • 4. Patterns and Practices C# • Inheritance • Polymorphism F# • Higher order functions • Type augmentation
  • 5. Patterns / similarities • Discriminated unions -> Small class hierarchies • Higher Order Functions -> Command Pattern • Fold -> Visitor pattern
  • 6. A comparison of styles F# • 1 source file • 43 lines • 2 types C# • 2 source files • 166 lines • 2 type 75% reduction in code
  • 8. F# ObjectPool //Agent alias for MailboxProcessor type Agent<'T> = MailboxProcessor<'T> ///One of three messages for our Object Pool agent typePoolMessage<'a> = | Get ofAsyncReplyChannel<'a> | Put of 'a | Clear ofAsyncReplyChannel<List<'a>> /// Object pool representing a reusable pool of objects typeObjectPool<'a>(generate: unit -> 'a, initialPoolCount) = let initial = List.initinitialPoolCount (fun (x) -> generate()) let agent = Agent.Start(fun inbox -> letrecloop(x) = async { let!msg = inbox.Receive() matchmsgwith | Get(reply) -> let res = matchxwith | a :: b-> reply.Reply(a);b | [] as empty-> reply.Reply(generate());empty return!loop(res) | Put(value)-> return!loop(value :: x) | Clear(reply) -> reply.Reply(x) return!loop(List.empty<'a>) } loop(initial)) /// Clears the object pool, returning all of the data that was in the pool. memberthis.ToListAndClear() = agent.PostAndAsyncReply(Clear) /// Puts an item into the pool memberthis.Put(item ) = agent.Post(item) /// Gets an item from the pool or if there are none present use the generator memberthis.Get(item) = agent.PostAndAsyncReply(Get)
  • 9. F# - Fracture IO Open source high performance Socket, Pipeline, and agent library
  • 10. Sockets 2 Models of Operation • AsyncResult Model • SocketAsyncEventArgs Model
  • 11. IAsyncResults Model Pros • Well documented API • Can be simplified with helpers in Asynchronous workflows in F# • Fast to get an initial result Cons • Allocation of IAsyncResult on every Operation • Consumes more CPU for each send and receive operation
  • 13. SocketAsyncEventArgs Model Pros • Less memory allocations • Better performance • Closer to the metal Cons • Not a well understood or documented API • Can be complex to get right
  • 14. Performance Differences • 5 minute test • 50 clients connecting to the server • 15ms interval between each one • Server sends each client a 128 byte message every 100ms • Total of 500 messages per second Test Harness
  • 19. Agents • Provide a message passing mechanism • Agents read and respond to a queue of messages • Typically a discriminated union is used to describe messages
  • 20. Introducing Fracture-IO • High performance Socket library • Highly compositional pipeline library
  • 21. Pipelines • Closed Pipelines – Tomas Petricek • Image Processing Pipeline • Open Pipelines – Pipelets
  • 23. Image Processing Pipeline 1: // Phase 1: Load images from disk and put them into a queue 2: letloadImages=async { 3: letclockOffset=Environment.TickCount 4: letrec numbers n=seq { yieldn; yield! numbers (n+1) } 5: for count, imginfileNames|>Seq.zip (numbers 0) do 6: let info =loadImageimgsourceDir count clockOffset 7: do!loadedImages.AsyncAdd(info) } 8: 9: // Phase 2: Scale to a thumbnail size and add frame 10: letscalePipelinedImages=async { 11: whiletruedo 12: let! info =loadedImages.AsyncGet() 13: scaleImage info 14: do!scaledImages.AsyncAdd(info) } 1: letloadedImages=newBlockingQueueAgent<_>(queueLength) 2: letscaledImages=newBlockingQueueAgent<_>(queueLength) 3: letfilteredImages=newBlockingQueueAgent<_>(queueLength) 1: // Phase 4: Display images as they become available 2: letdisplayPipelinedImages=async { 3: whiletruedo 4: let! info =filteredImages.AsyncGet() 5: info.QueueCount1 <-loadedImages.Count 6: info.QueueCount2 <-scaledImages.Count 7: info.QueueCount3 <-filteredImages.Count 8: displayImage info } 9: 10: // Start workflows that implement pipeline phases 11: Async.Start(loadImages, cts.Token) 12: Async.Start(scalePipelinedImages, cts.Token) 13: Async.Start(filterPipelinedImages, cts.Token) 14: tryAsync.RunSynchronously(displayPipelinedImages, cancellationToken=cts.Token) 15: with:?OperationCanceledException-> ()
  • 24. Open Pipelines Advantages • Composability • Reusability • Can be used at any stage of processing • Separation of concerns • Flexible routing arrangements i.e. round robin, multicast, content based routing Disadvantages • Pipeline stages need to be balanced • Developers can have trouble debugging and visualizing
  • 27. Future Directions • Distributed Pipelets – Wave Pipelines – Synchronous buffered Pipeline • Advanced agent based programming - Supervision - Pooling - Control Messages