HenriMorlaye

HenriMorlaye

Start a worker on Heroku

Hi
I have a Phoenix app on Heroku, working on one Dyno. I added a GenServer doing some background stuff every 15 minutes (checking the DB, sending emails, etc.), and I started it by adding it to my app’s Supervisor (in lib/myapp.ex).

Now I’d like to use more Dynos to scale my moderately successfull app and I’m wondering how to extract the worker in it’s own command.

The heroku Procfile does “mix phoenix.server” to start a web dyno, and I’d need something like a “mix myapp.myworker” to start a worker in the Procfile. This worker should be able to access my Repo, and some functions in the rest of the app, more or less like a Task in lib/task does.

Like I guess many people here I come from a Rails background, already enjoying Phoenix and functional programming with Elixir, but my understanding of OTP is limited for the moment, and I’m not sure how to get this done ?

Thank you

Most Liked

hubertlepicki

hubertlepicki

There are a few ways you can do it. Personally, I would approach it this way:

One: Create a custom mix task for your background worker. This is good intro: Custom Mix Tasks · Elixir School

I would actually base this task on how phx.server task is structured. Have a look here: phoenix/lib/mix/tasks/phx.server.ex at v1.3.0-rc.2 · phoenixframework/phoenix · GitHub

so what it does is two things a) sets some configuration option to force starting web server, b) starts all applications with Mix.Tasks.Run.run and that’s it.

Two: In the newly created task, I would set different configuration option. Something like `Application.put_env :my_app, :start_background_stuff, true.

Then, I would use this environment variable in your application callback module (application.ex), and check if the value is true, and only if it is - would start the GenServer I want to be running.

Please note that if you do the above, it will work fine as long as you don’t intend to send messages to this GenServer from your Phoenix workers. It won’t work and will throw you with error that no process exists. This will be because on Heroku, background dyno will start as a separate OS process, in fact in a separate container and most likely on different hardware altogether. Since you just want to run something every 15 minutes that should not be a problem I think.

Which, however, brings me to the other point that you might want to use something like quantum instead GitHub - c-rack/quantum-elixir: Cron-like job scheduler for Elixir · GitHub . In such case, I would still implement it in a similar way - create a custom mix task, set config variable in it - and only if the variable is set - configure quantum scheduler. Otherwise (on web dynos) no scheduler would be configured.

hubertlepicki

hubertlepicki

I think @HenriMorlaye just starts mix phx.server for his web dynos. If that’s the case, then it’s quite easy because in Procfile just should specify different mix task, and the variables used would not be shell environment variables at all.

HenriMorlaye

HenriMorlaye

Thank you !
I tried something which seems to be working. I my Procfile I have put:

web: mix phoenix.server
worker: WORKER_APP=true mix phoenix.server

and just changed the MyApp.ex application file to add in the Supervisor the genserver if the env variable “WORKER_APP” exists, and add MyApp.Endpoint if the env variable is empty.

Where Next?

Popular in Questions Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
mgjohns61585
Could someone help me? I’m making my first elixir program, number guessing game. I can’t figure out how to convert the user’s guess from ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: The documentation above suggests that while ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call t...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

Other popular topics Top

malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 42920 311
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52341 488
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New

We're in Beta

About us Mission Statement