Upload
elixir-meetup
View
206
Download
1
Embed Size (px)
Citation preview
- Ruby developer at Matic Insurance- Elixir fan- Author and maintainer of
ESpec BDD test framework
github: antonmi
Hello!I am Anton Mishchuk
2
The problem
◎ There are some problems in “conventional programing”:
- code is procedural and sequential- parallelism is not native- hierarchical structure of program- visualisation is more about structure
◎ We need alternative approaches for building our programs to make software better!
3
My previous FBP talk
4
http://www.slideshare.net/AntonMishchuk/flowbased-programming-with-elixir
The goal of the talk
◎ Discuss a special case of Flow-Based Programming: “Railway FBP” (R-FBP)
◎ Present Flowex library which helps to create R-FBP abstractions
◎ Show that Elixir GenStage is not only about data-processing but about software design
5
What will be about
◎ Flow-Based Programming (FBP)◎ Railway Oriented Programming (ROP)◎ Railway FBP◎ Flowex library
Lots of pictures!
6
“FBP - a programming paradigm
that defines applications as networks of "black box" processes,
which exchange data across predefined connections by
message passing
J. Paul Morrison, Flow-Based Programming, 2nd Edition 8
Express a problem in terms of transforms on streams of data
http://www.jpaulmorrison.com/fbp/FBPnew.ppt
10
Design pros
◎ Independent and reusable components◎ Clean interfaces◎ Simple to reconfigure◎ Minimizes side-effects◎ Designer can sit at one “station”, or can
follow an item through system
http://www.jpaulmorrison.com/fbp/FBPnew.ppt
11
Express a problem in terms of sequence of functions calls
request |> validate_request|> get_user|> update_db_from_request|> send_email|> return_http_message
14
Define common interface for successful and error cases
◎ For example use: {:ok, "data"} or {:error, "Failure reason"}
◎ Each function returns {:ok, "data"} or {:error, "Failure reason"}
◎ If function is called with {:error, "Failure reason"} it just bypasses it
15
Define interface to bypass errors
http://fsharpforfunandprofit.com/rop/16
So the program is a railway from input to output
http://fsharpforfunandprofit.com/rop/17
Elixir Plug is a good example!
◎ Each “plug” function receives and returns a “connection structure” %Plug.Conn{}
◎ %Plug.Conn{} contains:assigns, cookies, halted, host, method, params, resp_body, resp_cookies, status, and many other attributes
18
GenStage
◎ Easiest way to implement a chain of communicating processes
◎ Back-pressure mechanism
producer consumer
Subscribe
Ask
Events
23
Note, the functions are cool!
◎ They have the same interface◎ They operate with predefined structWe can join them into pipeline:
28
“use Flowex.Pipeline”
◎ Adds ‘pipe’ macro which allows to mark functions “to be placed” into separate Genstage
◎ Defines ‘start’ and ‘stop’ functions for creating and destroying “Flowex pipelines”
◎ Defines ‘run’ function to perform calculations
31
%Flowex.Pipeline{} struct
◎ module - the name of the module◎ in_name - unique name of 'producer'◎ out_name - unique name of 'consumer'◎ sup_pid - pid of the pipeline supervisor
34
How it works in details
add_one
minus_three
mult_by_two
producer
consumer
Flowex.Client
%FunPipeline{number: 2}
%Flowex.IP{struct: %FunPipeline{number: 2}, ...}
number: 2
number: 2
number: 3
number: 6
number: 3number: 3
self()
%FunPipeline{number: 3}
37
And you get this
add_one
minus_three
mult_by_twoproducer consumer
mult_by_two
minus_three
mult_by_two
43
It is easy to understand
◎ Pipelines explicitly define a structure of data will be processed
◎ Pipelines explicitly define a way the data will come
◎ Pipelines explicitly define a parallel executors structure
49
It is easy to maintain and reuse
◎ There is a predefined set of working processes (components) in a program
◎ Each component is isolated◎ Pipelines can (and should) reuse
components
50
It is about controlled parallelism
◎ One can controll number of clients supplying data to a pipeline
◎ One can control the number of processes available for each component
51
Thank you! Questions?
52
You can star the project here: https://github.com/antonmi/flowex