Billzabob
Library Idea for Data Pipeline Processing
Hello!
I have an idea for an Elixir library I’d like to work on, but wanted to get some thoughts from the community first. It would allow you to define data pipelines declaratively. Here’s an example of what I’m imagining the API would look like:
defmodule MyPipeline do
# Library name tbd
use Pipeline
pipeline do
# This strategy would generate a GenStage pipeline that runs steps in the same stage concurrently
strategy Pipeline.GenStage
# This strategy would simply run every step on after the other in the same process.
# strategy Pipeline.SingleProcess
stage do
step Socks, color: :blue
step Underwear, style: :boxers
step Shirt
end
stage do
step Pants
step Tie
end
stage do
step Shoes
step Belt
end
step Jacket
end
# The pipeline above would generate a data flow that looks something like the following.
# All the steps in the same stage will be executed in parallel.
# A stage will start as soon as all the steps in the previous stage have been ran.
# Stage 1
# ┌─────┐┌─────────┐┌─────┐
# │socks││underwear││shirt│
# └─────┘└─────────┘└─────┘
# Stage 2
# ┌──────────┐┌───────────┐
# │pants ││tie │
# └──────────┘└───────────┘
# Stage 3
# ┌───────────┐┌──────────┐
# │shoes ││belt │
# └───────────┘└──────────┘
# Stage 4
# ┌───────────────────────┐
# │jacket │
# └───────────────────────┘
end
Each step would look like the following, and could probably also be just a simple function instead of a module:
defmodule Step.Pants do
@behaviour Pipeline.Step
@impl Pipeline.Step
def run(env, _opts) do
IO.puts("Putting on my pants!")
updated = Pipeline.Step.put_info(env, pants: :done)
{:ok, updated}
end
end
Anyways, I just wanted to get some thoughts before I start working on this. I was unable to find anything that already exists that does this. Broadway and Flow are probably the most similar, and I can even see this using Flow under the hood for the strategy Pipeline.GenStage stuff.
I don’t want to work on it if it has any major flaws that anyone can foresee, or if there’s just a better way to do this already.
Thanks in advance!
Most Liked
MrDoops
You might also look at Dagger which is being more actively worked on than Piper which is more of a reference example with the expectation others would vendor a forked version into their own repo.
You can also check out the notebook I made for my Empex MTN talk.
Oban Pro Workflows are probably the most production ready version of this idea in Elixir land - but you do have to pay ![]()
Dagger is doing some extra things like conditional expansion, rule composition, state machines, and joins (steps that depend on more than one step). You might not need this and the library needs work, so I’d recommend just modeling this sort of thing like Piper with some structs and a graph library like Libgraph.
I still have some more larger todo’s I’m trying to work on before Dagger is 0.1.0 and Hex ready.
If you’re modeling dataflow step dependencies in a DAG - it is important to separate the runtime execution to the functional model and to do that you want a form of lazy execution. Similar idea as the Mint client library of being “process-less” since the runtime has “it depends” scenarios to account for. So long as lazy evaluation is possible you can implement the runtime execution pieces with Broadway, Tasks, GenStage, and so on every which way you need.
Popular in RFCs
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









