I hereby claim:
- I am emerleite on github.
- I am emerleite (https://keybase.io/emerleite) on keybase.
- I have a public key ASDB6-VoRERcUdEq0htm7oQQEiBdnR6n5odIALzEfGzuFgo
To claim this, I am signing this object:
I hereby claim:
To claim this, I am signing this object:
| Operating System: macOS" | |
| CPU Information: Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz | |
| Number of Available Cores: 8 | |
| Available memory: 16 GB | |
| Elixir 1.7.0-dev | |
| Erlang 21.0 | |
| Benchmark suite executing with the following configuration: | |
| warmup: 5 s | |
| time: 30 s |
See demo
| defmodule Upa.VideoWatchProgress do | |
| def save(attrs) do | |
| struct(Upa.VideoWatchProgress, attrs) | |
| |> changeset | |
| |> Upa.Repo.insert(on_conflict: insert_conflict_strategy(attrs)) | |
| |> case do | |
| {:error, _} = error -> raise Upa.DatabaseCommandError | |
| {:ok, changeset} -> :ok | |
| end | |
| end |
| defmodule UpaEventSourcing.VideoWatchProgress.EventAggregator do | |
| def start_link(event) do | |
| Task.start_link(fn -> | |
| Upa.VideoWatchProgress.save(event) #Saves to the database | |
| end) | |
| end | |
| end | |
| defmodule UpaEventSourcing.VideoWatchProgress.EventConsumer do | |
| use ConsumerSupervisor |
| children = [ | |
| worker(UpaEventSourcing.VideoWatchProgress.EventStore, []), | |
| worker(UpaEventSourcing.VideoWatchProgress.EventConsumer, [ | |
| %{producer: UpaEventSourcing.VideoWatchProgress.EventStore, | |
| processor: UpaEventSourcing.VideoWatchProgress.EventAggregator} | |
| ]) | |
| ] |
| config :upa, video_watch_progress_min_demand: 1 | |
| config :upa, video_watch_progress_max_demand: 192 | |
| config :upa, Upa.Repo, | |
| adapter: Ecto.Adapters.MySQL, | |
| hostname: "host.example.com", | |
| database: "our_database", | |
| username: "${MYSQL_USR}", | |
| password: "${MYSQL_PWD}", | |
| pool_size: 48 |
| defmodule UpaEventSourcing.VideoWatchProgress.EventStore do | |
| use GenStage | |
| @event_processing_timeout 11 #Max seconds to process a track video watch progress event | |
| def start_link() do |
| #Phoenix Action | |
| def track_time(conn, params) do | |
| RequestParamsHandler.prepare(conn, params) | |
| |> EventStore.enqueue #Send to GenStage pipeline | |
| send_resp(conn, 201, "") | |
| end |
| #Supervision Tree definition for Events | |
| children = [ | |
| worker(UpaEventSourcing.VideoWatchProgress.EventStore, []), | |
| worker(UpaEventSourcing.VideoWatchProgress.EventConsumer, [ | |
| %{producer: UpaEventSourcing.VideoWatchProgress.EventStore, | |
| processor: UpaEventSourcing.VideoWatchProgress.EventAggregator} | |
| ]) | |
| ] |