-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.html
173 lines (118 loc) · 8.96 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<!DOCTYPE html>
<html>
<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>Kandoo</title>
<meta name="description" content="An effort to simplify distributed programming.">
<meta name="keywords" context="distributed systems,openflow,SDN,go,golang">
<link rel="canonical" href="http://kandoo.github.io/">
<link rel="alternate" type="application/rss+xml" title="Kandoo" href="http://kandoo.github.io/feed.xml" />
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:400' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Roboto+Condensed:400' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/gh-fork-ribbon.css" />
<!--[if lt IE 9]>
<link rel="stylesheet" href="/css/gh-fork-ribbon.ie.css" />
<![endif]-->
</head>
<body>
<header class="site-header">
<div class="wrapper">
<a class="site-title" href="/">Kandoo</a>
<a class="site-github-icon" href="https://github.com/kandoo">
<span class="icon icon--github">
<svg viewBox="0 0 16 16">
<path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
</svg>
</span>
</a>
<nav class="site-nav">
<a href="#" class="menu-icon">
<svg viewBox="0 0 18 15">
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</a>
<div class="trigger">
<a class="page-link" href="/beehive/">Beehive</a>
<a class="page-link" href="/netctrl/">Network Controller</a>
<a class="page-link" href="/taskq/">TaskQ</a>
<a class="page-link" href="/about/">About</a>
</div>
</nav>
</div>
</header>
<div class="page-content">
<div class="wrapper">
<h1 id="introduction">Introduction</h1>
<p><a href="/beehive">Beehive</a> is a genetic distributed programming framework that:</p>
<ul>
<li>can seamlessly <em>scale</em>.</li>
<li>can <em>efficiently</em> handle the workload.</li>
<li>can <em>tolerate faults</em> with no developer intervention.</li>
<li>is as <em>simple</em> to program as a centralized system. </li>
<li>can <em>self-optimize</em> according to the workload.</li>
</ul>
<p><center>
<img src="/img/beehive.svg" width="40%">
</center></p>
<h3 id="learn-more"><a href="/beehive">Learn more</a></h3>
<h1 id="motivation">Motivation</h1>
<p>To implement a distributed application, one needs to implement common
boilerplates, such as seralization, placement, synchronization, and concurrency,
in addition to the core of the application logic. These boilerplates are
difficult to implement, hard to get right, and often dwarf the core of the
distributed application.</p>
<p>Our goal is to hide these boilerplates to faciliate distributed programming.
This is quite challenging, since our framework must be generic enough to
support a wide-range of distributed programs and efficient enough to be
practical.</p>
<p><center>
<img src="/img/motivation.svg" width="60%">
</center></p>
<h3 id="learn-more"><a href="/beehive">Learn more</a></h3>
<h1 id="example">Example</h1>
<p>This is a sample key-value store that can put, get, and delete keys and values:</p>
<div class="highlight"><pre><code class="language-go" data-lang="go"><span class="kd">type</span> <span class="nx">KVStore</span> <span class="kd">struct</span> <span class="p">{}</span>
<span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><span class="nx">KVStore</span><span class="p">)</span> <span class="nx">Rcv</span><span class="p">(</span><span class="nx">msg</span> <span class="nx">Msg</span><span class="p">,</span> <span class="nx">ctx</span> <span class="nx">RcvContext</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
<span class="k">switch</span> <span class="nx">data</span> <span class="o">:=</span> <span class="nx">msg</span><span class="p">.</span><span class="nx">Data</span><span class="p">().(</span><span class="kd">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="nx">Put</span><span class="p">:</span>
<span class="k">return</span> <span class="nx">ctx</span><span class="p">.</span><span class="nx">Dict</span><span class="p">(</span><span class="nx">dict</span><span class="p">).</span><span class="nx">Put</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">Key</span><span class="p">,</span> <span class="nx">data</span><span class="p">.</span><span class="nx">Val</span><span class="p">)</span>
<span class="k">case</span> <span class="nx">Get</span><span class="p">:</span>
<span class="nx">v</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">ctx</span><span class="p">.</span><span class="nx">Dict</span><span class="p">(</span><span class="nx">dict</span><span class="p">).</span><span class="nx">Get</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">data</span><span class="p">))</span>
<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">errKeyNotFound</span>
<span class="p">}</span>
<span class="nx">ctx</span><span class="p">.</span><span class="nx">Reply</span><span class="p">(</span><span class="nx">msg</span><span class="p">,</span> <span class="nx">Result</span><span class="p">{</span><span class="nx">Key</span><span class="p">:</span> <span class="nb">string</span><span class="p">(</span><span class="nx">data</span><span class="p">),</span> <span class="nx">Val</span><span class="p">:</span> <span class="nx">v</span><span class="p">.(</span><span class="kt">string</span><span class="p">)})</span>
<span class="k">return</span> <span class="kc">nil</span>
<span class="k">case</span> <span class="nx">Del</span><span class="p">:</span>
<span class="k">return</span> <span class="nx">ctx</span><span class="p">.</span><span class="nx">Dict</span><span class="p">(</span><span class="nx">dict</span><span class="p">).</span><span class="nx">Del</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">data</span><span class="p">))</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">errInvalid</span>
<span class="p">}</span>
</code></pre></div>
<p>Simple, eh?</p>
<p>This application is implemented just like a centralized key-value store, yet is
distributed in the same way that memcached shards its keyspace. It can handle
more than 100k Puts per bucket per second with 5x replication.</p>
<h3 id="learn-more"><a href="/beehive">Learn more</a></h3>
</div>
</div>
<div class="github-fork-ribbon-wrapper left-bottom">
<div class="github-fork-ribbon">
<a href="https://github.com/kandoo">Kandoo on GitHub</a>
</div>
</div>
<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','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-65205825-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>