Skip to content

Commit

Permalink
Merge pull request #194 from nats-io/jarema/add-stream-consumer-metadata
Browse files Browse the repository at this point in the history
Add metadata ADR
  • Loading branch information
Jarema committed Jan 24, 2023
2 parents 5a0c67b + 5af48a9 commit 282b9b4
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 15 deletions.
33 changes: 18 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ This repo is used to capture architectural and design decisions as a reference o
|[ADR-22](adr/ADR-22.md)|jetstream, client|JetStream Publish Retries on No Responders|
|[ADR-31](adr/ADR-31.md)|jetstream, client, server|JetStream Direct Get|
|[ADR-32](adr/ADR-32.md)|client|Service API|
|[ADR-33](adr/ADR-33.md)|jetstream, client, server|Metadata for Stream and Consumer|

## Jetstream

Expand All @@ -50,6 +51,7 @@ This repo is used to capture architectural and design decisions as a reference o
|[ADR-22](adr/ADR-22.md)|jetstream, client|JetStream Publish Retries on No Responders|
|[ADR-28](adr/ADR-28.md)|jetstream, server|JetStream RePublish|
|[ADR-31](adr/ADR-31.md)|jetstream, client, server|JetStream Direct Get|
|[ADR-33](adr/ADR-33.md)|jetstream, client, server|Metadata for Stream and Consumer|

## Kv

Expand Down Expand Up @@ -79,21 +81,22 @@ This repo is used to capture architectural and design decisions as a reference o

## Server

| Index |Tags|Description|
|-------------------------|----|-----------|
| [ADR-1](adr/ADR-1.md) |jetstream, client, server|JetStream JSON API Design|
| [ADR-2](adr/ADR-2.md) |jetstream, server, client|NATS Typed Messages|
| [ADR-3](adr/ADR-3.md) |observability, server|NATS Service Latency Distributed Tracing Interoperability|
| [ADR-4](adr/ADR-4.md) |server, client|NATS Message Headers|
| [ADR-5](adr/ADR-5.md) |server, client|Lame Duck Notification|
| [ADR-6](adr/ADR-6.md) |server, client|Naming Rules|
| [ADR-7](adr/ADR-7.md) |server, client, jetstream|NATS Server Error Codes|
| [ADR-9](adr/ADR-9.md) |server, client, jetstream|JetStream Consumer Idle Heartbeats|
| [ADR-10](adr/ADR-10.md) |server, client, jetstream|JetStream Extended Purge|
| [ADR-28](adr/ADR-28.md) |jetstream, server|JetStream RePublish|
| [ADR-30](adr/ADR-30.md) |server|Subject Transform|
| [ADR-31](adr/ADR-31.md) |jetstream, client, server|JetStream Direct Get|
| [ADR-26](adr/ADR-26.md) |server|NATS Authorization Callouts|
|Index|Tags|Description|
|-----|----|-----------|
|[ADR-1](adr/ADR-1.md)|jetstream, client, server|JetStream JSON API Design|
|[ADR-2](adr/ADR-2.md)|jetstream, server, client|NATS Typed Messages|
|[ADR-3](adr/ADR-3.md)|observability, server|NATS Service Latency Distributed Tracing Interoperability|
|[ADR-4](adr/ADR-4.md)|server, client|NATS Message Headers|
|[ADR-5](adr/ADR-5.md)|server, client|Lame Duck Notification|
|[ADR-6](adr/ADR-6.md)|server, client|Naming Rules|
|[ADR-7](adr/ADR-7.md)|server, client, jetstream|NATS Server Error Codes|
|[ADR-9](adr/ADR-9.md)|server, client, jetstream|JetStream Consumer Idle Heartbeats|
|[ADR-10](adr/ADR-10.md)|server, client, jetstream|JetStream Extended Purge|
|[ADR-26](adr/ADR-26.md)|server|NATS Authorization Callouts|
|[ADR-28](adr/ADR-28.md)|jetstream, server|JetStream RePublish|
|[ADR-30](adr/ADR-30.md)|server|Subject Transform|
|[ADR-31](adr/ADR-31.md)|jetstream, client, server|JetStream Direct Get|
|[ADR-33](adr/ADR-33.md)|jetstream, client, server|Metadata for Stream and Consumer|

## When to write an ADR

Expand Down
51 changes: 51 additions & 0 deletions adr/ADR-33.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Metadata for Stream and Consumer

|Metadata|Value|
|--------|-----|
|Date |2023-01-23|
|Author |@Jarema|
|Status |Approved|
|Tags |jetstream, client, server|

## Context and Problem Statement

Until now, there was no way to easily add additional information about Stream or Consumer.
The only solution was using `Description` field, which is a not ergonomic workaround.

## Server PR
https://github.com/nats-io/nats-server/pull/3797

## Design

The solution is to add new `metadata` field to both `Consumer` and `Stream` config.
The `metadata` field would by a map of `string` keys and `string` values.

### JSON representation
The map would be represented in json as object with nested key/value pairs, which is a default
way to marshal maps/hashmaps in most languages.

### Size limit
To avoid abuse of the metadata, the size of it is limited to 128KB.
Size is equal to len of all keys and values summed.

### Reserved prefix
`_nats` is a reserved prefix.
Will be used for any potential internals of server or clients.
Server can lock its metadata to be immutable and deny any changes.


### Example
```json
{
"durable_name": "consumer",
... // other consumer/stream fields
"metadata": {
"owner": "nack",
"domain": "product",
"_nats_created_version": "1.10.0"
}
}

```


0 comments on commit 282b9b4

Please sign in to comment.