Circuit-breaker state, kept where every replica can see it.
A breaker in one JVM's atom protects that JVM. With N replicas a failing service gets N breakers, each of which has to trip on its own, so it still takes N times the load — and when the window elapses, all N probe at once, which is the stampede the breaker was meant to prevent. Keeping the state in the cache port makes it one breaker.
The cache adapter decides how far that goes: Redis shares it across replicas, the in-memory one does not. That is the same trade the rate limiter makes, and it is a property of the adapter rather than of this namespace.
Circuit-breaker state, kept where every replica can see it. A breaker in one JVM's atom protects that JVM. With N replicas a failing service gets N breakers, each of which has to trip on its own, so it still takes N times the load — and when the window elapses, all N probe at once, which is the stampede the breaker was meant to prevent. Keeping the state in the cache port makes it one breaker. The cache adapter decides how far that goes: Redis shares it across replicas, the in-memory one does not. That is the same trade the rate limiter makes, and it is a property of the adapter rather than of this namespace.
Generic remote-port adapter: implement any module protocol over HTTP.
Cross-module calls go through a protocol, so slicing a module into its own
process needs one thing the codebase did not have — an implementation of
that protocol that makes a network call. This builds one for an arbitrary
protocol, so the caller keeps calling (ports/create-checkout-session svc …)
and does not learn that the answer now comes over a socket (BOU-90).
Modelled on libs/external's outbound adapters: clj-http, :throw-exceptions false, errors as data rather than exceptions.
FC/IS: shell. The wire contract is pure and lives in
wagoe.platform.core.rpc.
Generic remote-port adapter: implement any module protocol over HTTP. Cross-module calls go through a protocol, so slicing a module into its own process needs one thing the codebase did not have — an implementation of that protocol that makes a network call. This builds one for an arbitrary protocol, so the caller keeps calling `(ports/create-checkout-session svc …)` and does not learn that the answer now comes over a socket (BOU-90). Modelled on libs/external's outbound adapters: clj-http, `:throw-exceptions false`, errors as data rather than exceptions. FC/IS: shell. The wire contract is pure and lives in `wagoe.platform.core.rpc`.
Expose a module's protocol over HTTP, so another process can call it.
The counterpart to …rpc.client: that turns protocol calls into requests,
this turns requests back into protocol calls against the local
implementation. Together they are what lets a module run as its own service
without its callers changing (BOU-90).
FC/IS: shell. The envelope contract is pure and lives in
wagoe.platform.core.rpc.
Expose a module's protocol over HTTP, so another process can call it. The counterpart to `…rpc.client`: that turns protocol calls into requests, this turns requests back into protocol calls against the local implementation. Together they are what lets a module run as its own service without its callers changing (BOU-90). FC/IS: shell. The envelope contract is pure and lives in `wagoe.platform.core.rpc`.
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |