mirror of
https://github.com/taigrr/nats.docs
synced 2025-01-18 04:03:23 -08:00
GitBook: [master] 326 pages and 16 assets modified
This commit is contained in:
committed by
gitbook-bot
parent
8b7ba5c3bb
commit
fb0d5c8355
@@ -1,76 +0,0 @@
|
||||
## Gateways
|
||||
|
||||
Gateways enable connecting one or more clusters together; they allow the formation of super clusters from smaller clusters. Cluster and Gateway protocols listen in different ports. Clustering is used for adjacent servers; gateways are for joining clusters together. Typically all cluster nodes will also be gateway nodes, but this is not a requirement.
|
||||
|
||||
Gateway configuration is similar to clustering:
|
||||
|
||||
- gateways have a dedicated port where they listen for gateway requests
|
||||
- gateways gossip gateway members and remote discovered gateways
|
||||
|
||||
Unlike clusters, gateways:
|
||||
|
||||
- don't form a full mesh
|
||||
- are bound by uni-directional connections
|
||||
|
||||
Gateways exist to:
|
||||
|
||||
- reduce the number of connections required between servers
|
||||
- optimize the interest graph propagation
|
||||
|
||||
## Gateway Connections
|
||||
|
||||
A nats-server in a gateway role will specify a port where it will accept gateways connections. If the configuration specifies other _external_ `gateways`, the gateway will create one outbound gateway connection for each gateway in its configuration. It will also gossip other gateways it knows or discovered.
|
||||
|
||||
If the local cluster has three gateway nodes, this means there will be three outbound connections to each external gateway.
|
||||
|
||||

|
||||
|
||||
> In the example above cluster _A_ has configured gateway connections for _B_ (solid lines). B has discovered gateway connections to _A_ (dotted lines). Note that the number of outgoing connections always matches the number of gateways with the same name.
|
||||
|
||||

|
||||
|
||||
> In this second example, again configured connections are shown with solid lines and discovered gateway connections are shown using dotted lines. Gateways _A_ and _C_ were both discovered via gossiping; _B_ discovered _A_ and _A_ discovered _C_.
|
||||
|
||||
|
||||
A key point in the description above is that each node in the cluster will make a connection to a single node in the remote cluster — a difference from the clustering protocol, where every node is directly connected to all other nodes.
|
||||
|
||||
For those mathematically inclined, cluster connections are `N(N-1)/2` where _N_ is the number of nodes in the cluster. On gateway configurations, outbound connections are the summation of `Ni(M-1)` where Ni is the number of nodes in a gateway _i_, and _M_ is the total number of gateways. Inbound connections are the summation of `U-Ni` where U is the sum of all gateway nodes in all gateways, and N is the number of nodes in a gateway _i_. It works out that both inbound and outbound connection counts are the same.
|
||||
|
||||
The number of connections required to join clusters using clustering vs. gateways is apparent very quickly. For 3 clusters, with N nodes:
|
||||
|
||||
| Nodes per Cluster | Full Mesh Conns | Gateway Conns |
|
||||
| ---: | ----: | ----: |
|
||||
| 1 | 3 | 6|
|
||||
| 2 | 15 | 12 |
|
||||
| 3 | 36 | 18 |
|
||||
| 4 | 66 | 24 |
|
||||
| 5 | 105 | 30 |
|
||||
| 30 | 4005 | 180 |
|
||||
|
||||
## Interest Propagation
|
||||
|
||||
Gateways propagate interest using three different mechanisms:
|
||||
|
||||
- Optimistic Mode
|
||||
- Interest-only Mode
|
||||
- Queue Subscriptions
|
||||
|
||||
### Optimistic Mode
|
||||
|
||||
When a publisher in _A_ publishes "foo", the _A_ gateway will check if cluster _B_ has registered _no_ interest in "foo". If not, it forwards "foo" to _B_. If upon receiving "foo", _B_ has no subscribers on "foo", _B_ will send a gateway protocol message to _A_ expressing that it has no interest on "foo", preventing future messages on "foo" from being forwarded.
|
||||
|
||||
Should a subscriber on _B_ create a subscription to "foo", _B_ knowing that it had previously rejected interest on _foo_, will send a gateway protocol message to cancel its previous _no interest_ on "foo" in _A_.
|
||||
|
||||
### Interest-only Mode
|
||||
|
||||
When a gateway on _A_ sends many messages on various subjects for which _B_ has no interest. _B_ sends a gateway protocol message for _A_ to stop sending optimistically, and instead send if there's known interest in the subject. As subscriptions come and go on _B_, _B_ will update its subject interest with _A_.
|
||||
|
||||
### Queue Subscriptions
|
||||
|
||||
When a queue subscriber creates a new subscription, the gateway propagates the subscription interest to other gateways. The subscription interest is only propagated _once_ per _Account_ and subject. When the last queue subscriber is gone, the cluster interest is removed.
|
||||
|
||||
Queue subscriptions work on _Interest-only Mode_ to honor NATS' queue semantics across the _Super Cluster_. For each queue group, a message is only delivered to a single queue subscriber. Only when a local queue group member is not found, is a message forwarded to a different interested cluster; gateways will always try to serve local queue subscribers first and only failover when a local queue subscriber is not found.
|
||||
|
||||
### Gateway Configuration
|
||||
|
||||
The [Gateway Configuration](gateway.md) document describes all the options available to gateways.
|
||||
@@ -1,101 +0,0 @@
|
||||
|
||||
## Gateway Configuration
|
||||
|
||||
The `gateway` configuration block is similar to a `cluster` block:
|
||||
|
||||
```hcl
|
||||
gateway {
|
||||
name: "A"
|
||||
listen: "localhost:7222"
|
||||
authorization {
|
||||
user: gwu
|
||||
password: gwp
|
||||
}
|
||||
|
||||
gateways: [
|
||||
{name: "A", url: "nats://gwu:gwp@localhost:7222"},
|
||||
{name: "B", url: "nats://gwu:gwp@localhost:7333"},
|
||||
{name: "C", url: "nats://gwu:gwp@localhost:7444"},
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
One difference is that instead of `routes` you specify `gateways`. As expected _self-gateway_ connections are ignored, so you can share gateway configurations with minimal fuzz.
|
||||
|
||||
Starting a server:
|
||||
```text
|
||||
> nats-server -c A.conf
|
||||
[85803] 2019/05/07 10:50:55.902474 [INF] Starting nats-server version 2.0.0
|
||||
[85803] 2019/05/07 10:50:55.903669 [INF] Gateway name is A
|
||||
[85803] 2019/05/07 10:50:55.903684 [INF] Listening for gateways connections on localhost:7222
|
||||
[85803] 2019/05/07 10:50:55.903696 [INF] Address for gateway "A" is localhost:7222
|
||||
[85803] 2019/05/07 10:50:55.903909 [INF] Listening for client connections on 0.0.0.0:4222
|
||||
[85803] 2019/05/07 10:50:55.903914 [INF] Server id is NBHUDBF3TVJSWCDPG2HSKI4I2SBSPDTNYEXEMOFAZUZYXVA2IYRUGPZU
|
||||
[85803] 2019/05/07 10:50:55.903917 [INF] Server is ready
|
||||
[85803] 2019/05/07 10:50:56.830669 [INF] 127.0.0.1:50892 - gid:2 - Processing inbound gateway connection
|
||||
[85803] 2019/05/07 10:50:56.830673 [INF] 127.0.0.1:50891 - gid:1 - Processing inbound gateway connection
|
||||
[85803] 2019/05/07 10:50:56.831079 [INF] 127.0.0.1:50892 - gid:2 - Inbound gateway connection from "C" (NBHWDFO3KHANNI6UCEUL27VNWL7NWD2MC4BI4L2C7VVLFBSMZ3CRD7HE) registered
|
||||
[85803] 2019/05/07 10:50:56.831211 [INF] 127.0.0.1:50891 - gid:1 - Inbound gateway connection from "B" (ND2UJB3GFUHXOQ2UUMZQGOCL4QVR2LRJODPZH7MIPGLWCQRARJBU27C3) registered
|
||||
[85803] 2019/05/07 10:50:56.906103 [INF] Connecting to explicit gateway "B" (localhost:7333) at 127.0.0.1:7333
|
||||
[85803] 2019/05/07 10:50:56.906104 [INF] Connecting to explicit gateway "C" (localhost:7444) at 127.0.0.1:7444
|
||||
[85803] 2019/05/07 10:50:56.906404 [INF] 127.0.0.1:7333 - gid:3 - Creating outbound gateway connection to "B"
|
||||
[85803] 2019/05/07 10:50:56.906444 [INF] 127.0.0.1:7444 - gid:4 - Creating outbound gateway connection to "C"
|
||||
[85803] 2019/05/07 10:50:56.906647 [INF] 127.0.0.1:7444 - gid:4 - Outbound gateway connection to "C" (NBHWDFO3KHANNI6UCEUL27VNWL7NWD2MC4BI4L2C7VVLFBSMZ3CRD7HE) registered
|
||||
[85803] 2019/05/07 10:50:56.906772 [INF] 127.0.0.1:7333 - gid:3 - Outbound gateway connection to "B" (ND2UJB3GFUHXOQ2UUMZQGOCL4QVR2LRJODPZH7MIPGLWCQRARJBU27C3) registered
|
||||
```
|
||||
|
||||
Once all the gateways are up, these clusters of one will forward messages as expected:
|
||||
```text
|
||||
> nats-pub -s localhost:4444 foo bar
|
||||
Published [foo] : 'bar'
|
||||
|
||||
# On a different session...
|
||||
> nats-sub -s localhost:4333 ">"
|
||||
Listening on [>]
|
||||
[#1] Received on [foo]: 'bar'
|
||||
```
|
||||
|
||||
### `Gateway` Configuration Block
|
||||
|
||||
| Property | Description |
|
||||
| :------ | :---- |
|
||||
| `advertise` | Hostport `<host>:<port>` to advertise to other gateways. |
|
||||
| `authorization` | Authorization block (same as other nats-server `authorization` configuration). |
|
||||
| `connect_retries` | Number of times the server will try to connect to a discovered gateway. |
|
||||
| `gateways` | List of Gateway entries - see below. |
|
||||
| `host` | Interface where the gateway will listen for incomming gateway connections. |
|
||||
| `listen` | Combines `host` and `port` as `<host>:<port>` |
|
||||
| `name` | Name for this cluster, all gateways belonging to the same cluster, should specify the same name. |
|
||||
| `port` | Port where the gateway will listen for incomming gateway connections. |
|
||||
| `reject_unknown` | If `true`, gateway will reject connections from gateways that are not configured in `gateways`. |
|
||||
| `tls` | TLS configuration block (same as other [nats-server `tls` configuration](/nats_server/tls.md#tls-configuration)). |
|
||||
|
||||
|
||||
|
||||
#### `Gateway` Entry
|
||||
|
||||
The `gateways` configuration block is a list of gateway entries with the following properties:
|
||||
|
||||
| Property | Description |
|
||||
| :------ | :---- |
|
||||
| `name` | Gateway name. |
|
||||
| `url` | Hostport `<host>:<port>` describing where the remote gateway can be reached. If multiple IPs are returned, one is randomly selected. |
|
||||
| `urls` | A list of `url` |
|
||||
|
||||
By using `urls` and an array, you can specify a list of endpoints that
|
||||
form part of a cluster as below. A NATS Server will pick one of those
|
||||
addresses randomly and only establish a single outbound gateway
|
||||
connection to one of the members from another cluster:
|
||||
|
||||
```hcl
|
||||
gateway {
|
||||
name: "DC-A"
|
||||
listen: "localhost:7222"
|
||||
|
||||
gateways: [
|
||||
{name: "DC-A", urls: ["nats://localhost:7222", "nats://localhost:7223", "nats://localhost:7224"]},
|
||||
{name: "DC-B", urls: ["nats://localhost:7332", "nats://localhost:7333", "nats://localhost:7334"]},
|
||||
{name: "DC-C", urls: ["nats://localhost:7442", "nats://localhost:7333", "nats://localhost:7335"]}
|
||||
]
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user