|
|
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Edges · Diagrams</title><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta name="generator" content="Docusaurus"/><meta name="description" content="`Edge` represents an edge between nodes."/><meta name="docsearch:language" content="en"/><meta property="og:title" content="Edges · Diagrams"/><meta property="og:type" content="website"/><meta property="og:url" content="https://diagrams.mingrammer.com/"/><meta property="og:description" content="`Edge` represents an edge between nodes."/><meta property="og:image" content="https://diagrams.mingrammer.com/img/diagrams.png"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://diagrams.mingrammer.com/img/diagrams.png"/><link rel="shortcut icon" href="/img/diagrams.ico"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css"/><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-84081627-3', 'auto');
|
|
|
ga('send', 'pageview');
|
|
|
</script><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/diagrams.ico" alt="Diagrams"/><h2 class="headerTitleWithLogo">Diagrams</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/getting-started/installation" target="_self">Docs</a></li><li class="siteNavGroupActive"><a href="/docs/guides/diagram" target="_self">Guides</a></li><li class="siteNavGroupActive"><a href="/docs/nodes/aws" target="_self">Nodes</a></li><li class=""><a href="https://github.com/mingrammer/diagrams" target="_self">GitHub</a></li><li class=""><a href="https://www.buymeacoffee.com/mingrammer" target="_self">Sponsoring</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i>›</i><span>Guides</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/getting-started/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/getting-started/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/guides/diagram">Diagrams</a></li><li class="navListItem"><a class="navItem" href="/docs/guides/node">Nodes</a></li><li class="navListItem"><a class="navItem" href="/docs/guides/cluster">Clusters</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/guides/edge">Edges</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Nodes</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/nodes/onprem">OnPrem</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/aws">AWS</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/azure">Azure</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/gcp">GCP</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/ibm">IBM</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/k8s">K8S</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/alibabacloud">AlibabaCloud</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/oci">OCI</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/openstack">OpenStack</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/firebase">Firebase</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/digitalocean">DigitalOcean</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/elastic">Elastic</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/outscale">Outscale</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/generic">Generic</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/programming">Programming</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/saas">Saas</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/c4">C4</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/custom">Custom</a></li><li class="navListItem"><a class="navItem" href="/docs/nodes/gis">GIS</a></li></ul></div></div></section></div><script>
|
|
|
var coll = document.getElementsByClassName('collapsible');
|
|
|
var checkActiveCategory = true;
|
|
|
for (var i = 0; i < coll.length; i++) {
|
|
|
var links = coll[i].nextElementSibling.getElementsByTagName('*');
|
|
|
if (checkActiveCategory){
|
|
|
for (var j = 0; j < links.length; j++) {
|
|
|
if (links[j].classList.contains('navListItemActive')){
|
|
|
coll[i].nextElementSibling.classList.toggle('hide');
|
|
|
coll[i].childNodes[1].classList.toggle('rotate');
|
|
|
checkActiveCategory = false;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
coll[i].addEventListener('click', function() {
|
|
|
var arrow = this.childNodes[1];
|
|
|
arrow.classList.toggle('rotate');
|
|
|
var content = this.nextElementSibling;
|
|
|
content.classList.toggle('hide');
|
|
|
});
|
|
|
}
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
|
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
|
|
|
createToggler('#tocToggler', 'body', 'tocActive');
|
|
|
|
|
|
var headings = document.querySelector('.toc-headings');
|
|
|
headings && headings.addEventListener('click', function(event) {
|
|
|
var el = event.target;
|
|
|
while(el !== headings){
|
|
|
if (el.tagName === 'A') {
|
|
|
document.body.classList.remove('tocActive');
|
|
|
break;
|
|
|
} else{
|
|
|
el = el.parentNode;
|
|
|
}
|
|
|
}
|
|
|
}, false);
|
|
|
|
|
|
function createToggler(togglerSelector, targetSelector, className) {
|
|
|
var toggler = document.querySelector(togglerSelector);
|
|
|
var target = document.querySelector(targetSelector);
|
|
|
|
|
|
if (!toggler) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
toggler.onclick = function(event) {
|
|
|
event.preventDefault();
|
|
|
|
|
|
target.classList.toggle(className);
|
|
|
};
|
|
|
}
|
|
|
});
|
|
|
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">Edges</h1></header><article><div><span><p><code>Edge</code> represents an edge between nodes.</p>
|
|
|
<h2><a class="anchor" aria-hidden="true" id="basic"></a><a href="#basic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Basic</h2>
|
|
|
<p><code>Edge</code> is an object representing a connection between nodes with some additional properties.</p>
|
|
|
<p>An edge object contains three attributes: <strong>label</strong>, <strong>color</strong>, and <strong>style</strong>. They mirror the corresponding Graphviz edge attributes.</p>
|
|
|
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram, Edge
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.analytics <span class="hljs-keyword">import</span> Spark
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.compute <span class="hljs-keyword">import</span> Server
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.database <span class="hljs-keyword">import</span> PostgreSQL
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.inmemory <span class="hljs-keyword">import</span> Redis
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.aggregator <span class="hljs-keyword">import</span> Fluentd
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.monitoring <span class="hljs-keyword">import</span> Grafana, Prometheus
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.network <span class="hljs-keyword">import</span> Nginx
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.queue <span class="hljs-keyword">import</span> Kafka
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Diagram(name=<span class="hljs-string">"Advanced Web Service with On-Premises (colored)"</span>, show=<span class="hljs-literal">False</span>):
|
|
|
ingress = Nginx(<span class="hljs-string">"ingress"</span>)
|
|
|
|
|
|
metrics = Prometheus(<span class="hljs-string">"metric"</span>)
|
|
|
metrics << Edge(color=<span class="hljs-string">"firebrick"</span>, style=<span class="hljs-string">"dashed"</span>) << Grafana(<span class="hljs-string">"monitoring"</span>)
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Service Cluster"</span>):
|
|
|
grpcsvc = [
|
|
|
Server(<span class="hljs-string">"grpc1"</span>),
|
|
|
Server(<span class="hljs-string">"grpc2"</span>),
|
|
|
Server(<span class="hljs-string">"grpc3"</span>)]
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Sessions HA"</span>):
|
|
|
primary = Redis(<span class="hljs-string">"session"</span>)
|
|
|
primary \
|
|
|
- Edge(color=<span class="hljs-string">"brown"</span>, style=<span class="hljs-string">"dashed"</span>) \
|
|
|
- Redis(<span class="hljs-string">"replica"</span>) \
|
|
|
<< Edge(label=<span class="hljs-string">"collect"</span>) \
|
|
|
<< metrics
|
|
|
grpcsvc >> Edge(color=<span class="hljs-string">"brown"</span>) >> primary
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Database HA"</span>):
|
|
|
primary = PostgreSQL(<span class="hljs-string">"users"</span>)
|
|
|
primary \
|
|
|
- Edge(color=<span class="hljs-string">"brown"</span>, style=<span class="hljs-string">"dotted"</span>) \
|
|
|
- PostgreSQL(<span class="hljs-string">"replica"</span>) \
|
|
|
<< Edge(label=<span class="hljs-string">"collect"</span>) \
|
|
|
<< metrics
|
|
|
grpcsvc >> Edge(color=<span class="hljs-string">"black"</span>) >> primary
|
|
|
|
|
|
aggregator = Fluentd(<span class="hljs-string">"logging"</span>)
|
|
|
aggregator \
|
|
|
>> Edge(label=<span class="hljs-string">"parse"</span>) \
|
|
|
>> Kafka(<span class="hljs-string">"stream"</span>) \
|
|
|
>> Edge(color=<span class="hljs-string">"black"</span>, style=<span class="hljs-string">"bold"</span>) \
|
|
|
>> Spark(<span class="hljs-string">"analytics"</span>)
|
|
|
|
|
|
ingress \
|
|
|
>> Edge(color=<span class="hljs-string">"darkgreen"</span>) \
|
|
|
<< grpcsvc \
|
|
|
>> Edge(color=<span class="hljs-string">"darkorange"</span>) \
|
|
|
>> aggregator
|
|
|
</code></pre>
|
|
|
<p><img src="/img/advanced_web_service_with_on-premise_colored.png" alt="advanced web service with on-premise diagram colored"></p>
|
|
|
<h2><a class="anchor" aria-hidden="true" id="less-edges"></a><a href="#less-edges" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Less Edges</h2>
|
|
|
<p>As you can see on the previous graph the edges can quickly become noisy. Below are two examples to solve this problem.</p>
|
|
|
<p>One approach is to get creative with the Node class to create blank placeholders, together with named nodes within Clusters, and then only pointing to single named elements within those Clusters.</p>
|
|
|
<p>Compare the output below to the example output above .</p>
|
|
|
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram, Node
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.analytics <span class="hljs-keyword">import</span> Spark
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.compute <span class="hljs-keyword">import</span> Server
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.database <span class="hljs-keyword">import</span> PostgreSQL
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.inmemory <span class="hljs-keyword">import</span> Redis
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.aggregator <span class="hljs-keyword">import</span> Fluentd
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.monitoring <span class="hljs-keyword">import</span> Grafana, Prometheus
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.network <span class="hljs-keyword">import</span> Nginx
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.queue <span class="hljs-keyword">import</span> Kafka
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"\nAdvanced Web Service with On-Premise Less edges"</span>, show=<span class="hljs-literal">False</span>) <span class="hljs-keyword">as</span> diag:
|
|
|
ingress = Nginx(<span class="hljs-string">"ingress"</span>)
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Service Cluster"</span>):
|
|
|
serv1 = Server(<span class="hljs-string">"grpc1"</span>)
|
|
|
serv2 = Server(<span class="hljs-string">"grpc2"</span>)
|
|
|
serv3 = Server(<span class="hljs-string">"grpc3"</span>)
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">""</span>):
|
|
|
blankHA = Node(<span class="hljs-string">""</span>, shape=<span class="hljs-string">"plaintext"</span>, width=<span class="hljs-string">"0"</span>, height=<span class="hljs-string">"0"</span>)
|
|
|
|
|
|
metrics = Prometheus(<span class="hljs-string">"metric"</span>)
|
|
|
metrics << Grafana(<span class="hljs-string">"monitoring"</span>)
|
|
|
|
|
|
aggregator = Fluentd(<span class="hljs-string">"logging"</span>)
|
|
|
blankHA >> aggregator >> Kafka(<span class="hljs-string">"stream"</span>) >> Spark(<span class="hljs-string">"analytics"</span>)
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Database HA"</span>):
|
|
|
db = PostgreSQL(<span class="hljs-string">"users"</span>)
|
|
|
db - PostgreSQL(<span class="hljs-string">"replica"</span>) << metrics
|
|
|
blankHA >> db
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Sessions HA"</span>):
|
|
|
sess = Redis(<span class="hljs-string">"session"</span>)
|
|
|
sess - Redis(<span class="hljs-string">"replica"</span>) << metrics
|
|
|
blankHA >> sess
|
|
|
|
|
|
ingress >> serv2 >> blankHA
|
|
|
|
|
|
diag
|
|
|
</code></pre>
|
|
|
<p><img src="/img/advanced_web_service_with_on-premise_less_edges.png" alt="advanced web service with on-premise less edges"></p>
|
|
|
<h2><a class="anchor" aria-hidden="true" id="merged-edges"></a><a href="#merged-edges" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Merged Edges</h2>
|
|
|
<p>Yet another option is to set the graph_attr dictionary key "concentrate" to "true".</p>
|
|
|
<p>Note the following restrictions:</p>
|
|
|
<ol>
|
|
|
<li>the Edge must end at the same headport</li>
|
|
|
<li>This only works when the "splines" graph_attr key is set to the value "spline". It has no effect when the value was set to "ortho", which is the default for the diagrams library.</li>
|
|
|
<li>this will only work with the "dot" layout engine, which is the default for the diagrams library.</li>
|
|
|
</ol>
|
|
|
<p>For more information see:</p>
|
|
|
<p><a href="https://graphviz.gitlab.io/doc/info/attrs.html#d:concentrate">https://graphviz.gitlab.io/doc/info/attrs.html#d:concentrate</a></p>
|
|
|
<p><a href="https://www.graphviz.org/pdf/dotguide.pdf">https://www.graphviz.org/pdf/dotguide.pdf</a> Section 3.3 Concentrators</p>
|
|
|
<pre><code class="hljs css language-python"><span class="hljs-keyword">from</span> diagrams <span class="hljs-keyword">import</span> Cluster, Diagram, Edge, Node
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.analytics <span class="hljs-keyword">import</span> Spark
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.compute <span class="hljs-keyword">import</span> Server
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.database <span class="hljs-keyword">import</span> PostgreSQL
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.inmemory <span class="hljs-keyword">import</span> Redis
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.aggregator <span class="hljs-keyword">import</span> Fluentd
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.monitoring <span class="hljs-keyword">import</span> Grafana, Prometheus
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.network <span class="hljs-keyword">import</span> Nginx
|
|
|
<span class="hljs-keyword">from</span> diagrams.onprem.queue <span class="hljs-keyword">import</span> Kafka
|
|
|
|
|
|
graph_attr = {
|
|
|
<span class="hljs-string">"concentrate"</span>: <span class="hljs-string">"true"</span>,
|
|
|
<span class="hljs-string">"splines"</span>: <span class="hljs-string">"spline"</span>,
|
|
|
}
|
|
|
|
|
|
edge_attr = {
|
|
|
<span class="hljs-string">"minlen"</span>:<span class="hljs-string">"3"</span>,
|
|
|
}
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Diagram(<span class="hljs-string">"\n\nAdvanced Web Service with On-Premise Merged edges"</span>, show=<span class="hljs-literal">False</span>,
|
|
|
graph_attr=graph_attr,
|
|
|
edge_attr=edge_attr) <span class="hljs-keyword">as</span> diag:
|
|
|
|
|
|
ingress = Nginx(<span class="hljs-string">"ingress"</span>)
|
|
|
|
|
|
metrics = Prometheus(<span class="hljs-string">"metric"</span>)
|
|
|
metrics << Edge(minlen=<span class="hljs-string">"0"</span>) << Grafana(<span class="hljs-string">"monitoring"</span>)
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Service Cluster"</span>):
|
|
|
grpsrv = [
|
|
|
Server(<span class="hljs-string">"grpc1"</span>),
|
|
|
Server(<span class="hljs-string">"grpc2"</span>),
|
|
|
Server(<span class="hljs-string">"grpc3"</span>)]
|
|
|
|
|
|
blank = Node(<span class="hljs-string">""</span>, shape=<span class="hljs-string">"plaintext"</span>, height=<span class="hljs-string">"0.0"</span>, width=<span class="hljs-string">"0.0"</span>)
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Sessions HA"</span>):
|
|
|
sess = Redis(<span class="hljs-string">"session"</span>)
|
|
|
sess - Redis(<span class="hljs-string">"replica"</span>) << metrics
|
|
|
|
|
|
<span class="hljs-keyword">with</span> Cluster(<span class="hljs-string">"Database HA"</span>):
|
|
|
db = PostgreSQL(<span class="hljs-string">"users"</span>)
|
|
|
db - PostgreSQL(<span class="hljs-string">"replica"</span>) << metrics
|
|
|
|
|
|
aggregator = Fluentd(<span class="hljs-string">"logging"</span>)
|
|
|
aggregator >> Kafka(<span class="hljs-string">"stream"</span>) >> Spark(<span class="hljs-string">"analytics"</span>)
|
|
|
|
|
|
ingress >> [grpsrv[<span class="hljs-number">0</span>], grpsrv[<span class="hljs-number">1</span>], grpsrv[<span class="hljs-number">2</span>],]
|
|
|
[grpsrv[<span class="hljs-number">0</span>], grpsrv[<span class="hljs-number">1</span>], grpsrv[<span class="hljs-number">2</span>],] - Edge(headport=<span class="hljs-string">"w"</span>, minlen=<span class="hljs-string">"1"</span>) - blank
|
|
|
blank >> Edge(headport=<span class="hljs-string">"w"</span>, minlen=<span class="hljs-string">"2"</span>) >> [sess, db, aggregator]
|
|
|
|
|
|
diag
|
|
|
</code></pre>
|
|
|
<p><img src="/img/advanced_web_service_with_on-premise_merged_edges.png" alt="advanced web service with on-premise merged edges"></p>
|
|
|
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 5/11/2025</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/guides/cluster"><span class="arrow-prev">← </span><span>Clusters</span></a><a class="docs-next button" href="/docs/nodes/onprem"><span class="function-name-prevnext">OnPrem</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#basic">Basic</a></li><li><a href="#less-edges">Less Edges</a></li><li><a href="#merged-edges">Merged Edges</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/diagrams.ico" alt="Diagrams" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/getting-started/installation">Getting Started</a><a href="/docs/guides/diagram">Guides</a><a href="/docs/nodes/aws">Nodes</a></div><div><h5>More</h5><iframe src="https://ghbtns.com/github-btn.html?user=mingrammer&repo=diagrams&type=star&count=true&size=large" frameBorder="0" scrolling="0" width="170" height="30" title="Star mingrammer/diagrams on GitHub"></iframe></div></section><section class="copyright">Copyright © 2025 mingrammer</section></footer></div></body></html> |