blob: bd9c085fa5fa05ac714dcd60872318149e8645d2 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Apache DistributedLog</title>
<meta name="description" content="Apache DistributedLog is an high performance replicated log.
">
<link rel="stylesheet" href="/docs/latest/styles/site.css">
<link rel="stylesheet" href="/docs/latest/css/theme.css">
<!-- JQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script src="/docs/latest/js/bootstrap.min.js"></script>
<link rel="canonical" href="http://bookkeeper.apache.org/distributedlog/docs/latest/user_guide/api/proxy.html" data-proofer-ignore>
<link rel="alternate" type="application/rss+xml" title="Apache DistributedLog" href="http://bookkeeper.apache.org/distributedlog/docs/latest/feed.xml">
<!-- Font Awesome -->
<script src="//cdnjs.cloudflare.com/ajax/libs/anchor-js/3.2.0/anchor.min.js"></script>
<!-- Google Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-83870961-1', 'auto');
ga('send', 'pageview');
</script>
<!-- End Google Analytics -->
<link rel="shortcut icon" type="image/x-icon" href="/images/favicon.ico">
</head>
<body role="document">
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a href="/" class="navbar-brand" >
<img alt="Brand" style="height: 28px" src="/docs/latest/images/distributedlog_logo_navbar.png">
</a>
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<!-- Overview -->
<li><a href="/docs/latest/">V0.5.0</a></li>
<!-- Concepts -->
<li><a href="/docs/latest/basics/introduction">Concepts</a></li>
<!-- Quick Start -->
<li>
<a href="/docs/latest/start" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Start<span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="/docs/latest/start/building.html">
Build DistributedLog from Source
</a>
</li>
<li>
<a href="/docs/latest/start/download.html">
Download Releases
</a>
</li>
<li role="separator" class="divider"></li>
<li class="dropdown-header"><strong>Quickstart</strong></li>
<li>
<a href="/docs/latest/start/quickstart.html">
Setup & Run Example
</a>
</li>
<li>
<a href="/docs/latest/tutorials/basic-1.html">
API - Write Records (via core library)
</a>
</li>
<li>
<a href="/docs/latest/tutorials/basic-2.html">
API - Write Records (via write proxy)
</a>
</li>
<li>
<a href="/docs/latest/tutorials/basic-5.html">
API - Read Records
</a>
</li>
<li role="separator" class="divider"></li>
<li class="dropdown-header"><strong>Deployment</strong></li>
<li>
<a href="/docs/latest/deployment/cluster.html">
Cluster Setup
</a>
</li>
<li>
<a href="/docs/latest/deployment/global-cluster.html">
Global Cluster Setup
</a>
</li>
<li>
<a href="/docs/latest/deployment/docker.html">
Docker
</a>
</li>
</ul>
</li>
<!-- API -->
<li>
<a href="/docs/latest/start" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">API<span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="/docs/latest/api/java">Java</a></li>
</ul>
</li>
<!-- User Guide -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">User Guide<span class="caret"></span></a>
<ul class="dropdown-menu">
<li>
<a href="/docs/latest/basics/introduction.html">
Introduction
</a>
</li>
<li>
<a href="/docs/latest/user_guide/considerations/main.html">
Considerations
</a>
</li>
<li>
<a href="/docs/latest/user_guide/architecture/main.html">
Architecture
</a>
</li>
<li>
<a href="/docs/latest/user_guide/api/main.html">
API
</a>
</li>
<li>
<a href="/docs/latest/user_guide/configuration/main.html">
Configuration
</a>
</li>
<li>
<a href="/docs/latest/user_guide/design/main.html">
Detail Design
</a>
</li>
<li>
<a href="/docs/latest/user_guide/globalreplicatedlog/main.html">
Global Replicated Log
</a>
</li>
<li>
<a href="/docs/latest/user_guide/implementation/main.html">
Implementation
</a>
</li>
<li>
<a href="/docs/latest/user_guide/references/main.html">
References
</a>
</li>
</ul>
</li>
<!-- Admin Guide -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Admin Guide<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="/docs/latest/deployment/cluster">Cluster Setup</a></li>
<li>
<a href="/docs/latest/admin_guide/operations.html">
Operations
</a>
</li>
<li>
<a href="/docs/latest/admin_guide/loadtest.html">
Load Test
</a>
</li>
<li>
<a href="/docs/latest/admin_guide/performance.html">
Performance Tuning
</a>
</li>
<li>
<a href="/docs/latest/admin_guide/hardware.html">
Hardware
</a>
</li>
<li>
<a href="/docs/latest/admin_guide/monitoring.html">
Monitoring
</a>
</li>
<li>
<a href="/docs/latest/admin_guide/zookeeper.html">
ZooKeeper
</a>
</li>
<li>
<a href="/docs/latest/admin_guide/bookkeeper.html">
BookKeeper
</a>
</li>
</ul>
</li>
<!-- Tutorials -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Tutorials<span class="caret"></span></a>
<ul class="dropdown-menu">
<li class="dropdown-header"><strong>Basic</strong></li>
<li><a href="/docs/latest/tutorials/basic-1">Write Records (via Core Library)</a></li>
<li><a href="/docs/latest/tutorials/basic-2">Write Records (via Write Proxy)</a></li>
<li><a href="/docs/latest/tutorials/basic-3">Write Records to multiple streams</a></li>
<li><a href="/docs/latest/tutorials/basic-4">Atomic Write Records</a></li>
<li><a href="/docs/latest/tutorials/basic-5">Tailing Read Records</a></li>
<li><a href="/docs/latest/tutorials/basic-6">Rewind Read Records</a></li>
<li role="separator" class="divider"></li>
<li class="dropdown-header"><strong>Messaging</strong></li>
<li>
<a href="/docs/latest/tutorials/messaging-1.html">
Write records to partitioned streams
</a>
</li>
<li>
<a href="/docs/latest/tutorials/messaging-2.html">
Write records to multiple streams (load balancer)
</a>
</li>
<li>
<a href="/docs/latest/tutorials/messaging-3.html">
At-least-once Processing
</a>
</li>
<li>
<a href="/docs/latest/tutorials/messaging-4.html">
Exact-Once Processing
</a>
</li>
<li>
<a href="/docs/latest/tutorials/messaging-5.html">
Implement a kafka-like pub/sub system
</a>
</li>
<li role="separator" class="divider"></li>
<li class="dropdown-header"><strong>Replicated State Machines</strong></li>
<li>
<a href="/docs/latest/tutorials/replicatedstatemachines.html">
Build replicated state machines
</a>
</li>
<li role="separator" class="divider"></li>
<li class="dropdown-header"><strong>Analytics</strong></li>
<li><a href="/docs/latest/tutorials/analytics-mapreduce">Process log streams using MapReduce</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<link rel="stylesheet" href="">
<div class="container" role="main">
<div class="row">
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<div class="row">
<!-- Sub Navigation -->
<div class="col-sm-3">
<ul id="sub-nav">
<li><a href="/docs/latest/user_guide/main.html" class="">User Guide</a>
<ul>
<li>
<a href="/docs/latest/basics/introduction.html" class="">
Introduction
</a>
<ul>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/considerations/main.html" class="">
Considerations
</a>
<ul>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/architecture/main.html" class="">
Architecture
</a>
<ul>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/api/main.html" class="">
API
</a>
<ul>
<li>
<a href="/docs/latest/user_guide/api/core.html" class="active">
Core Library API
</a>
</li>
<li>
<a href="/docs/latest/user_guide/api/proxy.html" class="active">
Proxy Client API
</a>
</li>
<li>
<a href="/docs/latest/user_guide/api/practice.html" class="active">
Best Practise
</a>
</li>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/configuration/main.html" class="">
Configuration
</a>
<ul>
<li>
<a href="/docs/latest/user_guide/configuration/core.html" class="active">
Core Library Configuration
</a>
</li>
<li>
<a href="/docs/latest/user_guide/configuration/proxy.html" class="active">
Write Proxy Configuration
</a>
</li>
<li>
<a href="/docs/latest/user_guide/configuration/client.html" class="active">
Client Configuration
</a>
</li>
<li>
<a href="/docs/latest/user_guide/configuration/perlog.html" class="active">
Per Stream Configuration
</a>
</li>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/design/main.html" class="">
Detail Design
</a>
<ul>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/globalreplicatedlog/main.html" class="">
Global Replicated Log
</a>
<ul>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/implementation/main.html" class="">
Implementation
</a>
<ul>
<li>
<a href="/docs/latest/user_guide/implementation/storage.html" class="active">
Storage
</a>
</li>
</ul>
</li>
<li>
<a href="/docs/latest/user_guide/references/main.html" class="">
References
</a>
<ul>
<li>
<a href="/docs/latest/user_guide/references/metrics.html" class="active">
Metrics
</a>
</li>
<li>
<a href="/docs/latest/user_guide/references/features.html" class="active">
Available Features
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<!-- Main -->
<div class="col-sm-9">
<!-- Top anchor -->
<a href="#top"></a>
<!-- Breadcrumbs above the main heading -->
<ol class="breadcrumb">
<li><a href="/docs/latest/user_guide/main.html">User Guide</a></li>
<li><a href="/docs/latest/user_guide/api/main.html">API</a></li>
<li class="active">Proxy Client API</li>
</ol>
<div class="text">
<!-- Content -->
<div class="contents topic" id="write-proxy-client-api">
<p class="topic-title first">Write Proxy Client API</p>
<ul class="simple">
<li><a class="reference internal" href="#id1" id="id2">Write Proxy Client API</a><ul>
<li><a class="reference internal" href="#build-client" id="id3">Build Client</a></li>
<li><a class="reference internal" href="#write-records" id="id4">Write Records</a></li>
<li><a class="reference internal" href="#truncate-streams" id="id5">Truncate Streams</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id2">Write Proxy Client API</a></h2>
<p><cite>Write Proxy</cite> is a 'stateless' service on managing the ownerships of writers of log streams. It is used to
accept to <cite>fan-in</cite> writes from different publishers.</p>
<div class="section" id="build-client">
<h3><a class="toc-backref" href="#id3">Build Client</a></h3>
<p>The first thing of using <cite>Write Proxy</cite> service is to build the write proxy client. The endpoint of a <cite>Write Proxy</cite> service
is typically identified by <a class="reference external" href="http://twitter.github.io/finagle/guide/Names.html">Finagle Name</a>. Name strings must be supplied when constructing a <cite>Write Proxy</cite> client.</p>
<pre class="literal-block">
// 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(&quot;test&quot;);
String finagleNameStr = &quot;inet!127.0.0.1:8000&quot;;
// 3. Create the write proxy client builder
DistributedLogClientBuilder builder = DistributedLogClientBuilder.newBuilder()
.name(&quot;test-writer&quot;)
.clientId(clientId)
.clientBuilder(clientBuilder)
.statsReceiver(statsReceiver)
.finagleNameStr(finagleNameStr);
// 4. Build the client
DistributedLogClient client = builder.build();
</pre>
</div>
<div class="section" id="write-records">
<h3><a class="toc-backref" href="#id4">Write Records</a></h3>
<p>Writing records to log streams via <cite>Write Proxy</cite> is much simpler than using the core library. The transaction id
will be automatically assigned with <cite>timestamp</cite> by write proxies. The <cite>timestamp</cite> is guaranteed to be non-decreasing, which it
could be treated as <cite>physical time</cite> within a log stream, and be used for implementing features like <cite>TTL</cite> in a strong consistent
database.</p>
<pre class="literal-block">
DistributedLogClient client = ...;
// Write a record to a stream
String streamName = &quot;test-stream&quot;;
byte[] data = ...;
Future&lt;DLSN&gt; writeFuture = client.write(streamName, ByteBuffer.wrap(data));
Await.result(writeFuture);
</pre>
</div>
<div class="section" id="truncate-streams">
<h3><a class="toc-backref" href="#id5">Truncate Streams</a></h3>
<p>Client could issue truncation requests (via <cite>#truncate(String, DLSN)</cite>) to write proxies to truncate a log stream up to a given
position.</p>
<pre class="literal-block">
DistributedLogClient client = ...;
// Truncate a stream to DLSN
String streamName = &quot;test-stream&quot;;
DLSN truncationDLSN = ...;
Future&lt;DLSN&gt; truncateFuture = client.truncate(streamName, truncationDLSN);
Await.result(truncateFuture);
</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-xs-12">
<footer>
<p class="text-center">&copy; Copyright 2016
<a href="http://www.apache.org">The Apache Software Foundation.</a> All Rights Reserved.
</p>
<p class="text-center">
<a href="/docs/latest/feed.xml">RSS Feed</a>
</p>
</footer>
</div>
</div>
<!-- container div end -->
</div>
<script>
(function () {
'use strict';
anchors.options.placement = 'right';
anchors.add();
})();
</script>
</body>
</html>