container-superposition 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +843 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +1190 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/migrate-to-manifests.d.ts +12 -0
- package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
- package/dist/scripts/migrate-to-manifests.js +230 -0
- package/dist/scripts/migrate-to-manifests.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -0
- package/dist/tool/questionnaire/composer.d.ts.map +1 -0
- package/dist/tool/questionnaire/composer.js +1232 -0
- package/dist/tool/questionnaire/composer.js.map +1 -0
- package/dist/tool/readme/markdown-parser.d.ts +30 -0
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
- package/dist/tool/readme/markdown-parser.js +139 -0
- package/dist/tool/readme/markdown-parser.js.map +1 -0
- package/dist/tool/readme/readme-generator.d.ts +9 -0
- package/dist/tool/readme/readme-generator.d.ts.map +1 -0
- package/dist/tool/readme/readme-generator.js +422 -0
- package/dist/tool/readme/readme-generator.js.map +1 -0
- package/dist/tool/schema/custom-loader.d.ts +17 -0
- package/dist/tool/schema/custom-loader.d.ts.map +1 -0
- package/dist/tool/schema/custom-loader.js +149 -0
- package/dist/tool/schema/custom-loader.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +47 -0
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
- package/dist/tool/schema/overlay-loader.js +252 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -0
- package/dist/tool/schema/types.d.ts +212 -0
- package/dist/tool/schema/types.d.ts.map +1 -0
- package/dist/tool/schema/types.js +5 -0
- package/dist/tool/schema/types.js.map +1 -0
- package/docs/README.md +308 -0
- package/docs/architecture.md +233 -0
- package/docs/creating-overlays.md +549 -0
- package/docs/custom-patches.md +540 -0
- package/docs/dependencies.md +279 -0
- package/docs/examples/custom-patches-example.md +85 -0
- package/docs/examples.md +576 -0
- package/docs/messaging-comparison.md +265 -0
- package/docs/messaging-quick-start.md +385 -0
- package/docs/observability-workflow.md +537 -0
- package/docs/overlay-manifest-refactoring.md +214 -0
- package/docs/overlay-metadata-archive.md +54 -0
- package/docs/overlays.md +523 -0
- package/docs/presets-architecture.md +498 -0
- package/docs/presets.md +366 -0
- package/docs/publishing.md +476 -0
- package/docs/quick-reference.md +326 -0
- package/docs/ux.md +170 -0
- package/features/README.md +85 -0
- package/features/cross-distro-packages/README.md +146 -0
- package/features/cross-distro-packages/devcontainer-feature.json +20 -0
- package/features/cross-distro-packages/install.sh +58 -0
- package/features/local-secrets-manager/devcontainer-feature.json +18 -0
- package/features/local-secrets-manager/install.sh +127 -0
- package/features/project-scaffolder/devcontainer-feature.json +24 -0
- package/features/project-scaffolder/install.sh +100 -0
- package/features/team-conventions/devcontainer-feature.json +24 -0
- package/features/team-conventions/install.sh +93 -0
- package/overlays/.registry/README.md +14 -0
- package/overlays/.registry/base-images.yml +26 -0
- package/overlays/.registry/base-templates.yml +7 -0
- package/overlays/README.md +155 -0
- package/overlays/alertmanager/.env.example +5 -0
- package/overlays/alertmanager/README.md +465 -0
- package/overlays/alertmanager/alert-rules.yml +56 -0
- package/overlays/alertmanager/alertmanager.yml +42 -0
- package/overlays/alertmanager/devcontainer.patch.json +12 -0
- package/overlays/alertmanager/docker-compose.yml +20 -0
- package/overlays/alertmanager/overlay.yml +17 -0
- package/overlays/alertmanager/setup.sh +53 -0
- package/overlays/alertmanager/verify.sh +31 -0
- package/overlays/aws-cli/README.md +473 -0
- package/overlays/aws-cli/devcontainer.patch.json +13 -0
- package/overlays/aws-cli/overlay.yml +13 -0
- package/overlays/azure-cli/README.md +551 -0
- package/overlays/azure-cli/devcontainer.patch.json +8 -0
- package/overlays/azure-cli/overlay.yml +13 -0
- package/overlays/bun/README.md +312 -0
- package/overlays/bun/devcontainer.patch.json +41 -0
- package/overlays/bun/overlay.yml +16 -0
- package/overlays/bun/setup.sh +79 -0
- package/overlays/bun/verify.sh +30 -0
- package/overlays/codex/README.md +128 -0
- package/overlays/codex/devcontainer.patch.json +3 -0
- package/overlays/codex/overlay.yml +14 -0
- package/overlays/codex/setup.sh +24 -0
- package/overlays/codex/verify.sh +30 -0
- package/overlays/commitlint/README.md +333 -0
- package/overlays/commitlint/devcontainer.patch.json +8 -0
- package/overlays/commitlint/overlay.yml +16 -0
- package/overlays/commitlint/setup.sh +234 -0
- package/overlays/direnv/README.md +504 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/overlay.yml +13 -0
- package/overlays/direnv/setup.sh +139 -0
- package/overlays/docker-in-docker/README.md +534 -0
- package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
- package/overlays/docker-in-docker/overlay.yml +13 -0
- package/overlays/docker-sock/README.md +256 -0
- package/overlays/docker-sock/devcontainer.patch.json +9 -0
- package/overlays/docker-sock/docker-compose.yml +8 -0
- package/overlays/docker-sock/overlay.yml +13 -0
- package/overlays/dotnet/README.md +147 -0
- package/overlays/dotnet/devcontainer.patch.json +51 -0
- package/overlays/dotnet/global-tools.txt +24 -0
- package/overlays/dotnet/overlay.yml +13 -0
- package/overlays/dotnet/setup.sh +51 -0
- package/overlays/dotnet/verify.sh +26 -0
- package/overlays/gcloud/README.md +269 -0
- package/overlays/gcloud/devcontainer.patch.json +14 -0
- package/overlays/gcloud/overlay.yml +14 -0
- package/overlays/gcloud/verify.sh +52 -0
- package/overlays/git-helpers/README.md +168 -0
- package/overlays/git-helpers/devcontainer.patch.json +33 -0
- package/overlays/git-helpers/overlay.yml +15 -0
- package/overlays/git-helpers/setup.sh +91 -0
- package/overlays/go/README.md +293 -0
- package/overlays/go/devcontainer.patch.json +43 -0
- package/overlays/go/overlay.yml +15 -0
- package/overlays/go/setup.sh +33 -0
- package/overlays/go/verify.sh +40 -0
- package/overlays/grafana/.env.example +9 -0
- package/overlays/grafana/README.md +462 -0
- package/overlays/grafana/dashboard-provider.yml +11 -0
- package/overlays/grafana/dashboards/observability-overview.json +263 -0
- package/overlays/grafana/devcontainer.patch.json +12 -0
- package/overlays/grafana/docker-compose.yml +27 -0
- package/overlays/grafana/grafana-datasources.yml +57 -0
- package/overlays/grafana/overlay.yml +21 -0
- package/overlays/grafana/verify.sh +34 -0
- package/overlays/jaeger/.env.example +7 -0
- package/overlays/jaeger/README.md +867 -0
- package/overlays/jaeger/devcontainer.patch.json +12 -0
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +19 -0
- package/overlays/java/README.md +267 -0
- package/overlays/java/devcontainer.patch.json +44 -0
- package/overlays/java/overlay.yml +16 -0
- package/overlays/java/setup.sh +41 -0
- package/overlays/java/verify.sh +42 -0
- package/overlays/just/README.md +443 -0
- package/overlays/just/devcontainer.patch.json +3 -0
- package/overlays/just/overlay.yml +13 -0
- package/overlays/just/setup.sh +182 -0
- package/overlays/kubectl-helm/README.md +660 -0
- package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
- package/overlays/kubectl-helm/overlay.yml +13 -0
- package/overlays/loki/.env.example +5 -0
- package/overlays/loki/README.md +1156 -0
- package/overlays/loki/devcontainer.patch.json +12 -0
- package/overlays/loki/docker-compose.yml +18 -0
- package/overlays/loki/loki-config.yaml +45 -0
- package/overlays/loki/overlay.yml +17 -0
- package/overlays/minio/.env.example +9 -0
- package/overlays/minio/README.md +639 -0
- package/overlays/minio/devcontainer.patch.json +30 -0
- package/overlays/minio/docker-compose.yml +28 -0
- package/overlays/minio/overlay.yml +18 -0
- package/overlays/minio/setup.sh +61 -0
- package/overlays/minio/verify.sh +64 -0
- package/overlays/mkdocs/README.md +309 -0
- package/overlays/mkdocs/devcontainer.patch.json +24 -0
- package/overlays/mkdocs/overlay.yml +15 -0
- package/overlays/modern-cli-tools/README.md +556 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
- package/overlays/modern-cli-tools/overlay.yml +13 -0
- package/overlays/modern-cli-tools/setup.sh +153 -0
- package/overlays/mongodb/.env.example +9 -0
- package/overlays/mongodb/README.md +481 -0
- package/overlays/mongodb/devcontainer.patch.json +32 -0
- package/overlays/mongodb/docker-compose.yml +44 -0
- package/overlays/mongodb/overlay.yml +17 -0
- package/overlays/mongodb/verify.sh +48 -0
- package/overlays/mysql/.env.example +11 -0
- package/overlays/mysql/README.md +542 -0
- package/overlays/mysql/devcontainer.patch.json +34 -0
- package/overlays/mysql/docker-compose.yml +55 -0
- package/overlays/mysql/overlay.yml +16 -0
- package/overlays/mysql/verify.sh +48 -0
- package/overlays/nats/.env.example +5 -0
- package/overlays/nats/README.md +762 -0
- package/overlays/nats/devcontainer.patch.json +24 -0
- package/overlays/nats/docker-compose.yml +31 -0
- package/overlays/nats/overlay.yml +18 -0
- package/overlays/nats/verify.sh +50 -0
- package/overlays/ngrok/README.md +503 -0
- package/overlays/ngrok/devcontainer.patch.json +3 -0
- package/overlays/ngrok/overlay.yml +14 -0
- package/overlays/ngrok/setup.sh +125 -0
- package/overlays/nodejs/README.md +192 -0
- package/overlays/nodejs/devcontainer.patch.json +49 -0
- package/overlays/nodejs/global-packages.txt +16 -0
- package/overlays/nodejs/overlay.yml +14 -0
- package/overlays/nodejs/setup.sh +46 -0
- package/overlays/nodejs/verify.sh +32 -0
- package/overlays/otel-collector/.env.example +9 -0
- package/overlays/otel-collector/README.md +1257 -0
- package/overlays/otel-collector/devcontainer.patch.json +28 -0
- package/overlays/otel-collector/docker-compose.yml +22 -0
- package/overlays/otel-collector/otel-collector-config.yaml +68 -0
- package/overlays/otel-collector/overlay.yml +21 -0
- package/overlays/otel-collector/setup.sh +49 -0
- package/overlays/otel-demo-nodejs/.env.example +2 -0
- package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
- package/overlays/otel-demo-nodejs/README.md +409 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
- package/overlays/otel-demo-nodejs/overlay.yml +23 -0
- package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
- package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
- package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
- package/overlays/otel-demo-nodejs/verify.sh +31 -0
- package/overlays/otel-demo-python/.env.example +2 -0
- package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
- package/overlays/otel-demo-python/README.md +82 -0
- package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
- package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-python/docker-compose.yml +19 -0
- package/overlays/otel-demo-python/overlay.yml +23 -0
- package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
- package/overlays/otel-demo-python/verify.sh +31 -0
- package/overlays/playwright/README.md +629 -0
- package/overlays/playwright/devcontainer.patch.json +9 -0
- package/overlays/playwright/overlay.yml +13 -0
- package/overlays/postgres/.env.example +6 -0
- package/overlays/postgres/README.md +602 -0
- package/overlays/postgres/devcontainer.patch.json +21 -0
- package/overlays/postgres/docker-compose.yml +22 -0
- package/overlays/postgres/overlay.yml +15 -0
- package/overlays/postgres/verify.sh +45 -0
- package/overlays/powershell/README.md +314 -0
- package/overlays/powershell/devcontainer.patch.json +22 -0
- package/overlays/powershell/overlay.yml +13 -0
- package/overlays/powershell/setup.sh +29 -0
- package/overlays/powershell/verify.sh +38 -0
- package/overlays/pre-commit/README.md +263 -0
- package/overlays/pre-commit/devcontainer.patch.json +9 -0
- package/overlays/pre-commit/overlay.yml +16 -0
- package/overlays/pre-commit/setup.sh +129 -0
- package/overlays/presets/docs-site.yml +118 -0
- package/overlays/presets/fullstack.yml +181 -0
- package/overlays/presets/microservice.yml +118 -0
- package/overlays/presets/web-api.yml +109 -0
- package/overlays/prometheus/.env.example +5 -0
- package/overlays/prometheus/README.md +1246 -0
- package/overlays/prometheus/devcontainer.patch.json +12 -0
- package/overlays/prometheus/docker-compose.yml +22 -0
- package/overlays/prometheus/overlay.yml +17 -0
- package/overlays/prometheus/prometheus.yml +12 -0
- package/overlays/prometheus/verify.sh +34 -0
- package/overlays/promtail/.env.example +2 -0
- package/overlays/promtail/README.md +357 -0
- package/overlays/promtail/devcontainer.patch.json +5 -0
- package/overlays/promtail/docker-compose.yml +16 -0
- package/overlays/promtail/overlay.yml +17 -0
- package/overlays/promtail/promtail-config.yaml +60 -0
- package/overlays/promtail/verify.sh +31 -0
- package/overlays/pulumi/README.md +472 -0
- package/overlays/pulumi/devcontainer.patch.json +13 -0
- package/overlays/pulumi/overlay.yml +14 -0
- package/overlays/pulumi/verify.sh +31 -0
- package/overlays/python/README.md +919 -0
- package/overlays/python/devcontainer.patch.json +41 -0
- package/overlays/python/overlay.yml +12 -0
- package/overlays/python/requirements-overlay.txt +13 -0
- package/overlays/python/setup.sh +47 -0
- package/overlays/python/verify.sh +32 -0
- package/overlays/rabbitmq/.env.example +7 -0
- package/overlays/rabbitmq/README.md +680 -0
- package/overlays/rabbitmq/devcontainer.patch.json +28 -0
- package/overlays/rabbitmq/docker-compose.yml +30 -0
- package/overlays/rabbitmq/overlay.yml +18 -0
- package/overlays/rabbitmq/verify.sh +41 -0
- package/overlays/redis/.env.example +4 -0
- package/overlays/redis/README.md +776 -0
- package/overlays/redis/devcontainer.patch.json +21 -0
- package/overlays/redis/docker-compose.yml +21 -0
- package/overlays/redis/overlay.yml +15 -0
- package/overlays/redis/verify.sh +41 -0
- package/overlays/redpanda/.env.example +10 -0
- package/overlays/redpanda/README.md +703 -0
- package/overlays/redpanda/devcontainer.patch.json +37 -0
- package/overlays/redpanda/docker-compose.yml +67 -0
- package/overlays/redpanda/overlay.yml +21 -0
- package/overlays/redpanda/verify.sh +48 -0
- package/overlays/rust/README.md +299 -0
- package/overlays/rust/devcontainer.patch.json +39 -0
- package/overlays/rust/overlay.yml +15 -0
- package/overlays/rust/setup.sh +36 -0
- package/overlays/rust/verify.sh +51 -0
- package/overlays/sqlite/README.md +584 -0
- package/overlays/sqlite/devcontainer.patch.json +14 -0
- package/overlays/sqlite/overlay.yml +15 -0
- package/overlays/sqlite/setup.sh +27 -0
- package/overlays/sqlite/verify.sh +43 -0
- package/overlays/sqlserver/.env.example +6 -0
- package/overlays/sqlserver/README.md +592 -0
- package/overlays/sqlserver/devcontainer.patch.json +22 -0
- package/overlays/sqlserver/docker-compose.yml +32 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/sqlserver/verify.sh +30 -0
- package/overlays/tempo/.env.example +5 -0
- package/overlays/tempo/README.md +273 -0
- package/overlays/tempo/devcontainer.patch.json +12 -0
- package/overlays/tempo/docker-compose.yml +20 -0
- package/overlays/tempo/overlay.yml +20 -0
- package/overlays/tempo/tempo-config.yaml +32 -0
- package/overlays/tempo/verify.sh +31 -0
- package/overlays/terraform/README.md +389 -0
- package/overlays/terraform/devcontainer.patch.json +15 -0
- package/overlays/terraform/overlay.yml +14 -0
- package/overlays/terraform/verify.sh +63 -0
- package/package.json +74 -0
- package/templates/README.md +285 -0
- package/templates/compose/.devcontainer/devcontainer.json +46 -0
- package/templates/compose/.devcontainer/docker-compose.yml +12 -0
- package/templates/compose/README.md +20 -0
- package/templates/plain/.devcontainer/devcontainer.json +35 -0
- package/templates/plain/README.md +21 -0
- package/tool/README.md +281 -0
- package/tool/schema/base-images.schema.json +43 -0
- package/tool/schema/base-templates.schema.json +34 -0
- package/tool/schema/config.schema.json +71 -0
- package/tool/schema/overlay-manifest.schema.json +86 -0
|
@@ -0,0 +1,762 @@
|
|
|
1
|
+
# NATS Overlay
|
|
2
|
+
|
|
3
|
+
Lightweight, high-performance messaging system for microservices, IoT, and real-time applications.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **NATS Server** - Fast, simple pub/sub messaging
|
|
8
|
+
- **JetStream** - Persistence, streaming, and exactly-once delivery
|
|
9
|
+
- **Monitoring UI** - HTTP monitoring endpoint with JSON stats (port 8222)
|
|
10
|
+
- **Low Latency** - Microsecond-level message delivery
|
|
11
|
+
- **Simple Protocol** - Text-based protocol, easy debugging
|
|
12
|
+
- **Subject-based Messaging** - Hierarchical subject routing with wildcards
|
|
13
|
+
- **Docker Compose service** - Runs as separate container
|
|
14
|
+
- **Environment configuration** - Customizable via `.env` file
|
|
15
|
+
|
|
16
|
+
## How It Works
|
|
17
|
+
|
|
18
|
+
This overlay adds NATS as a Docker Compose service with JetStream enabled for persistence and advanced features. NATS is optimized for speed and simplicity, making it ideal for microservices communication and real-time messaging.
|
|
19
|
+
|
|
20
|
+
**Architecture:**
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
graph TD
|
|
24
|
+
A[Development Container<br/>Your application code<br/>NATS client libraries<br/>Connects to nats:4222] -->|Docker network devnet| B[NATS Container<br/>Client port 4222<br/>Monitoring 8222<br/>JetStream enabled<br/>Message persistence]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Configuration
|
|
28
|
+
|
|
29
|
+
### Environment Variables
|
|
30
|
+
|
|
31
|
+
The overlay includes a `.env.example` file. Copy it to `.env` and customize:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cd .devcontainer
|
|
35
|
+
cp .env.example .env
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Default values (.env.example):**
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# NATS Configuration
|
|
42
|
+
NATS_VERSION=latest
|
|
43
|
+
NATS_CLIENT_PORT=4222
|
|
44
|
+
NATS_HTTP_PORT=8222
|
|
45
|
+
NATS_CLUSTER_PORT=6222
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Port Configuration
|
|
49
|
+
|
|
50
|
+
Default ports can be changed via the `--port-offset` option:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Offset all ports by 100
|
|
54
|
+
container-superposition --port-offset 100
|
|
55
|
+
|
|
56
|
+
# NATS will be on:
|
|
57
|
+
# - Client: 4322 (instead of 4222)
|
|
58
|
+
# - Monitoring: 8322 (instead of 8222)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Connection Information
|
|
62
|
+
|
|
63
|
+
### From Development Container
|
|
64
|
+
|
|
65
|
+
**NATS Connection:**
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Hostname: nats (Docker Compose service name)
|
|
69
|
+
# Port: 4222
|
|
70
|
+
# URL: nats://nats:4222
|
|
71
|
+
|
|
72
|
+
# Environment variable (pre-configured)
|
|
73
|
+
echo $NATS_URL
|
|
74
|
+
# Output: nats://nats:4222
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Monitoring UI:**
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
http://nats:8222
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### From Host Machine
|
|
84
|
+
|
|
85
|
+
**NATS Connection:**
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Hostname: localhost
|
|
89
|
+
# Port: 4222 (or 4222 + port-offset)
|
|
90
|
+
# URL: nats://localhost:4222
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Monitoring UI:**
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
http://localhost:8222
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Provides JSON endpoints:
|
|
100
|
+
|
|
101
|
+
- `/varz` - Server information
|
|
102
|
+
- `/connz` - Connection information
|
|
103
|
+
- `/routez` - Route information
|
|
104
|
+
- `/subsz` - Subscription information
|
|
105
|
+
- `/jsz` - JetStream information
|
|
106
|
+
|
|
107
|
+
## Common Commands
|
|
108
|
+
|
|
109
|
+
### Using NATS CLI (via docker exec)
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Server info
|
|
113
|
+
docker exec nats nats-server --version
|
|
114
|
+
|
|
115
|
+
# Publish a message
|
|
116
|
+
docker exec nats nats pub test.subject "Hello NATS"
|
|
117
|
+
|
|
118
|
+
# Subscribe to subjects
|
|
119
|
+
docker exec -it nats nats sub test.subject
|
|
120
|
+
docker exec -it nats nats sub "test.>" # Wildcard
|
|
121
|
+
|
|
122
|
+
# Request/reply
|
|
123
|
+
docker exec -it nats nats reply test.request "response message"
|
|
124
|
+
docker exec nats nats request test.request "request message"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### JetStream Commands
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Create a stream
|
|
131
|
+
docker exec nats nats stream add mystream \
|
|
132
|
+
--subjects "events.>" \
|
|
133
|
+
--storage file \
|
|
134
|
+
--retention limits
|
|
135
|
+
|
|
136
|
+
# List streams
|
|
137
|
+
docker exec nats nats stream list
|
|
138
|
+
|
|
139
|
+
# Stream info
|
|
140
|
+
docker exec nats nats stream info mystream
|
|
141
|
+
|
|
142
|
+
# Publish to stream
|
|
143
|
+
docker exec nats nats pub events.user.created '{"id": 1, "name": "Alice"}'
|
|
144
|
+
|
|
145
|
+
# Create consumer
|
|
146
|
+
docker exec nats nats consumer add mystream myconsumer \
|
|
147
|
+
--filter events.user.> \
|
|
148
|
+
--deliver all \
|
|
149
|
+
--replay instant
|
|
150
|
+
|
|
151
|
+
# Consume messages
|
|
152
|
+
docker exec -it nats nats consumer next mystream myconsumer
|
|
153
|
+
|
|
154
|
+
# Delete stream
|
|
155
|
+
docker exec nats nats stream rm mystream
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Monitoring
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Get server stats
|
|
162
|
+
curl http://localhost:8222/varz | jq
|
|
163
|
+
|
|
164
|
+
# Check connections
|
|
165
|
+
curl http://localhost:8222/connz | jq
|
|
166
|
+
|
|
167
|
+
# JetStream stats
|
|
168
|
+
curl http://localhost:8222/jsz | jq
|
|
169
|
+
|
|
170
|
+
# Health check
|
|
171
|
+
curl http://localhost:8222/healthz
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Application Integration
|
|
175
|
+
|
|
176
|
+
### Node.js Example
|
|
177
|
+
|
|
178
|
+
Install NATS client:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
npm install nats
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Publisher (publisher.js):**
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
const { connect, StringCodec } = require('nats');
|
|
188
|
+
|
|
189
|
+
async function publish() {
|
|
190
|
+
const nc = await connect({ servers: 'nats://nats:4222' });
|
|
191
|
+
const sc = StringCodec();
|
|
192
|
+
|
|
193
|
+
// Simple publish
|
|
194
|
+
nc.publish('updates.user', sc.encode('User updated'));
|
|
195
|
+
console.log('Published message');
|
|
196
|
+
|
|
197
|
+
// Request/reply
|
|
198
|
+
const response = await nc.request('time', sc.encode(''), { timeout: 1000 });
|
|
199
|
+
console.log('Response:', sc.decode(response.data));
|
|
200
|
+
|
|
201
|
+
await nc.drain();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
publish().catch(console.error);
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Subscriber (subscriber.js):**
|
|
208
|
+
|
|
209
|
+
```javascript
|
|
210
|
+
const { connect, StringCodec } = require('nats');
|
|
211
|
+
|
|
212
|
+
async function subscribe() {
|
|
213
|
+
const nc = await connect({ servers: 'nats://nats:4222' });
|
|
214
|
+
const sc = StringCodec();
|
|
215
|
+
|
|
216
|
+
// Subscribe to subject
|
|
217
|
+
const sub = nc.subscribe('updates.>');
|
|
218
|
+
console.log('Listening for messages...');
|
|
219
|
+
|
|
220
|
+
for await (const msg of sub) {
|
|
221
|
+
console.log(`[${msg.subject}]: ${sc.decode(msg.data)}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
subscribe().catch(console.error);
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**JetStream Example (stream.js):**
|
|
229
|
+
|
|
230
|
+
```javascript
|
|
231
|
+
const { connect, StringCodec } = require('nats');
|
|
232
|
+
|
|
233
|
+
async function jetstream() {
|
|
234
|
+
const nc = await connect({ servers: 'nats://nats:4222' });
|
|
235
|
+
const js = nc.jetstream();
|
|
236
|
+
const sc = StringCodec();
|
|
237
|
+
|
|
238
|
+
// Create stream
|
|
239
|
+
await js.streams.add({
|
|
240
|
+
name: 'EVENTS',
|
|
241
|
+
subjects: ['events.>'],
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// Publish to stream
|
|
245
|
+
await js.publish('events.user.created', sc.encode('{"id": 1}'));
|
|
246
|
+
console.log('Published to stream');
|
|
247
|
+
|
|
248
|
+
// Create consumer
|
|
249
|
+
const consumer = await js.consumers.get('EVENTS', 'myconsumer');
|
|
250
|
+
const messages = await consumer.consume();
|
|
251
|
+
|
|
252
|
+
for await (const msg of messages) {
|
|
253
|
+
console.log(`Received: ${sc.decode(msg.data)}`);
|
|
254
|
+
msg.ack();
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
await nc.close();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
jetstream().catch(console.error);
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Python Example
|
|
264
|
+
|
|
265
|
+
Install NATS client:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
pip install nats-py
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**Publisher (publisher.py):**
|
|
272
|
+
|
|
273
|
+
```python
|
|
274
|
+
import asyncio
|
|
275
|
+
from nats.aio.client import Client as NATS
|
|
276
|
+
|
|
277
|
+
async def publish():
|
|
278
|
+
nc = NATS()
|
|
279
|
+
await nc.connect("nats://nats:4222")
|
|
280
|
+
|
|
281
|
+
# Simple publish
|
|
282
|
+
await nc.publish("updates.user", b"User updated")
|
|
283
|
+
print("Published message")
|
|
284
|
+
|
|
285
|
+
# Request/reply
|
|
286
|
+
response = await nc.request("time", b"", timeout=1)
|
|
287
|
+
print(f"Response: {response.data.decode()}")
|
|
288
|
+
|
|
289
|
+
await nc.close()
|
|
290
|
+
|
|
291
|
+
if __name__ == '__main__':
|
|
292
|
+
asyncio.run(publish())
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
**Subscriber (subscriber.py):**
|
|
296
|
+
|
|
297
|
+
```python
|
|
298
|
+
import asyncio
|
|
299
|
+
from nats.aio.client import Client as NATS
|
|
300
|
+
|
|
301
|
+
async def message_handler(msg):
|
|
302
|
+
subject = msg.subject
|
|
303
|
+
data = msg.data.decode()
|
|
304
|
+
print(f"[{subject}]: {data}")
|
|
305
|
+
|
|
306
|
+
async def subscribe():
|
|
307
|
+
nc = NATS()
|
|
308
|
+
await nc.connect("nats://nats:4222")
|
|
309
|
+
|
|
310
|
+
# Subscribe to subject
|
|
311
|
+
await nc.subscribe("updates.>", cb=message_handler)
|
|
312
|
+
print("Listening for messages...")
|
|
313
|
+
|
|
314
|
+
# Keep running
|
|
315
|
+
while True:
|
|
316
|
+
await asyncio.sleep(1)
|
|
317
|
+
|
|
318
|
+
if __name__ == '__main__':
|
|
319
|
+
asyncio.run(subscribe())
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**JetStream Example (stream.py):**
|
|
323
|
+
|
|
324
|
+
```python
|
|
325
|
+
import asyncio
|
|
326
|
+
from nats.aio.client import Client as NATS
|
|
327
|
+
|
|
328
|
+
async def jetstream():
|
|
329
|
+
nc = NATS()
|
|
330
|
+
await nc.connect("nats://nats:4222")
|
|
331
|
+
js = nc.jetstream()
|
|
332
|
+
|
|
333
|
+
# Create stream
|
|
334
|
+
await js.add_stream(name="EVENTS", subjects=["events.>"])
|
|
335
|
+
|
|
336
|
+
# Publish to stream
|
|
337
|
+
await js.publish("events.user.created", b'{"id": 1}')
|
|
338
|
+
print("Published to stream")
|
|
339
|
+
|
|
340
|
+
# Subscribe to stream
|
|
341
|
+
sub = await js.subscribe("events.>", durable="myconsumer")
|
|
342
|
+
|
|
343
|
+
async for msg in sub.messages:
|
|
344
|
+
print(f"Received: {msg.data.decode()}")
|
|
345
|
+
await msg.ack()
|
|
346
|
+
|
|
347
|
+
await nc.close()
|
|
348
|
+
|
|
349
|
+
if __name__ == '__main__':
|
|
350
|
+
asyncio.run(jetstream())
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Go Example
|
|
354
|
+
|
|
355
|
+
Install NATS client:
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
go get github.com/nats-io/nats.go
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
**Publisher (publisher.go):**
|
|
362
|
+
|
|
363
|
+
```go
|
|
364
|
+
package main
|
|
365
|
+
|
|
366
|
+
import (
|
|
367
|
+
"log"
|
|
368
|
+
"time"
|
|
369
|
+
|
|
370
|
+
"github.com/nats-io/nats.go"
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
func main() {
|
|
374
|
+
nc, err := nats.Connect("nats://nats:4222")
|
|
375
|
+
if err != nil {
|
|
376
|
+
log.Fatal(err)
|
|
377
|
+
}
|
|
378
|
+
defer nc.Close()
|
|
379
|
+
|
|
380
|
+
// Simple publish
|
|
381
|
+
nc.Publish("updates.user", []byte("User updated"))
|
|
382
|
+
log.Println("Published message")
|
|
383
|
+
|
|
384
|
+
// Request/reply
|
|
385
|
+
msg, err := nc.Request("time", []byte(""), 1*time.Second)
|
|
386
|
+
if err != nil {
|
|
387
|
+
log.Fatal(err)
|
|
388
|
+
}
|
|
389
|
+
log.Printf("Response: %s", string(msg.Data))
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Subscriber (subscriber.go):**
|
|
394
|
+
|
|
395
|
+
```go
|
|
396
|
+
package main
|
|
397
|
+
|
|
398
|
+
import (
|
|
399
|
+
"log"
|
|
400
|
+
"runtime"
|
|
401
|
+
|
|
402
|
+
"github.com/nats-io/nats.go"
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
func main() {
|
|
406
|
+
nc, err := nats.Connect("nats://nats:4222")
|
|
407
|
+
if err != nil {
|
|
408
|
+
log.Fatal(err)
|
|
409
|
+
}
|
|
410
|
+
defer nc.Close()
|
|
411
|
+
|
|
412
|
+
// Subscribe to subject
|
|
413
|
+
sub, err := nc.Subscribe("updates.>", func(msg *nats.Msg) {
|
|
414
|
+
log.Printf("[%s]: %s", msg.Subject, string(msg.Data))
|
|
415
|
+
})
|
|
416
|
+
if err != nil {
|
|
417
|
+
log.Fatal(err)
|
|
418
|
+
}
|
|
419
|
+
defer sub.Unsubscribe()
|
|
420
|
+
|
|
421
|
+
log.Println("Listening for messages...")
|
|
422
|
+
runtime.Goexit()
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
**JetStream Example (stream.go):**
|
|
427
|
+
|
|
428
|
+
```go
|
|
429
|
+
package main
|
|
430
|
+
|
|
431
|
+
import (
|
|
432
|
+
"context"
|
|
433
|
+
"log"
|
|
434
|
+
|
|
435
|
+
"github.com/nats-io/nats.go"
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
func main() {
|
|
439
|
+
nc, err := nats.Connect("nats://nats:4222")
|
|
440
|
+
if err != nil {
|
|
441
|
+
log.Fatal(err)
|
|
442
|
+
}
|
|
443
|
+
defer nc.Close()
|
|
444
|
+
|
|
445
|
+
js, err := nc.JetStream()
|
|
446
|
+
if err != nil {
|
|
447
|
+
log.Fatal(err)
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Create stream
|
|
451
|
+
_, err = js.AddStream(&nats.StreamConfig{
|
|
452
|
+
Name: "EVENTS",
|
|
453
|
+
Subjects: []string{"events.>"},
|
|
454
|
+
})
|
|
455
|
+
if err != nil {
|
|
456
|
+
log.Fatal(err)
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Publish to stream
|
|
460
|
+
_, err = js.Publish("events.user.created", []byte(`{"id": 1}`))
|
|
461
|
+
if err != nil {
|
|
462
|
+
log.Fatal(err)
|
|
463
|
+
}
|
|
464
|
+
log.Println("Published to stream")
|
|
465
|
+
|
|
466
|
+
// Subscribe to stream
|
|
467
|
+
sub, err := js.SubscribeSync("events.>", nats.Durable("myconsumer"))
|
|
468
|
+
if err != nil {
|
|
469
|
+
log.Fatal(err)
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
for {
|
|
473
|
+
msg, err := sub.NextMsg(context.Background())
|
|
474
|
+
if err != nil {
|
|
475
|
+
log.Fatal(err)
|
|
476
|
+
}
|
|
477
|
+
log.Printf("Received: %s", string(msg.Data))
|
|
478
|
+
msg.Ack()
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### .NET Example
|
|
484
|
+
|
|
485
|
+
Install NATS client:
|
|
486
|
+
|
|
487
|
+
```bash
|
|
488
|
+
dotnet add package NATS.Client
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**Publisher (Publisher.cs):**
|
|
492
|
+
|
|
493
|
+
```csharp
|
|
494
|
+
using NATS.Client;
|
|
495
|
+
using System.Text;
|
|
496
|
+
|
|
497
|
+
var factory = new ConnectionFactory();
|
|
498
|
+
using var connection = factory.CreateConnection("nats://nats:4222");
|
|
499
|
+
|
|
500
|
+
// Simple publish
|
|
501
|
+
connection.Publish("updates.user", Encoding.UTF8.GetBytes("User updated"));
|
|
502
|
+
Console.WriteLine("Published message");
|
|
503
|
+
|
|
504
|
+
// Request/reply
|
|
505
|
+
var reply = connection.Request("time", Encoding.UTF8.GetBytes(""), 1000);
|
|
506
|
+
Console.WriteLine($"Response: {Encoding.UTF8.GetString(reply.Data)}");
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
**Subscriber (Subscriber.cs):**
|
|
510
|
+
|
|
511
|
+
```csharp
|
|
512
|
+
using NATS.Client;
|
|
513
|
+
using System.Text;
|
|
514
|
+
|
|
515
|
+
var factory = new ConnectionFactory();
|
|
516
|
+
using var connection = factory.CreateConnection("nats://nats:4222");
|
|
517
|
+
|
|
518
|
+
// Subscribe to subject
|
|
519
|
+
var subscription = connection.SubscribeAsync("updates.>", (sender, args) =>
|
|
520
|
+
{
|
|
521
|
+
var subject = args.Message.Subject;
|
|
522
|
+
var data = Encoding.UTF8.GetString(args.Message.Data);
|
|
523
|
+
Console.WriteLine($"[{subject}]: {data}");
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
Console.WriteLine("Listening for messages...");
|
|
527
|
+
Console.WriteLine("Press [enter] to exit.");
|
|
528
|
+
Console.ReadLine();
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
## Use Cases
|
|
532
|
+
|
|
533
|
+
- **Microservices Communication** - Fast, simple service-to-service messaging
|
|
534
|
+
- **Pub/Sub Messaging** - Broadcast events to multiple subscribers
|
|
535
|
+
- **Request/Reply** - Synchronous RPC-style communication
|
|
536
|
+
- **Event Streaming** - JetStream provides Kafka-like streaming
|
|
537
|
+
- **IoT Messaging** - Low overhead, high performance for edge devices
|
|
538
|
+
- **Real-Time Updates** - WebSocket/SSE alternative for live data
|
|
539
|
+
- **Command/Control** - Distribute commands to workers
|
|
540
|
+
- **Service Discovery** - Dynamic service registration and lookup
|
|
541
|
+
|
|
542
|
+
**Integrates well with:**
|
|
543
|
+
|
|
544
|
+
- Language overlays (Node.js, Python, Go, .NET, Java) with NATS clients
|
|
545
|
+
- Observability stack (OTEL Collector, Prometheus) for metrics
|
|
546
|
+
- Microservice architectures requiring fast messaging
|
|
547
|
+
|
|
548
|
+
## NATS vs Other Messaging Systems
|
|
549
|
+
|
|
550
|
+
| Feature | NATS | RabbitMQ | Redpanda/Kafka |
|
|
551
|
+
| ------------------ | ------------------ | ---------------- | --------------- |
|
|
552
|
+
| **Latency** | ✅ Microseconds | ⚠️ Milliseconds | ⚠️ Milliseconds |
|
|
553
|
+
| **Throughput** | ✅ Very high | ✅ High | ✅ Very high |
|
|
554
|
+
| **Resource Usage** | ✅ Minimal | ⚠️ Moderate | ⚠️ High |
|
|
555
|
+
| **Complexity** | ✅ Simple | ⚠️ Moderate | ⚠️ Complex |
|
|
556
|
+
| **Persistence** | ✅ JetStream | ✅ Native | ✅ Native |
|
|
557
|
+
| **Protocol** | Text-based | AMQP (binary) | Binary |
|
|
558
|
+
| **Use Case** | Microservices, IoT | Task queues, RPC | Event streaming |
|
|
559
|
+
| **Setup** | ✅ Seconds | ⚠️ Minutes | ⚠️ Minutes |
|
|
560
|
+
|
|
561
|
+
**Recommendation:** Use NATS for microservices and real-time messaging where speed and simplicity matter. Use RabbitMQ for complex routing and task queues. Use Redpanda/Kafka for high-volume event streaming.
|
|
562
|
+
|
|
563
|
+
## Messaging Patterns
|
|
564
|
+
|
|
565
|
+
### Publish/Subscribe
|
|
566
|
+
|
|
567
|
+
```
|
|
568
|
+
Publisher → Subject "updates.>" → Subscriber 1
|
|
569
|
+
→ Subscriber 2
|
|
570
|
+
→ Subscriber 3
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
All subscribers receive every message on matching subjects.
|
|
574
|
+
|
|
575
|
+
### Request/Reply
|
|
576
|
+
|
|
577
|
+
```
|
|
578
|
+
Client → Request "api.user.get" → Service
|
|
579
|
+
← Reply ─────────────────────┘
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
Synchronous RPC-style communication.
|
|
583
|
+
|
|
584
|
+
### Queue Groups
|
|
585
|
+
|
|
586
|
+
```
|
|
587
|
+
Publisher → Subject → Queue Group "workers"
|
|
588
|
+
→ Worker 1 (gets msg 1, 3, 5...)
|
|
589
|
+
→ Worker 2 (gets msg 2, 4, 6...)
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
Load balancing across workers.
|
|
593
|
+
|
|
594
|
+
### Subject Hierarchy
|
|
595
|
+
|
|
596
|
+
```
|
|
597
|
+
events.user.created
|
|
598
|
+
events.user.updated
|
|
599
|
+
events.order.created
|
|
600
|
+
events.order.shipped
|
|
601
|
+
|
|
602
|
+
Subscribe to:
|
|
603
|
+
- "events.user.*" → user events only
|
|
604
|
+
- "events.>" → all events
|
|
605
|
+
- "events.*.created" → all created events
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
## Troubleshooting
|
|
609
|
+
|
|
610
|
+
### Service Not Starting
|
|
611
|
+
|
|
612
|
+
**Check logs:**
|
|
613
|
+
|
|
614
|
+
```bash
|
|
615
|
+
docker logs nats
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
**Common issues:**
|
|
619
|
+
|
|
620
|
+
- Port conflicts (4222 or 8222 already in use)
|
|
621
|
+
- Volume permission issues
|
|
622
|
+
- Insufficient disk space for JetStream
|
|
623
|
+
|
|
624
|
+
### Cannot Connect to NATS
|
|
625
|
+
|
|
626
|
+
**Verify service is running:**
|
|
627
|
+
|
|
628
|
+
```bash
|
|
629
|
+
docker ps | grep nats
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
**Check health:**
|
|
633
|
+
|
|
634
|
+
```bash
|
|
635
|
+
curl http://localhost:8222/healthz
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
**Test connectivity:**
|
|
639
|
+
|
|
640
|
+
```bash
|
|
641
|
+
# From dev container
|
|
642
|
+
curl http://nats:8222/varz
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
### Messages Not Being Received
|
|
646
|
+
|
|
647
|
+
**Check subscriptions:**
|
|
648
|
+
|
|
649
|
+
```bash
|
|
650
|
+
curl http://localhost:8222/subsz | jq
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
**Verify subject matches:**
|
|
654
|
+
NATS subjects are case-sensitive and must match exactly.
|
|
655
|
+
|
|
656
|
+
**Check queue group:**
|
|
657
|
+
If using queue groups, only one member receives each message.
|
|
658
|
+
|
|
659
|
+
### JetStream Issues
|
|
660
|
+
|
|
661
|
+
**Check JetStream is enabled:**
|
|
662
|
+
|
|
663
|
+
```bash
|
|
664
|
+
curl http://localhost:8222/jsz | jq
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
**Verify stream exists:**
|
|
668
|
+
|
|
669
|
+
```bash
|
|
670
|
+
docker exec nats nats stream list
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
**Check consumer status:**
|
|
674
|
+
|
|
675
|
+
```bash
|
|
676
|
+
docker exec nats nats consumer info STREAMNAME CONSUMERNAME
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
### Performance Issues
|
|
680
|
+
|
|
681
|
+
**Monitor server stats:**
|
|
682
|
+
|
|
683
|
+
```bash
|
|
684
|
+
curl http://localhost:8222/varz | jq
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
**Check memory usage:**
|
|
688
|
+
|
|
689
|
+
```bash
|
|
690
|
+
docker stats nats
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
**Review slow consumers:**
|
|
694
|
+
|
|
695
|
+
```bash
|
|
696
|
+
curl http://localhost:8222/connz?state=slow_consumer | jq
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
## Security Considerations
|
|
700
|
+
|
|
701
|
+
⚠️ **Development Configuration:**
|
|
702
|
+
|
|
703
|
+
- No authentication enabled by default
|
|
704
|
+
- Suitable for local development only
|
|
705
|
+
- Do not expose ports publicly
|
|
706
|
+
|
|
707
|
+
**Production Recommendations:**
|
|
708
|
+
|
|
709
|
+
- Enable user authentication
|
|
710
|
+
- Use TLS for encryption
|
|
711
|
+
- Configure authorization rules
|
|
712
|
+
- Enable accounts for multi-tenancy
|
|
713
|
+
- Monitor security logs
|
|
714
|
+
- Regularly update NATS version
|
|
715
|
+
|
|
716
|
+
**Enabling Authentication (production):**
|
|
717
|
+
|
|
718
|
+
```bash
|
|
719
|
+
# Create nats.conf
|
|
720
|
+
authentication {
|
|
721
|
+
users = [
|
|
722
|
+
{user: "app", password: "secret"}
|
|
723
|
+
]
|
|
724
|
+
}
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
See [NATS Security Documentation](https://docs.nats.io/running-a-nats-service/configuration/securing_nats) for details.
|
|
728
|
+
|
|
729
|
+
## Related Overlays
|
|
730
|
+
|
|
731
|
+
**Alternative Messaging Systems:**
|
|
732
|
+
|
|
733
|
+
- `rabbitmq` - AMQP message broker (better for complex routing)
|
|
734
|
+
- `redpanda` - Kafka-compatible streaming (better for high-volume logs)
|
|
735
|
+
|
|
736
|
+
**Complementary Overlays:**
|
|
737
|
+
|
|
738
|
+
- Language overlays - Application development with NATS clients
|
|
739
|
+
- `otel-collector` - Distributed tracing and metrics
|
|
740
|
+
- `prometheus` - Metrics collection from NATS
|
|
741
|
+
- `grafana` - Visualization of messaging metrics
|
|
742
|
+
|
|
743
|
+
## Additional Resources
|
|
744
|
+
|
|
745
|
+
- [Official NATS Documentation](https://docs.nats.io/)
|
|
746
|
+
- [NATS by Example](https://natsbyexample.com/)
|
|
747
|
+
- [JetStream Documentation](https://docs.nats.io/nats-concepts/jetstream)
|
|
748
|
+
- [NATS Client Libraries](https://docs.nats.io/using-nats/developer)
|
|
749
|
+
- [NATS Design Philosophy](https://docs.nats.io/nats-concepts/overview)
|
|
750
|
+
|
|
751
|
+
## Notes
|
|
752
|
+
|
|
753
|
+
- NATS is written in Go for high performance
|
|
754
|
+
- Subject names are hierarchical and case-sensitive
|
|
755
|
+
- Wildcards: `*` matches one token, `>` matches multiple tokens
|
|
756
|
+
- JetStream provides persistence and exactly-once delivery
|
|
757
|
+
- Core NATS is fire-and-forget (at-most-once delivery)
|
|
758
|
+
- Maximum message size is 1 MB by default
|
|
759
|
+
- Supports both binary and JSON message formats
|
|
760
|
+
- Monitoring endpoint provides JSON stats
|
|
761
|
+
- Can run in cluster mode for high availability
|
|
762
|
+
- Very low memory and CPU footprint
|