The first important drawback is that using a broker adds load to the service that sends the message.
Imagine a situation: the broker is unavailable for some time, and no new messages are added to the queue during that period.
The broker itself does not know what and which system tried to send to it
Accordingly, the source system has to check which message was last in the queue and resend everything that accumulated while it was unavailable.
This logic puts extra load on the system, so there is a temptation to drop it.
But in that case, undelivered messages will sooner or later affect critical business processes.
The second drawback is that the target system becomes overloaded with unnecessary data.
The broker cannot choose which messages to pass on - it delivers the entire queue. For example, all assortment data or all stock data from the WMS.
Now imagine that your system does not need the full volume of certain data.
For example, the 1C instance running in your Ufa branch does not need customer and order data from all 20 of your branches.
But a system cannot "ask" the broker for filtered data.
It has to receive through integrations everything that the CRM and OMS (Order Management System) send, store it in its own databases, and use internal logic to separate the 5% of needed data from the 95% of excess data.
The third major drawback is contract hardening.
All participants in the process must agree on the format in which messages will be transmitted.
This removes flexibility and increases the labor costs of maintaining a single format.
A less obvious drawback is the lack of convenient and/or detailed history. For example, the Kafka broker can store historical data, but if something breaks, you will have to reload the entire message queue from the first historical record to the last.
It is impossible to run any queries on current statuses.
The problem is most acute when you need to exchange history with another team or perform a migration - extracting that information will be difficult.
This drawback brings another major one with it: the inability to perform proper reconciliation.
Systems load both old and new messages from the broker without distinguishing between them.
During reprocessing, a newer message may end up overwritten: for example, an order gets the status "created" instead of "delivered".
Such situations can be avoided, but that requires adding an intermediate reconciliation service or building reconciliation logic into the receiving system.
This also affects speed.
On the one hand, systems quickly exchange the full stream of messages, but on the other, it is hard to determine what is current and eliminate duplicates.
That is why reading data is much slower.
Using a broker can lead to proxying just as easily as direct integrations can.
To keep every system in the landscape from receiving redundant data, it is "easier" to route it through one system, normalize it there, and pass the normalized data on. We described above where this leads.
There is also a hidden drawback of a managerial nature. Every system has its own product owner.
But who owns the broker and the integrations tied to it?
Most often, it is the technical department that takes on this role.
For the other departments, this is an obvious plus (less responsibility), but in that case none of the stakeholders will feel they have control over the infrastructure.