There are many forms of coupling in software architecture.
Some are visible.
Some are hidden.
Some exist in the code.
Some exist in the data.
Some exist in the way teams coordinate changes.
This is why I often see a dangerous misconception in system design:
“If we put Kafka between the systems, they will be loosely coupled.”
Not necessarily.
Kafka may decouple the transport.
It does not automatically decouple the systems.
Synchronous APIs create one kind of coupling.
A service calls another service and waits for a response.
If the receiver is unavailable, the caller may fail.
Introducing a message broker can improve that situation.
The producer no longer needs the consumer to be available at the exact same time.
That is useful.
But it only solves one problem.
It reduces runtime coupling.
It does not remove semantic coupling.
A producer and a consumer are not only connected by a topic.
They are connected by the information they share.
If a producer publishes a payment event, the consumer must understand what that event means.
What is a payment?
What does the status represent?
Is the amount booked, reserved, settled, reversed, or pending?
Is the timestamp the creation time, processing time, booking date, or value date?
Is the account an internal account, customer account, settlement account, or ledger account?
These are not Kafka questions.
They are business questions.
And if two systems interpret the same message differently, the architecture is not loosely coupled.
It is silently broken.
The real contract between systems is not the topic.
It is the protocol.
The protocol defines:
the structure of the message
the meaning of each field
the allowed values
the business rules
the versioning strategy
the compatibility guarantees
the ownership of change
the error handling expectations
the lifecycle of the information
Without a clear protocol, Kafka simply becomes a faster way to distribute confusion.
A system is not loosely coupled because communication is asynchronous.
A system is loosely coupled when producers and consumers can evolve independently without constant coordination.
That requires more than a broker.
It requires stable business concepts.
It requires well-defined messages.
It requires ownership of protocols.
It requires backwards compatibility.
It requires clear rules for change.
If every producer change forces every consumer to change, the systems are still tightly coupled.
They are just tightly coupled through events instead of API calls.
Component principles such as REP, CCP, and CRP are still important.
They help us reason about what should be released together, what should change together, and what should be reused together.
But in distributed systems, another question becomes just as important:
What information crosses the boundary?
Because once information crosses a boundary, it becomes a protocol.
And protocols are architecture.
A direct API call is at least visible.
A bad event can spread across many consumers.
Each consumer may interpret it slightly differently.
Each consumer may build local assumptions around it.
Over time, the event becomes harder to change than the system that produced it.
That is how organizations accidentally create distributed monoliths.
Not because they used the wrong technology.
Because they failed to design the protocol
A good protocol does not expose internal implementation details.
It does not leak database structure.
It does not force consumers to understand producer internals.
It describes a stable business fact.
For example:
PaymentReceived
InvoiceMatched
AccountBalanceChanged
SettlementCompleted
CustomerLimitExceeded
These events should represent meaningful business concepts, not technical side effects.
The producer owns the event.
The consumers react to it.
But consumers should not need to know how the producer reached that state internally.
Kafka is a powerful technology.
But Kafka is not architecture.
A topic does not make a system loosely coupled.
A queue does not create independence.
An event does not remove responsibility.
Loose coupling comes from designing boundaries, ownership, and protocols that allow systems to change independently.
The transport helps.
The protocol does the work.