In general client side routing has the obvious advantage of one less
hop and hence better for applications that are latency sensitive.
But thanks much for initiating this discussion. Personally I prefer
server side routing, here's why :
* Lightweight clients make code / service evolution easy. We can keep
changing things on the server side (maybe even drastic changes)
without affecting old client portability.
* Less config to manage on the client side. Currently we see that
tuning the client is pretty cumbersome and very iterative. Again
config should be tunable (hence the name) but not this frequently.
* Topological changes become completely transparent to the client (the
requirement to bounce / re-bootstrap the client is removed)
* Super simple failure detection on the client side (currently failure
detection operation is critical on the client side).
* Connections optimization (we might not need to open so many
connections - currently it seems unbounded. In fact, we're discussing
whether to remove the #connections config completely from the client
side).
Of course, server side routing has problems / issues that need to be
handled
* Extra hop
* Intra cluster communication must be correctly done (batching
requests, connection management)
* currently DR (Disaster Recovery: i.e. writing to another zone) is
done entirely by the client. This must now be handled by the server).
* Extra memory usage on the coordinator - It not only has the BDB
cache overhead but also needs to keep track of the client requests.
What do you guys think ?