Kinds and components

The vocabulary: abstract kinds, concrete products, and the order a property value is resolved in.

A kind is an abstract category with typed properties. A component is a concrete product implementing exactly one kind. Nothing in either of them is display text: names and descriptions live in locales/, keyed by id, so the documents stay language-neutral.

Kind

A kind answers "what is a queue?" — not "which queue".

yaml
schemaVersion: "1"
type: "kind"
id: "queue"
category: "messaging"
properties:
  delivery:
    type: "enum"
    values: ["at-most-once", "at-least-once", "exactly-once"]
    required: true
  ordering:
    type: "enum"
    values: ["none", "per-key", "global"]
    default: "none"
  deadLetterQueue:
    type: "boolean"
    default: false
FieldRequiredMeaning
categoryyesOne of messaging, compute, data, edge, external, client, ops, security, custom. Rules may select by category.
propertiesyesProperty name to property definition. May be empty.

external is for services outside your control, such as a payment provider. custom holds only the custom kind, the untyped escape hatch.

Property definitions

FieldRequiredMeaning
typeyesboolean, integer, string, enum or ref
valuesfor enumThe allowed string values
defaultnoThe value assumed when neither the component nor the node sets one
requirednoA node must resolve a value from somewhere. Default false
refKindfor refThe kind the referenced node must have; the value is another node's id

A property with neither default nor required is optional and may be absent. That absence is usually deliberate: it is what lets a rule catch it.

Component

A component answers "what is SQS?" — one file per product.

yaml
schemaVersion: "1"
type: "component"
id: "sqs"
kind: "queue"
provider: "aws"
docs: "https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html"
defaults:
  managed: true
  delivery: "at-least-once"
  ordering: "none"
  replay: false
  retentionDays: 4
properties:
  fifo:
    type: "boolean"
    default: false
  visibilityTimeoutSeconds:
    type: "integer"
    default: 30
FieldRequiredMeaning
kindyesThe id of exactly one kind
provideryesThe vendor that owns the product; the file lives in components/<provider>/
defaultsnoValues for kind properties that this product really changes. Every key must exist on the kind
propertiesnoProperties specific to this product. Must not redefine a kind property
docsnoThe official documentation page for the product

A defaults entry states the product's actual default behaviour, not a recommended configuration. SQS really does retain for four days; that is why the number is there.

Providers

Provider is ownership, not hosting. postgres is default even when it runs on RDS; aurora is aws because Amazon owns it. default covers open source, in-house generic components, and independent SaaS such as Stripe or Datadog.

ProviderComponentsShare
default1,06244.9%
aws30412.8%
gcp23710.0%
azure2038.6%
oci1757.4%
alibabacloud1134.8%
cloudflare1004.2%
ibm843.6%
digitalocean271.1%
openstack271.1%
k8s190.8%
outscale150.6%

A cloud provider's managed offering of an open-source product is its own component, not a flag on the original, because it is the resource a designer actually places and it carries its own defaults: backup retention, zone redundancy, encryption.

Property resolution order

For a node in a design, the effective value of a property is the first of these that exists:

  1. The node's own props
  2. The component's defaults
  3. The property definition's default — on the kind, or on the component for a component-specific property
  4. Absent

Absent is a real answer, not an error. Rules test for it with exists: false.

yaml
nodes:
  - id: "orders-queue"
    component: "sqs"
    props: { deadLetterQueue: true }

deadLetterQueue resolves to true from the node. delivery resolves to "at-least-once" from the component's defaults. ordering resolves to "none", which the component happens to pin to the same value the kind defaults to. retentionDays is 4, from the component. backoff has no default anywhere and no node value, so it is absent, and retry-without-backoff can say so.

A node may only set properties that exist on its component's kind or on the component itself. Setting an unknown property is a structural error.

Which kinds exist

Every kind has a reference page listing its properties, the rules that read them, and every component that implements it, grouped by provider.

Compute

Edge

Data

Messaging

Operations

Security

Client

External

Custom

On this page