artillery/docs/building-blocks/primitives.html

57 lines
17 KiB
HTML

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Primitives | Artillery</title>
<meta name="description" content="Cluster management &amp; Distributed data protocol">
<meta name="generator" content="VuePress 1.3.1">
<link rel="preload" href="/assets/css/0.styles.40eef163.css" as="style"><link rel="preload" href="/assets/js/app.a6f18760.js" as="script"><link rel="preload" href="/assets/js/3.294f849a.js" as="script"><link rel="preload" href="/assets/js/7.9042a811.js" as="script"><link rel="prefetch" href="/assets/js/1.2f71ac0b.js"><link rel="prefetch" href="/assets/js/10.e2c4e6dd.js"><link rel="prefetch" href="/assets/js/4.b92d7a52.js"><link rel="prefetch" href="/assets/js/5.b60eac8b.js"><link rel="prefetch" href="/assets/js/6.d6285a75.js"><link rel="prefetch" href="/assets/js/8.f2fbc9e9.js"><link rel="prefetch" href="/assets/js/9.7cb4df56.js">
<link rel="stylesheet" href="/assets/css/0.styles.40eef163.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme__container sidebar-open"><div class="menu__container"><a style="display:;"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABgCAQAAABspPI2AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAA6mAAAOpgAYTJ3nYAAAAHdElNRQfkAg4ENwU8eisAAAABc0lEQVR42u3csUoDQRSF4bMbIZAQiIVZEJtUYmchiM8lWPgAFoLv4qPYiVUaETaNgZBAiiQWFtk5kC0izkDm/7qZheXuKZYZ5jISAByuCEaVxupqm7qoqN+/0kT1buIkeHyne420SV1lRKWmetHrvkCGutRZ6hojO9WwOSyDh1utU9cX3Tr8RZSHvudYEYghEEMghkAMgRgCMWEgRYYBleH2JVypLvTlC5UjV6jWIpxoGutavcwCWepNk9RlAAAAAAAAAACADITnMhe6Ujd1SZGt9K7P3TA8ubvVg6rMmu5qPe8PZKBxdk13PQ2aQ5ruaLprRyCGQAyBGAIxBGIIxHjTXSd1QdF12pru5ppomd3Sfd6cYHNnmzsAAAAAAAAAAIB/wmUIdhlCeHJ3o0dVmQVS62l/IH2da5S6xsg66jeH3nSX07nurw1Nd60IxBCIIRBDIIZADIEYmu5am+5m+tB3VouzUlPNmhNcY27XmAPAX/wAGqNAdI7Q/bQAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTktMTItMjhUMDk6MzI6MDArMDA6MDB4bJPkAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE5LTAxLTA4VDIwOjM1OjAxKzAwOjAwOWzY+AAAACB0RVh0c29mdHdhcmUAaHR0cHM6Ly9pbWFnZW1hZ2ljay5vcme8zx2dAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OkhlaWdodAAxMDR4/G8pAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADE0OIbXtlsAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTU0Njk3OTcwMUZ3nCcAAAAQdEVYdFRodW1iOjpTaXplADUyMkKv6CLIAAAAWnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vZGF0YS93d3dyb290L3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9maWxlcy8xMjIvMTIyMzA3Ny5wbmeHSs+NAAAAAElFTkSuQmCC" style="display:;"> <img src="data:image/png;base64,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" style="display:none;"></a></div> <div class="row"><div class="col-md-3 col-lg-2 sidebar__container" style="display:none;"><div class="sidebar"><!----><div class="group"><div class="group__title">home</div> <div class="group__body"><div class="group__category category"><div class="category__label"><a href="/" class="sidebar-link router-link-active">Homepage</a></div></div> </div></div><div class="group"><div class="group__title">getting-started</div> <div class="group__body"><!----> <div name="/getting-started/getting-started.html" class="group__category category"><div class="category__label"><a href="/getting-started/getting-started.html" class="sidebar-link">Getting Started</a></div> <div class="category__headers"><div class="category__header-item"><a href="/getting-started/getting-started.html#basics" class="sidebar-link">Basics</a></div></div><div class="category__headers"><div class="category__header-item"><a href="/getting-started/getting-started.html#distributed-data" class="sidebar-link">Distributed Data</a></div></div><div class="category__headers"><div class="category__header-item"><a href="/getting-started/getting-started.html#hierarchy-management" class="sidebar-link">Hierarchy Management</a></div></div></div></div></div><div class="group"><div class="group__title">building-blocks</div> <div class="group__body"><!----> <div name="/building-blocks/primitives.html" class="group__category category category--selected category--active"><div class="category__label"><a href="/building-blocks/primitives.html" class="sidebar-link router-link-exact-active router-link-active">Primitives</a></div> <div class="category__headers"><div class="category__header-item"><a href="/building-blocks/primitives.html#service-discovery-primitives" class="sidebar-link">Service Discovery Primitives</a></div></div><div class="category__headers"><div class="category__header-item"><a href="/building-blocks/primitives.html#udp-anycast" class="sidebar-link">Udp Anycast</a></div></div></div></div></div><div class="group"><div class="group__title">examples</div> <div class="group__body"><!----> <div name="/examples/cluster-examples.html" class="group__category category"><div class="category__label"><a href="/examples/cluster-examples.html" class="sidebar-link">Local Examples</a></div> <div class="category__headers"><div class="category__header-item"><a href="/examples/cluster-examples.html#cluster-examples" class="sidebar-link">Cluster Examples</a></div></div><div class="category__headers"><div class="category__header-item"><a href="/examples/cluster-examples.html#launching-a-local-ap-cluster" class="sidebar-link">Launching A Local Ap Cluster</a></div></div></div></div></div></div></div> <div class="col-md-9 col-lg-10 content__container" style="display:;"><div class="page__container"><div custom="" class="content__default"><div class="content-block"><div class="content-block__heading"></div> <div class="content-block__body"><div class="content-block__cont"><h1 id="primitives"><a href="#primitives" class="header-anchor">#</a> Primitives</h1></div> <div class="content-block__examples"></div></div></div> <div class="content-block"><div class="content-block__heading"></div> <div class="content-block__body"><div class="content-block__cont"><p>Artillery Core consists of various primitives. We will start with Service Discovery primitives and pave out way to Cluster primitives.</p></div> <div class="content-block__examples"></div></div></div> <div class="content-block"><div class="content-block__heading"></div> <div class="content-block__body"><div class="content-block__cont"><h2 id="service-discovery-primitives"><a href="#service-discovery-primitives" class="header-anchor">#</a> Service Discovery Primitives</h2> <p>For distributed operation we need to have a service discovery to find out who is operating/serving which services and service capabilities.</p> <p>Our design consists of various service discovery techniques.</p></div> <div class="content-block__examples"></div></div></div> <div class="content-block"><div class="content-block__heading"></div> <div class="content-block__body"><div class="content-block__cont"><h2 id="udp-anycast"><a href="#udp-anycast" class="header-anchor">#</a> UDP Anycast</h2> <p>We have UDP anycast which allows the devices in the same network to nag each other continuously with a specific set of service requests to form a cluster initiation.</p> <p><strong>NOTE:</strong> Convergance of the UDP anycast might take longer time than the other zeroconf approaches.</p> <div type="example" class="examples"><div class="language-rust extra-class"><pre class="language-rust"><code><span class="token attribute attr-name">#[derive(Serialize, Deserialize, Debug, Clone, Ord, PartialOrd, PartialEq)]</span>
<span class="token keyword">struct</span> ExampleSDReply <span class="token punctuation">{</span>
ip<span class="token punctuation">:</span> String<span class="token punctuation">,</span>
port<span class="token punctuation">:</span> u16<span class="token punctuation">,</span>
<span class="token punctuation">}</span>
<span class="token keyword">let</span> epidemic_sd_config <span class="token operator">=</span> ExampleSDReply <span class="token punctuation">{</span>
ip<span class="token punctuation">:</span> <span class="token string">&quot;127.0.0.1&quot;</span><span class="token punctuation">.</span><span class="token function">into</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
port<span class="token punctuation">:</span> <span class="token number">1337</span><span class="token punctuation">,</span> <span class="token comment">// Cluster Formation Port of this instance</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> reply <span class="token operator">=</span> ServiceDiscoveryReply <span class="token punctuation">{</span>
serialized_data<span class="token punctuation">:</span> serde_json<span class="token punctuation">::</span><span class="token function">to_string</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>epidemic_sd_config<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// Initialize receiver channels</span>
<span class="token keyword">let</span> <span class="token punctuation">(</span>tx<span class="token punctuation">,</span> discoveries<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token function">channel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Register seeker endpoint</span>
sd<span class="token punctuation">.</span><span class="token function">register_seeker</span><span class="token punctuation">(</span>tx<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Sometimes you seek for nodes,</span>
<span class="token comment">// sometimes you need to be a listener to respond them.</span>
<span class="token keyword">if</span> <span class="token keyword">let</span> <span class="token function">Some</span><span class="token punctuation">(</span>_<span class="token punctuation">)</span> <span class="token operator">=</span> seeker <span class="token punctuation">{</span>
sd<span class="token punctuation">.</span><span class="token function">seek_peers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
sd<span class="token punctuation">.</span><span class="token function">set_listen_for_peers</span><span class="token punctuation">(</span><span class="token keyword">true</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">for</span> discovery <span class="token keyword">in</span> discoveries<span class="token punctuation">.</span><span class="token function">iter</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">let</span> discovery<span class="token punctuation">:</span> ExampleSDReply <span class="token operator">=</span>
serde_json<span class="token punctuation">::</span><span class="token function">from_str</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>discovery<span class="token punctuation">.</span>serialized_data<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unwrap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> discovery<span class="token punctuation">.</span>port <span class="token operator">!=</span> epidemic_sd_config<span class="token punctuation">.</span>port <span class="token punctuation">{</span>
<span class="token function">debug!</span><span class="token punctuation">(</span><span class="token string">&quot;Seed node address came&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">let</span> seed_node <span class="token operator">=</span> <span class="token function">format!</span><span class="token punctuation">(</span><span class="token string">&quot;{}:{}&quot;</span><span class="token punctuation">,</span> discovery<span class="token punctuation">.</span>ip<span class="token punctuation">,</span> discovery<span class="token punctuation">.</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// We have received a discovery request.</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre></div></div></div> <div class="content-block__examples"></div></div></div></div> <div class="content__footer-container"><div class="content__footer"><!----> <!----></div></div></div></div></div></div><div class="global-ui"></div></div>
<script src="/assets/js/app.a6f18760.js" defer></script><script src="/assets/js/3.294f849a.js" defer></script><script src="/assets/js/7.9042a811.js" defer></script>
</body>
</html>