|
|
|
---
|
|
|
|
id: examples
|
|
|
|
title: Examples
|
|
|
|
---
|
|
|
|
|
|
|
|
Here are some more examples.
|
|
|
|
|
|
|
|
## Grouped Workers
|
|
|
|
|
|
|
|
```python
|
|
|
|
from diagrams import Diagram
|
|
|
|
from diagrams.aws.compute import EC2
|
|
|
|
from diagrams.aws.database import RDS
|
|
|
|
from diagrams.aws.network import ELB
|
|
|
|
|
|
|
|
with Diagram("Grouped Workers", show=False, direction="TB"):
|
|
|
|
ELB("lb") >> [EC2("worker1"),
|
|
|
|
EC2("worker2"),
|
|
|
|
EC2("worker3"),
|
|
|
|
EC2("worker4"),
|
|
|
|
EC2("worker5")] >> RDS("events")
|
|
|
|
```
|
|
|
|
|
|
|
|
![grouped workers diagram](/img/grouped_workers_diagram.png)
|
|
|
|
|
|
|
|
## Clustered Web Services
|
|
|
|
|
|
|
|
```python
|
|
|
|
from diagrams import Cluster, Diagram
|
|
|
|
from diagrams.aws.compute import ECS
|
|
|
|
from diagrams.aws.database import ElastiCache, RDS
|
|
|
|
from diagrams.aws.network import ELB
|
|
|
|
from diagrams.aws.network import Route53
|
|
|
|
|
|
|
|
with Diagram("Clustered Web Services", show=False):
|
|
|
|
dns = Route53("dns")
|
|
|
|
lb = ELB("lb")
|
|
|
|
|
|
|
|
with Cluster("Services"):
|
|
|
|
svc_group = [ECS("web1"),
|
|
|
|
ECS("web2"),
|
|
|
|
ECS("web3")]
|
|
|
|
|
|
|
|
with Cluster("DB Cluster"):
|
|
|
|
db_master = RDS("userdb")
|
|
|
|
db_master - [RDS("userdb ro")]
|
|
|
|
|
|
|
|
memcached = ElastiCache("memcached")
|
|
|
|
|
|
|
|
dns >> lb >> svc_group
|
|
|
|
svc_group >> db_master
|
|
|
|
svc_group >> memcached
|
|
|
|
```
|
|
|
|
|
|
|
|
![clustered web services diagram](/img/clustered_web_services_diagram.png)
|
|
|
|
|
|
|
|
## Event Processing
|
|
|
|
|
|
|
|
```python
|
|
|
|
from diagrams import Cluster, Diagram
|
|
|
|
from diagrams.aws.compute import ECS, EKS, Lambda
|
|
|
|
from diagrams.aws.database import Redshift
|
|
|
|
from diagrams.aws.integration import SQS
|
|
|
|
from diagrams.aws.storage import S3
|
|
|
|
|
|
|
|
with Diagram("Event Processing", show=False):
|
|
|
|
source = EKS("k8s source")
|
|
|
|
|
|
|
|
with Cluster("Event Flows"):
|
|
|
|
with Cluster("Event Workers"):
|
|
|
|
workers = [ECS("worker1"),
|
|
|
|
ECS("worker2"),
|
|
|
|
ECS("worker3")]
|
|
|
|
|
|
|
|
queue = SQS("event queue")
|
|
|
|
|
|
|
|
with Cluster("Processing"):
|
|
|
|
handlers = [Lambda("proc1"),
|
|
|
|
Lambda("proc2"),
|
|
|
|
Lambda("proc3")]
|
|
|
|
|
|
|
|
store = S3("events store")
|
|
|
|
dw = Redshift("analytics")
|
|
|
|
|
|
|
|
source >> workers >> queue >> handlers
|
|
|
|
handlers >> store
|
|
|
|
handlers >> dw
|
|
|
|
```
|
|
|
|
|
|
|
|
![event processing diagram](/img/event_processing_diagram.png)
|
|
|
|
|
|
|
|
## Message Collecting System
|
|
|
|
|
|
|
|
```python
|
|
|
|
from diagrams import Cluster, Diagram
|
|
|
|
from diagrams.gcp.analytics import BigQuery, Dataflow, PubSub
|
|
|
|
from diagrams.gcp.compute import AppEngine, Functions
|
|
|
|
from diagrams.gcp.database import BigTable
|
|
|
|
from diagrams.gcp.iot import IotCore
|
|
|
|
from diagrams.gcp.storage import GCS
|
|
|
|
|
|
|
|
with Diagram("Message Collecting", show=False):
|
|
|
|
pubsub = PubSub("pubsub")
|
|
|
|
|
|
|
|
with Cluster("Source of Data"):
|
|
|
|
[IotCore("core1"),
|
|
|
|
IotCore("core2"),
|
|
|
|
IotCore("core3")] >> pubsub
|
|
|
|
|
|
|
|
with Cluster("Targets"):
|
|
|
|
with Cluster("Data Flow"):
|
|
|
|
flow = Dataflow("data flow")
|
|
|
|
|
|
|
|
with Cluster("Data Lake"):
|
|
|
|
flow >> [BigQuery("bq"),
|
|
|
|
GCS("storage")]
|
|
|
|
|
|
|
|
with Cluster("Event Driven"):
|
|
|
|
with Cluster("Processing"):
|
|
|
|
flow >> AppEngine("engine") >> BigTable("bigtable")
|
|
|
|
|
|
|
|
with Cluster("Serverless"):
|
|
|
|
flow >> Functions("func") >> AppEngine("appengine")
|
|
|
|
|
|
|
|
pubsub >> flow
|
|
|
|
```
|
|
|
|
|
|
|
|
![message collecting diagram](/img/message_collecting_diagram.png)
|
|
|
|
|
|
|
|
## Exposed Pod with 3 Replicas on k8s
|
|
|
|
|
|
|
|
```python
|
|
|
|
from diagrams import Diagram
|
|
|
|
from diagrams.k8s.clusterconfig import HPA
|
|
|
|
from diagrams.k8s.compute import Deployment, Pod, ReplicaSet
|
|
|
|
from diagrams.k8s.network import Ingress, Service
|
|
|
|
|
|
|
|
with Diagram("Exposed Pod with 3 Replicas", show=False):
|
|
|
|
net = Ingress("domain.com") >> Service("svc")
|
|
|
|
net >> [Pod("pod1"),
|
|
|
|
Pod("pod2"),
|
|
|
|
Pod("pod3")] << ReplicaSet("rs") << Deployment("dp") << HPA("hpa")
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
![exposed pod with 3 replicas diagram](/img/exposed_pod_with_3_replicas_diagram.png)
|
|
|
|
|
|
|
|
## Stateful Architecture on k8s
|
|
|
|
|
|
|
|
```python
|
|
|
|
from diagrams import Cluster, Diagram
|
|
|
|
from diagrams.k8s.compute import Pod, StatefulSet
|
|
|
|
from diagrams.k8s.network import Service
|
|
|
|
from diagrams.k8s.storage import PV, PVC, StorageClass
|
|
|
|
|
|
|
|
with Diagram("Stateful Architecture", show=False):
|
|
|
|
with Cluster("Apps"):
|
|
|
|
svc = Service("svc")
|
|
|
|
sts = StatefulSet("sts")
|
|
|
|
|
|
|
|
apps = []
|
|
|
|
for _ in range(3):
|
|
|
|
pod = Pod("pod")
|
|
|
|
pvc = PVC("pvc")
|
|
|
|
pod - sts - pvc
|
|
|
|
apps.append(svc >> pod >> pvc)
|
|
|
|
|
|
|
|
apps << PV("pv") << StorageClass("sc")
|
|
|
|
```
|
|
|
|
|
|
|
|
![stateful architecture diagram](/img/stateful_architecture_diagram.png)
|
|
|
|
|
|
|
|
## RabbitMQ Consumers with custom nodes
|
|
|
|
|
|
|
|
```python
|
|
|
|
from urllib.request import urlretrieve
|
|
|
|
|
|
|
|
from diagrams import Cluster, Diagram
|
|
|
|
from diagrams.custom import Custom
|
|
|
|
from diagrams.aws.database import Aurora
|
|
|
|
from diagrams.k8s.compute import Pod
|
|
|
|
|
|
|
|
# Download an image to be used into a Custom Node class
|
|
|
|
rabbitmq_url = "https://jpadilla.github.io/rabbitmqapp/assets/img/icon.png"
|
|
|
|
rabbitmq_icon = "rabbitmq.png"
|
|
|
|
urlretrieve(rabbitmq_url, rabbitmq_icon)
|
|
|
|
|
|
|
|
|
|
|
|
with Diagram("Broker Consumers", show=False):
|
|
|
|
with Cluster("Consumers"):
|
|
|
|
consumers = [
|
|
|
|
Pod("worker"),
|
|
|
|
Pod("worker"),
|
|
|
|
Pod("worker")
|
|
|
|
]
|
|
|
|
|
|
|
|
queue = Custom("Message queue", rabbitmq_icon)
|
|
|
|
|
|
|
|
queue >> consumers >> Aurora("Database")
|
|
|
|
````
|
|
|
|
|
|
|
|
![rabbitmq consumers diagram](/img/rabbitmq_consumers_diagram.png)
|
|
|
|
|
|
|
|
## On-Premise System Architecture
|
|
|
|
|
|
|
|
```python
|
|
|
|
from diagrams import Cluster, Diagram
|
|
|
|
from diagrams.onprem.analytics import Spark
|
|
|
|
from diagrams.onprem.compute import Server
|
|
|
|
from diagrams.onprem.database import PostgreSQL
|
|
|
|
from diagrams.onprem.inmemory import Redis
|
|
|
|
from diagrams.onprem.logging import Fluentd
|
|
|
|
from diagrams.onprem.monitoring import Grafana, Prometheus
|
|
|
|
from diagrams.onprem.network import Linkerd, Nginx
|
|
|
|
from diagrams.onprem.queue import Kafka
|
|
|
|
from diagrams.onprem.workflow import Airflow
|
|
|
|
|
|
|
|
with Diagram("On-Premise System Architecture", show=False):
|
|
|
|
ingress = Nginx("ingress")
|
|
|
|
|
|
|
|
with Cluster("Service Cluster"):
|
|
|
|
svcmesh = Linkerd("svcmesh")
|
|
|
|
grpcsvc = [Server("grpc1"), Server("grpc2"), Server("grpc3")]
|
|
|
|
svcmesh >> grpcsvc
|
|
|
|
|
|
|
|
with Cluster("Database HA"):
|
|
|
|
maindb_master = PostgreSQL("maindb")
|
|
|
|
maindb_replica = PostgreSQL("replica")
|
|
|
|
maindb_master - maindb_replica
|
|
|
|
grpcsvc >> maindb_master
|
|
|
|
|
|
|
|
maindb_replica >> Airflow("scheduler")
|
|
|
|
|
|
|
|
with Cluster("Sessions HA"):
|
|
|
|
session_master = Redis("session")
|
|
|
|
session_master - Redis("replica")
|
|
|
|
grpcsvc >> session_master
|
|
|
|
|
|
|
|
logaggr = Fluentd("aggregator")
|
|
|
|
logaggr >> Kafka("stream") >> Spark("log analytics")
|
|
|
|
grpcsvc >> logaggr
|
|
|
|
|
|
|
|
metricq = Kafka("buffer")
|
|
|
|
metricq >> Prometheus("metric") >> Grafana("monitoring")
|
|
|
|
|
|
|
|
logaggr >> metricq
|
|
|
|
svcmesh >> metricq
|
|
|
|
|
|
|
|
ingress >> svcmesh
|
|
|
|
```
|
|
|
|
|
|
|
|
![on-premise system architecture diagram](/img/on-premise_system_architecture.png)
|