thamurath

thamurath

Hi all,

I am pretty new to Elixir. I have been reading some books and articles and now I want to work on some project to settle the concepts.

I have a project based on microservices, that I would like to replicate in Elixir.
I thought umbrella projects were a good way to go as services could be almost mapped to applications, but there is something I am not getting.

Kafka is the entry point for the application and I thought on using Kaffe as library to handle it.
I need to “consume” multiple topics with different information so different services handle the messages but, as all the apps have to use the same configuration I do not know how to configure Kaffe differently for each application.

It seems it is a common pattern to use apps instead of libraries in Elixir so, Is there any way to define different configurations for Kaffe?

There are multiple things here:

  • I feel there are things I do not get regarding Umbrella projects … What are the useful for? I have been looking for documentation regarding this type of projects but found nothing interesting.
  • Application configuration: All the applications inside an umbrella project use the same config.exs file, but each one should define its own dependencies and applications that should be up & running for them to work, but they should share the dependencies … I do not get why I cannot define the dependencies directly on the root project

I like the way umbrella projects allow me to have different applications while having just one repo and be able to deploy everything using releases, but:

  • I need more information regarding how and when to use umbrella projects
  • I do not know how to read custom configuration and how to configure an application I depend on differently for each application in an umbrella project.

Sorry for the loooong post.

Thanks in advance your time, any information will be really appreciated.

Showing Posts 1 to 3

stefanchrobot

stefanchrobot

I would suggest avoiding configuring your app via config.exs - this is a build time configuration. Granted, some libraries make it harder than others, but you should generally favour runtime configuration. Seems like Kaffe supports that with start_link/4 - pull it from ENV, not config.exs.

Given that, it seems umbrella apps might not be what you need:

Don’t drink the kool aid

Umbrella projects are a convenience to help you organize and manage multiple applications. While it provides a degree of separation between applications, those applications are not fully decoupled, as they share the same configuration and the same dependencies.

The pattern of keeping multiple applications in the same repository is known as “mono-repo”. Umbrella projects maximize this pattern by providing conveniences to compile, test and run multiple applications at once.

If you find yourself in a position where you want to use different configurations in each application for the same dependency or use different dependency versions, then it is likely your codebase has grown beyond what umbrellas can provide.

I think you’d be good with just a common lib and multiple projects.

thamurath

thamurath OP

@stefanchrobot Thanks for the hints … I think I will go with the multiple projects aproach. I am now taking a look into distillery to try to figure how to create releases with multiple projects … if that’s even possible.

Regarding configuration, and sorry if the question is too dumb or basic but I am just starting to learn the Elixir environment, by favour runtime configuration you mean to use a config/releases.exs file and read values from environment variables there?
I was wondering if there isn’t any way to load configuration in Elixir similar to configmaps in k8s, that is from a file.

Anyway, thanks again for your time.

stefanchrobot

stefanchrobot

What would be the benefit of creating a release with multiple projects? I’d go with a release per project and would also suggest Elixir’s releases as they are simpler.

config/config.exs and friends (except for config/releases.exs) are build-time configuration. So if you read ENV there, it’s going to be baked into the app with whatever the value was at the compile stage. This is where config/releases.exs comes in. The problem is that it’s used only by an app packaged as a release.

My personal approach and preference is to have the same flow in all cases (prod, dev and test). So my configs are mostly empty, except for things that are required to be configured at build-time. My release config is empty as well. I pushed all config to relevant places much like as suggested by Saša Jurić in his blog post. For dev and test I’m populating ENV using .env files, in prod the ENV is populated by the platform (Gigalixir, Render, etc.).

EDIT:

See also: Add config/runtime.exs · Issue #9884 · elixir-lang/elixir · GitHub

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews