Messages as jobs
RabbitMQ is the classic broker, and in it your messages are jobs.
The broker pushes each one to a consumer, the consumer acknowledges it, and the broker deletes it. Routing is rich, matching messages to queues by keys and patterns, and per-message features like priorities and expiry come as standard. Picture a smart dispatcher handing tasks to workers, which is exactly the right shape for background jobs.
A log wearing a queue costume
Kafka is a different data structure wearing a queue costume. A topic is a log you only ever append to, split into partitions. Messages are written at the end and never deleted when somebody reads them, only aged out by a retention policy.
Your consumers barely interact with the broker at all. Each group simply remembers its own position in the log and moves it forward. Two large things follow from that.
First, you can replay. Because reading destroys nothing, a brand new service can read the topic from the beginning, and a team that ships a bug can wind their position back to before the bad deploy and process it all again. A message acknowledged in the classic model is simply gone.
Second, you get throughput. Appending in order and reading in batches lets Kafka push millions of messages a second, and adding partitions adds parallelism almost in a straight line.
Pay for that with coarser features, ordering only inside a partition, no routing per message, and heavier operations, though a managed offering blunts most of the last one.
Decide with one rule. Take a classic broker for distributing work, jobs that should be done once and forgotten, especially with complicated routing or modest volume. Take Kafka for streams of events, where the messages are facts about what happened, several consumers care, the history has value, and the volume is high.
Expect to run both eventually, and that is usually the correct number of brokers.
Worked example
A ride-hailing startup begins with RabbitMQ for everything, and it fits: receipt emails, driver payout jobs, document verification tasks. Then the data team asks for every trip event to build surge pricing models, and the fraud team wants the same events, and so does a new analytics vendor. With RabbitMQ, each new consumer means new bindings and another copy of every message fanned out at publish time. Marco, the platform lead, moves trip events to a Kafka topic with 32 partitions and 7-day retention. Producers write each event once; the pricing, fraud, and analytics teams each attach as separate consumer groups reading independently at their own offsets. When fraud ships a broken model in March, they rewind their offset by 48 hours and reprocess 9 million events overnight. Payout jobs never move; they stay on RabbitMQ, where a job done once and deleted is precisely the point.