A service extracted for organisational reasons but reading and writing another service’s tables has all the costs of a network hop and none of the independence. It cannot deploy alone, because a schema change breaks it.
// this is not a service boundary
final class PricingService
{
public function priceFor(int $productId): Money
{
// reads the catalogue service's tables directly
return $this->db->selectOne('SELECT price FROM products WHERE id = ?', [$productId]);
}
}
The test is whether it can be deployed, scaled and rolled back without coordinating with anything else. If not, it is a library that pays for HTTP. Either give it data it owns — even if that means a copy kept current by events — or leave it in the process it belongs to, where a function call is honest about the coupling.