You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Here's the deal -- and it's come up twice recently -- as people start pursuing the "modular monolith" approach, they're effectively trying to run multiple applications in the same process. We've accounted for this through the local routing w/ the "Separated" approach, but this scenario doesn't work with Wolverine yet:
Say you're using the transactional inbox on listening endpoints, which includes a check for idempotency that today only uses the message id
An upstream process using Wolverine (or anything else I guess) publishes a message to a Rabbit MQ fanout exchange
The receiving Wolverine application has multiple bindings from that exchange to different Rabbit MQ queues that each have a separate "sticky" message handler. In effect, the receiving Wolverine application gets the exact same message twice, just in different listening endpoints
Because the fanout is happening in Rabbit MQ, Wolverine thinks that it's getting a duplicate message by the message id when the 2nd listener gets the message and rejects it
Possible approaches:
Document that Wolverine doesn't support this and recommend some kind of "splitter" approach that delegates the incoming messages to different "sticky" local queues
Try to do something systematic where Wolverine can read the incoming message id, and systematically transform the message id Guid to some other Guid using the endpoint Uri or name or something.
Have an opt in mode -- and must be opt in -- where the incoming storage keys off a combination of the message id and the receiver Uri
The first is probably just a bad "solution" and might not really solve anything. The 2nd solution would be the lightest touch and require much less change to the Wolverine internals, but I'm not sure how viable it is yet. The 3rd solution sounds like the most robust approach, provides traceability, but of course, requires the most changes to Wolverine internals and would cause quite a bit of permutation hell. At least we have the storage compliance now that might help.
The text was updated successfully, but these errors were encountered:
Here's the deal -- and it's come up twice recently -- as people start pursuing the "modular monolith" approach, they're effectively trying to run multiple applications in the same process. We've accounted for this through the local routing w/ the "Separated" approach, but this scenario doesn't work with Wolverine yet:
Say you're using the transactional inbox on listening endpoints, which includes a check for idempotency that today only uses the message id
Possible approaches:
The first is probably just a bad "solution" and might not really solve anything. The 2nd solution would be the lightest touch and require much less change to the Wolverine internals, but I'm not sure how viable it is yet. The 3rd solution sounds like the most robust approach, provides traceability, but of course, requires the most changes to Wolverine internals and would cause quite a bit of permutation hell. At least we have the storage compliance now that might help.
The text was updated successfully, but these errors were encountered: