krisleech

krisleech

Concurrency settings in Broadway (using Kafka)

I’m trying to understand the concurrency settings in Broadway and what rule of thumb I might use to set them.

We are using BroadwayKafka. I’ve read the docs about concurrency and partitioning.

There are 3 concurrency settings, for the producer, processor and batcher.

I can see how these are arranged in the Broadway dashboard, it looks like the producer processes (labeled as prod_{0..2}) hand off to the processors (labeled as proc_{0..9}), these connect to the batcher processes (labeled as cdc_documents), which hand off to the processes which handle the messages (labeled as proc_{0..3}). That’s my reading of it anyway, there is some more information here.

Our topic, “cdc_documents”, has 4x partitions. The messages on the topic have a key which maps them deterministically to a topic partition. We want to process messages with the same key in strict sequential order.

We have 2x nodes in our Elixir cluster and Broadway is configured to use the same group_id, so they are part of the same consumer group.

  def start_link(_opts) do
    Broadway.start_link(__MODULE__,
      name: __MODULE__,
      producer: [
        module: {BroadwayKafka.Producer, producer_opts()},
        concurrency: 3
      ],
      processors: [
        default: [
          concurrency: 10
        ]
      ],
      batchers: [
        default: [
          batch_size: 100,
          batch_timeout: 200,
          concurrency: 10
        ],
        cdc_documents: [
          batch_size: 100,
          batch_timeout: 200,
          concurrency: 4
        ],
      ]
    )
  end

We have more topics, I’ve just removed them to shorten the code example.

With a certain topics which have a certain amount of partitions how might we configure the concurrency settings.

Our prepare_messages function maps over the messages and decodes the message data (Avro).

Our handle_message just sets the batcher based on the topic name, so one batcher per topic.

Our batch_handler hands off each message to be processed.

Many thanks!

Where Next?

Popular in Questions Top

belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
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
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
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
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

Other popular topics Top

peerreynders
Manning 2016 Halloween weekend sale via Deal of the Day Friday, October 28 - Half off all MEAPs - code WM102816LT Saturday, October 29 ...
326 29600 154
New
yurko
Here are few pieces of (common) Linux knowledge that we use for reasonably small one server apps. We use Ubuntu but this should work for ...
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
AstonJ
You’re a programmer, so you don’t need spoon feeding with the conventional drivel about “this is an integer.” No. You need to know what’s...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
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
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 42633 214
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

We're in Beta

About us Mission Statement