Sharding is for DB-admins not developers. When I see something like "SELECT ... FROM student WHERE shard_key = ..." I cringe.
I can instead use my userid as my shard-key and just query the shard holding the data for that user which will be way faster.
The question is can middleware really solve the problem of having to re-engineer when you reach the limits of your current stack?
No cross-server transactions.