// Package clientutil implements a very simple style of JSON RPC. // // Requests and responses are both encoded in JSON, and they should // have the "application/json" Content-Type. // // HTTP response statuses other than 200 indicate an error: in this // case, the response body may contain (in plain text) further details // about the error. Some HTTP status codes are considered temporary // errors (incl. 429 for throttling). The client will retry requests, // if targets are available, until the context expires - so it's quite // important to remember to set a timeout on the context given to the // Call() function! // // The client handles both replicated services and sharded // (partitioned) services. Users of this package that want to support // sharded deployments are supposed to pass a shard ID to every // Call(). At the deployment stage, sharding can be enabled via the // configuration. // // For replicated services, the client will expect the provided // hostname to resolve to one or more IP addresses, in which case it // will pick a random IP address on every new request, while // remembering which addresses have had errors and trying to avoid // them. It will however send an occasional request to the failed // targets, to see if they've come back. // // For sharded services, the client makes simple HTTP requests to the // specific target identified by the shard. It does this by prepending // the shard ID to the backend hostname (so a request to "example.com" // with shard ID "1" becomes a request to "1.example.com"). // // The difference with other JSON-RPC implementations is that we use a // different URI for every method, and we force the usage of // request/response types. This makes it easy for projects to // eventually migrate to GRPC. // package clientutil