None of the above is free, and Furrow finds out roughly what it costs in the first month after the split, mostly in this order:
HarvestLot.reserve(lot_id, quantity) used to return in under a millisecond because it never left the process. Once Harvest is its own service, that same lookup is an HTTP round trip that costs fifty milliseconds on an ordinary day — and on a bad one, during the Wednesday-night upload rush, it stalls past its own timeout, or Harvest simply isn't reachable for a few seconds mid-deploy. A piece of code that used to just work, every time, now has to carry its own retry policy, its own timeout, and a real answer to the question "what does checkout actually do when Harvest goes quiet."Subscriptions, Harvest, and Billing directly. Actually exercising how two of them behave together now means either spinning both up side by side, which is slow, or building a convincing stand-in for one — and a defect that only appears when two particular service releases meet in a particular way is a whole class of problem the single-process monolith never had room to produce in the first place.Common mistake: hearing this list, deciding it sounds manageable, and splitting anyway before any of these problems is actually being felt. Furrow's Fulfillment lead pushed to split Harvest out six months before the team actually did it, on the theory that it would be "cleaner." It would have been — and it also would have meant carrying every cost on this list for a wall the team hadn't hit yet. The team that waited for a real Wednesday-night database pileup to force the question got the same architecture with a much clearer, much more defensible reason for every piece of it.