Merge pull request #17 from bastion-rs/move-to-vuepress

Documentation and moving to vuepress
This commit is contained in:
Mahmut Bulut 2020-03-01 01:14:42 +01:00 committed by GitHub
commit 41ce0e1be7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 401 additions and 86 deletions

View File

@ -1,3 +1,13 @@
<!-- --- -->
<!-- home: true -->
<!-- title: Artillery -->
<!-- description: Cluster management & Distributed data protocol -->
<!-- actionText: Getting Started -->
<!-- actionLink: /#/docs -->
<!-- footer: Footer -->
<!-- --- -->
<div align="center">
<img src="https://raw.githubusercontent.com/bastion-rs/artillery/master/img/artillery_cropped.png" width="512" height="512"><br>
</div>
@ -6,30 +16,3 @@
<h1 align="center">Artillery: Cluster management & Distributed data protocol</h1>
It contains the modules below:
* `artillery-ddata`: Used for distributed data replication
* `artillery-core`: Contains:
* `cluster`: Prepared self-healing cluster structures
* `epidemic`: Infection style clustering
* `service_discovery`: Service discovery types
* `mdns`: MDNS based service discovery
* `udp_anycast`: UDP Anycast based service discovery
* `artillery-hierman`: Supervision hierarchy management layer (aka Bastion's core carrier protocol)
## Examples
Below you can find examples to learn Artillery.
You can also take a look at the [Core Examples](https://github.com/bastion-rs/artillery/tree/master/artillery-core/examples).
### Launching a local AP Cluster
To spawn a local AP cluster at any size you can use the command below in the root directory of the project:
```bash
$ deployment-tests/cluster-mdns-ap-test.sh -s 50
```
Argument `-s` defines the amount of nodes in the cluster.
To shut down the cluster either use:
```bash
$ killall cball_mdns_sd_infection
```
or kill processes one by one to see that cluster is self-healing.

13
doc_deploy.sh Executable file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env sh
yarn global add vuepress
yarn global add vuepress-theme-api
cd site/
vuepress build .
cd -
# Always get removed, sigh...
touch docs/.nojekyll
echo "artillery.bastion.rs" >> docs/CNAME

18
docs/404.html Normal file
View File

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>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.7413490f.js" as="script"><link rel="preload" href="/assets/js/5.b60eac8b.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/3.294f849a.js"><link rel="prefetch" href="/assets/js/4.b92d7a52.js"><link rel="prefetch" href="/assets/js/6.d6285a75.js"><link rel="prefetch" href="/assets/js/7.9042a811.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="container notfound-page" data-v-6d9b2618><div class="content" data-v-6d9b2618><h1 data-v-6d9b2618>Not Found</h1> <p data-v-6d9b2618>The page you are looking for doesn't exist or misterionsly dissapear.</p> <a href="/" class="backto router-link-active" data-v-6d9b2618>Take me home.</a></div></div><div class="global-ui"></div></div>
<script src="/assets/js/app.7413490f.js" defer></script><script src="/assets/js/5.b60eac8b.js" defer></script>
</body>
</html>

View File

@ -1 +1 @@
artillery.bastion.rs
artillery.bastion.rs

View File

@ -1,37 +0,0 @@
<div align="center">
<img src="https://raw.githubusercontent.com/bastion-rs/artillery/master/img/artillery_cropped.png" width="512" height="512"><br>
</div>
-----------------
<h1 align="center">Artillery: Cluster management & Distributed data protocol</h1>
# Module Structure
It contains the modules below:
* `artillery-ddata`: Used for distributed data replication
* `artillery-core`: Contains:
* `cluster`: Prepared self-healing cluster structures
* `epidemic`: Infection style clustering
* `service_discovery`: Service discovery types
* `mdns`: MDNS based service discovery
* `udp_anycast`: UDP Anycast based service discovery
* `artillery-hierman`: Supervision hierarchy management layer (aka Bastion's core carrier protocol)
## Examples
Below you can find examples to learn Artillery.
You can also take a look at the [Core Examples](https://github.com/bastion-rs/artillery/tree/master/artillery-core/examples).
### Launching a local AP Cluster
To spawn a local AP cluster at any size you can use the command below in the root directory of the project:
```bash
$ deployment-tests/cluster-mdns-ap-test.sh -s 50
```
Argument `-s` defines the amount of nodes in the cluster.
To shut down the cluster either use:
```bash
$ killall cball_mdns_sd_infection
```
or kill processes one by one to see that cluster is self-healing.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{194:function(n,w,o){}}]);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{196:function(t,e,n){},202:function(t,e,n){var i=n(1),s=n(203);i({target:"Array",stat:!0,forced:!n(135)((function(t){Array.from(t)}))},{from:s})},203:function(t,e,n){"use strict";var i=n(56),s=n(17),a=n(134),o=n(132),c=n(12),r=n(57),d=n(133);t.exports=function(t){var e,n,l,h,u,f,v=s(t),p="function"==typeof this?this:Array,C=arguments.length,g=C>1?arguments[1]:void 0,k=void 0!==g,_=d(v),m=0;if(k&&(g=i(g,C>2?arguments[2]:void 0,2)),null==_||p==Array&&o(_))for(n=new p(e=c(v.length));e>m;m++)f=k?g(v[m],m):v[m],r(n,m,f);else for(u=(h=_.call(v)).next,n=new p;!(l=u.call(h)).done;m++)f=k?a(h,g,[l.value,m],!0):l.value,r(n,m,f);return n.length=m,n}},204:function(t,e,n){"use strict";var i=n(196);n.n(i).a},217:function(t,e,n){"use strict";n.r(e);n(22),n(202),n(136),n(20),n(58),n(38),n(28);var i=n(23),s={data:function(){return{blocks:[]}},computed:{isEnchanceMode:function(){return!!this.$page.frontmatter.enhance},isBlockLayout:function(){return this.isEnchanceMode||!!this.blocks.length},pageClasses:function(){return{page__container:!0,"page--block-layout":this.isBlockLayout}},lastUpdated:function(){if(this.$page.lastUpdated)return new Date(this.$page.lastUpdated).toLocaleString(this.$lang)},lastUpdatedText:function(){return"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink:function(){if(!1!==this.$page.frontmatter.editLink){var t=this.$site.themeConfig,e=t.repo,n=t.editLinks,s=t.docsDir,a=void 0===s?"":s,o=t.docsBranch,c=void 0===o?"master":o,r=t.docsRepo,d=void 0===r?e:r,l=this.$page.path;if("/"===l.substr(-1)?l+="README.md":l+=".md",d&&n)return(Object(i.a)(d)?d:"https://github.com/".concat(d)).replace(/\/$/,"")+"/edit/".concat(c)+(a?"/"+a.replace(/\/$/,""):"")+l}},editLinkText:function(){return this.$site.themeConfig.editLinkText||"Edit this page"}},watch:{$route:function(t,e){t.path!==e.path&&(this.blocks.length=0,this.isEnchanceMode&&this.$nextTick(this.resolveLayout))}},methods:{resolveLayout:function(){var t=this.$el.children[0],e="";Array.from(t.children).forEach((function(t){!function(t){var e=t.tagName.toLowerCase();return"h1"===e||"h2"===e}(t)?e+=t.outerHTML:(e&&(e+='\n </div>\n <div class="content-block__examples">\n </div>\n </div>\n </div>\n '),e+='\n <div class="content-block">\n <div class="content-block__heading">\n '.concat(t.outerHTML,'\n </div>\n <div class="content-block__body">\n <div class="content-block__cont">\n '))})),e+='\n </div>\n <div class="content-block__examples">\n </div>\n </div>\n </div>\n ',t.innerHTML=e},addBlock:function(t){this.blocks.push(t)}},mounted:function(){this.isEnchanceMode&&this.$nextTick(this.resolveLayout)},created:function(){this.$on("addBlock",this.addBlock)}},a=(n(204),n(4)),o=Object(a.a)(s,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{class:t.pageClasses},[n("Content",{attrs:{custom:""}}),t._v(" "),n("div",{staticClass:"content__footer-container"},[n("div",{staticClass:"content__footer"},[t.editLink?n("div",{staticClass:"edit-link"},[n("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),n("svg",{attrs:{viewBox:"0 0 33 32",version:"1.1",xmlns:"http://www.w3.org/2000/svg",height:"16",width:"16"}},[n("g",{attrs:{id:"Page-1",stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"}},[n("g",{attrs:{id:"github",fill:"#000"}},[n("path",{attrs:{d:"M16.3,0 C7.3,0 -3.55271368e-15,7.3 -3.55271368e-15,16.3 C-3.55271368e-15,23.5 4.7,29.6 11.1,31.8 C11.9,31.9 12.2,31.4 12.2,31 L12.2,28.2 C7.7,29.2 6.7,26 6.7,26 C6,24.2 5,23.7 5,23.7 C3.5,22.7 5.1,22.7 5.1,22.7 C6.7,22.8 7.6,24.4 7.6,24.4 C9.1,26.9 11.4,26.2 12.3,25.8 C12.4,24.7 12.9,24 13.3,23.6 C9.7,23.2 5.9,21.8 5.9,15.5 C5.9,13.7 6.5,12.3 7.6,11.1 C7.4,10.7 6.9,9 7.8,6.8 C7.8,6.8 9.2,6.4 12.3,8.5 C13.6,8.1 15,8 16.4,8 C17.8,8 19.2,8.2 20.5,8.5 C23.6,6.4 25,6.8 25,6.8 C25.9,9 25.3,10.7 25.2,11.1 C26.2,12.2 26.9,13.7 26.9,15.5 C26.9,21.8 23.1,23.1 19.5,23.5 C20.1,24 20.6,25 20.6,26.5 L20.6,31 C20.6,31.4 20.9,31.9 21.7,31.8 C28.2,29.6 32.8,23.5 32.8,16.3 C32.6,7.3 25.3,0 16.3,0 L16.3,0 Z",id:"Shape"}})])])])]):t._e(),t._v(" "),t.lastUpdated?n("time",{staticClass:"last-updated"},[n("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),n("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])])],1)}),[],!1,null,null,null);e.default=o.exports}}]);

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{208:function(t,e,s){},281:function(t,e,s){"use strict";var o=s(208);s.n(o).a},284:function(t,e,s){"use strict";s.r(e);var o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links.","Please try your request again or contact support.","The page you are looking for doesn't exist or misterionsly dissapear."],n={methods:{getMsg:function(){return o[Math.floor(Math.random()*o.length)]}}},i=(s(281),s(4)),r=Object(i.a)(n,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"container notfound-page"},[e("div",{staticClass:"content"},[e("h1",[this._v("Not Found")]),this._v(" "),e("p",[this._v(this._s(this.getMsg()))]),this._v(" "),e("router-link",{staticClass:"backto",attrs:{to:"/"}},[this._v("Take me home.")])],1)])}),[],!1,null,"6d9b2618",null);e.default=r.exports}}]);

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{285:function(t,r,e){"use strict";e.r(r);var s=e(4),i=Object(s.a)({},(function(){var t=this.$createElement,r=this._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[r("div",{attrs:{align:"center"}},[r("img",{attrs:{src:"https://raw.githubusercontent.com/bastion-rs/artillery/master/img/artillery_cropped.png",width:"512",height:"512"}}),r("br")]),this._v(" "),r("hr"),this._v(" "),r("h1",{attrs:{align:"center"}},[this._v("Artillery: Cluster management & Distributed data protocol")])])}),[],!1,null,null,null);r.default=i.exports}}]);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{288:function(e,a,t){"use strict";t.r(a);var s=t(4),l=Object(s.a)({},(function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("Block",[t("h1",{attrs:{id:"local-examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-examples"}},[e._v("#")]),e._v(" Local Examples")])]),e._v(" "),t("Block",[t("h2",{attrs:{id:"cluster-examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cluster-examples"}},[e._v("#")]),e._v(" Cluster Examples")]),e._v(" "),t("p",[e._v("Below you can find examples to learn Artillery.\nYou can also take a look at the "),t("a",{attrs:{href:"https://github.com/bastion-rs/artillery/tree/master/artillery-core/examples",target:"_blank",rel:"noopener noreferrer"}},[e._v("Core Examples"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("Block",[t("h2",{attrs:{id:"launching-a-local-ap-cluster"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launching-a-local-ap-cluster"}},[e._v("#")]),e._v(" Launching a local AP Cluster")]),e._v(" "),t("p",[e._v("To spawn a local AP cluster at any size you can use the command below in the root directory of the project.")]),e._v(" "),t("Example",[t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ deployment-tests/cluster-mdns-ap-test.sh -s "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("50")]),e._v("\n")])])]),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("killall")]),e._v(" cball_mdns_sd_infection\n")])])])]),e._v(" "),t("p",[e._v("Argument "),t("code",[e._v("-s")]),e._v(" defines the amount of nodes in the cluster.\nTo shut down the cluster either use "),t("code",[e._v("killall")]),e._v(" or kill processes\none by one to see that cluster is self-healing.")])],1)],1)}),[],!1,null,null,null);a.default=l.exports}}]);

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{287:function(e,t,a){"use strict";a.r(t);var r=a(4),i=Object(r.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("Block",[a("h1",{attrs:{id:"getting-started"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")])]),e._v(" "),a("Block",[a("h2",{attrs:{id:"basics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#basics"}},[e._v("#")]),e._v(" Basics")]),e._v(" "),a("p",[e._v("To use Artillery, you need to evaluate your requirements for distributed operation very carefully.\nEvery layer in artillery is usable modularly. Artillery uses \"Take it or leave it\" approach.\nIf you don't need it you don't include.")]),e._v(" "),a("p",[e._v("Artillery consists of various layers. Layers can have various consistency degree and capability model.\nArtillery layers are build on top each other. Most basic layer is "),a("code",[e._v("Core")]),e._v(".\nCore layer contains various prepared cluster configurations.\nCurrently it is supporting:")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("AP(Availability, Partition Tolerance")]),e._v(" Cluster mode")]),e._v(" "),a("li",[a("strong",[e._v("CP(Consistency, Partition Tolerance)")]),e._v(" Cluster mode (soon)")])]),e._v(" "),a("p",[e._v("In addition to cluster modes, it contains primitives to build your own cluster structures for your own designated environment.")]),e._v(" "),a("Example",[a("ul",[a("li",[a("code",[e._v("artillery-core")]),e._v(" "),a("ul",[a("li",[a("code",[e._v("cluster")]),e._v(": Prepared self-healing cluster structures")]),e._v(" "),a("li",[a("code",[e._v("epidemic")]),e._v(": Infection style clustering")]),e._v(" "),a("li",[a("code",[e._v("service_discovery")]),e._v(": Service discovery types\n"),a("ul",[a("li",[a("code",[e._v("mdns")]),e._v(": MDNS based service discovery")]),e._v(" "),a("li",[a("code",[e._v("udp_anycast")]),e._v(": UDP Anycast based service discovery\n(aka "),a("a",{attrs:{href:"https://bastion.rs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bastion"),a("OutboundLink")],1),e._v("'s core carrier protocol)")])])])])])])])],1),e._v(" "),a("Block",[a("h2",{attrs:{id:"distributed-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#distributed-data"}},[e._v("#")]),e._v(" Distributed Data")]),e._v(" "),a("p",[e._v("You might want to pass by the distributed configuration part and directly looking forward to have a distributed\ndata primitives. Like replicating your local map to some other instance's local map etc.")]),e._v(" "),a("p",[e._v("This is where "),a("code",[e._v("Ddata")]),e._v(" package kicks in. "),a("code",[e._v("Ddata")]),e._v(" supplies the most basic distributed data dissemination at the highest abstraction level.")]),e._v(" "),a("Example",[a("ul",[a("li",[a("code",[e._v("artillery-ddata")]),e._v(": Used for distributed data replication")])])])],1),e._v(" "),a("Block",[a("h2",{attrs:{id:"hierarchy-management"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#hierarchy-management"}},[e._v("#")]),e._v(" Hierarchy Management")]),e._v(" "),a("p",[e._v("This layer is specifically build for Bastion and it's distributed communication.\nIt contains a Hierarchy Management protocol. This protocol manages remote processes, links as well as their state.")]),e._v(" "),a("Example",[a("ul",[a("li",[a("code",[e._v("artillery-hierman")]),e._v(": Supervision hierarchy management layer")])])])],1)],1)}),[],!1,null,null,null);t.default=i.exports}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

14
site/.vuepress/config.js Normal file
View File

@ -0,0 +1,14 @@
module.exports = {
title: 'Artillery',
dest: '../docs',
description: 'Cluster management & Distributed data protocol',
theme: 'api',
themeConfig: {
editLinks: true,
sidebarGroupOrder: [
'getting-started',
'building-blocks',
'examples',
],
}
}

8
site/README.md Normal file
View File

@ -0,0 +1,8 @@
<div align="center">
<img src="https://raw.githubusercontent.com/bastion-rs/artillery/master/img/artillery_cropped.png" width="512" height="512"><br>
</div>
-----------------
<h1 align="center">Artillery: Cluster management & Distributed data protocol</h1>

View File

@ -0,0 +1,81 @@
---
title: 'Primitives'
---
<Block>
# Primitives
</Block>
<Block>
Artillery Core consists of various primitives. We will start with Service Discovery primitives and pave out way to Cluster primitives.
</Block>
<Block>
## Service Discovery Primitives
For distributed operation we need to have a service discovery to find out who is operating/serving which services and service capabilities.
Our design consists of various service discovery techniques.
</Block>
<Block>
## UDP Anycast
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.
**NOTE:** Convergance of the UDP anycast might take longer time than the other zeroconf approaches.
<Example>
```rust
#[derive(Serialize, Deserialize, Debug, Clone, Ord, PartialOrd, PartialEq)]
struct ExampleSDReply {
ip: String,
port: u16,
}
let epidemic_sd_config = ExampleSDReply {
ip: "127.0.0.1".into(),
port: 1337, // Cluster Formation Port of this instance
};
let reply = ServiceDiscoveryReply {
serialized_data: serde_json::to_string(&epidemic_sd_config).unwrap(),
};
// Initialize receiver channels
let (tx, discoveries) = channel();
// Register seeker endpoint
sd.register_seeker(tx).unwrap();
// Sometimes you seek for nodes,
// sometimes you need to be a listener to respond them.
if let Some(_) = seeker {
sd.seek_peers().unwrap();
} else {
sd.set_listen_for_peers(true).unwrap();
}
for discovery in discoveries.iter() {
let discovery: ExampleSDReply =
serde_json::from_str(&discovery.serialized_data).unwrap();
if discovery.port != epidemic_sd_config.port {
debug!("Seed node address came");
let seed_node = format!("{}:{}", discovery.ip, discovery.port);
// We have received a discovery request.
}
}
```
</Example>
</Block>

View File

@ -0,0 +1,38 @@
---
title: 'Local Examples'
---
<Block>
# Local Examples
</Block>
<Block>
## Cluster Examples
Below you can find examples to learn Artillery.
You can also take a look at the [Core Examples](https://github.com/bastion-rs/artillery/tree/master/artillery-core/examples).
</Block>
<Block>
## Launching a local AP Cluster
To spawn a local AP cluster at any size you can use the command below in the root directory of the project.
<Example>
```bash
$ deployment-tests/cluster-mdns-ap-test.sh -s 50
```
```bash
$ killall cball_mdns_sd_infection
```
</Example>
Argument `-s` defines the amount of nodes in the cluster.
To shut down the cluster either use `killall` or kill processes
one by one to see that cluster is self-healing.
</Block>

View File

@ -0,0 +1,71 @@
---
title: 'Getting Started'
---
<Block>
# Getting Started
</Block>
<Block>
## Basics
To use Artillery, you need to evaluate your requirements for distributed operation very carefully.
Every layer in artillery is usable modularly. Artillery uses "Take it or leave it" approach.
If you don't need it you don't include.
Artillery consists of various layers. Layers can have various consistency degree and capability model.
Artillery layers are build on top each other. Most basic layer is `Core`.
Core layer contains various prepared cluster configurations.
Currently it is supporting:
* **AP(Availability, Partition Tolerance** Cluster mode
* **CP(Consistency, Partition Tolerance)** Cluster mode (soon)
In addition to cluster modes, it contains primitives to build your own cluster structures for your own designated environment.
<Example>
* `artillery-core`
* `cluster`: Prepared self-healing cluster structures
* `epidemic`: Infection style clustering
* `service_discovery`: Service discovery types
* `mdns`: MDNS based service discovery
* `udp_anycast`: UDP Anycast based service discovery
(aka [Bastion](https://bastion.rs)'s core carrier protocol)
</Example>
</Block>
<Block>
## Distributed Data
You might want to pass by the distributed configuration part and directly looking forward to have a distributed
data primitives. Like replicating your local map to some other instance's local map etc.
This is where `Ddata` package kicks in. `Ddata` supplies the most basic distributed data dissemination at the highest abstraction level.
<Example>
* `artillery-ddata`: Used for distributed data replication
</Example>
</Block>
<Block>
## Hierarchy Management
This layer is specifically build for Bastion and it's distributed communication.
It contains a Hierarchy Management protocol. This protocol manages remote processes, links as well as their state.
<Example>
* `artillery-hierman`: Supervision hierarchy management layer
</Example>
</Block>