Write Proxy Client API ====================== `Write Proxy` is a 'stateless' service on managing the ownerships of writers of log streams. It is used to accept to `fan-in` writes from different publishers. Build Client ------------ The first thing of using `Write Proxy` service is to build the write proxy client. The endpoint of a `Write Proxy` service is typically identified by `Finagle Name`_. Name strings must be supplied when constructing a `Write Proxy` client. .. _Finagle Name: http://twitter.github.io/finagle/guide/Names.html :: // 1. Create a Finagle client builder. It would be used for building connection to write proxies. ClientBuilder clientBuilder = ClientBuilder.get() .hostConnectionLimit(1) .hostConnectionCoresize(1) .tcpConnectTimeout(Duration$.MODULE$.fromMilliseconds(200)) .connectTimeout(Duration$.MODULE$.fromMilliseconds(200)) .requestTimeout(Duration$.MODULE$.fromSeconds(2)); // 2. Choose a client id to identify the client. ClientId clientId = ClientId$.MODULE$.apply("test"); String finagleNameStr = "inet!127.0.0.1:8000"; // 3. Create the write proxy client builder DistributedLogClientBuilder builder = DistributedLogClientBuilder.newBuilder() .name("test-writer") .clientId(clientId) .clientBuilder(clientBuilder) .statsReceiver(statsReceiver) .finagleNameStr(finagleNameStr); // 4. Build the client DistributedLogClient client = builder.build(); Write Records ------------- Writing records to log streams via `Write Proxy` is much simpler than using the core library. The transaction id will be automatically assigned with `timestamp` by write proxies. The `timestamp` is guaranteed to be non-decreasing, which it could be treated as `physical time` within a log stream, and be used for implementing features like `TTL` in a strong consistent database. :: DistributedLogClient client = ...; // Write a record to a stream String streamName = "test-stream"; byte[] data = ...; Future writeFuture = client.write(streamName, ByteBuffer.wrap(data)); Await.result(writeFuture); Truncate Streams ---------------- Client could issue truncation requests (via `#truncate(String, DLSN)`) to write proxies to truncate a log stream up to a given position. :: DistributedLogClient client = ...; // Truncate a stream to DLSN String streamName = "test-stream"; DLSN truncationDLSN = ...; Future truncateFuture = client.truncate(streamName, truncationDLSN); Await.result(truncateFuture);