mirror of
https://github.com/taigrr/nats.docs
synced 2025-01-18 04:03:23 -08:00
120 lines
3.0 KiB
Markdown
120 lines
3.0 KiB
Markdown
# Avoiding the Thundering Herd
|
|
|
|
When a server goes down, there is a possible anti-pattern called the _Thundering Herd_ where all of the clients try to reconnect immediately, thus creating a denial of service attack. In order to prevent this, most NATS client libraries randomize the servers they attempt to connect to. This setting has no effect if only a single server is used, but in the case of a cluster, randomization, or shuffling, will ensure that no one server bears the brunt of the client reconnect attempts.
|
|
|
|
However, if you want to disable the randomization process for connect and reconnect, so that servers are always checked in the same order, you can do that in most libraries with a connection option:
|
|
|
|
{% tabs %}
|
|
{% tab title="Go" %}
|
|
```go
|
|
servers := []string{"nats://127.0.0.1:1222",
|
|
"nats://127.0.0.1:1223",
|
|
"nats://127.0.0.1:1224",
|
|
}
|
|
|
|
nc, err := nats.Connect(strings.Join(servers, ","), nats.DontRandomize())
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer nc.Close()
|
|
|
|
// Do something with the connection
|
|
```
|
|
{% endtab %}
|
|
|
|
{% tab title="Java" %}
|
|
```java
|
|
Options options = new Options.Builder().
|
|
server("nats://demo.nats.io:4222").
|
|
noRandomize(). // Disable reconnect shuffle
|
|
build();
|
|
Connection nc = Nats.connect(options);
|
|
|
|
// Do something with the connection
|
|
|
|
nc.close();
|
|
```
|
|
{% endtab %}
|
|
|
|
{% tab title="JavaScript" %}
|
|
```javascript
|
|
let nc = NATS.connect({
|
|
noRandomize: true,
|
|
servers: [
|
|
"nats://127.0.0.1:4443",
|
|
"nats://demo.nats.io:4222"
|
|
]
|
|
});
|
|
```
|
|
{% endtab %}
|
|
|
|
{% tab title="Python" %}
|
|
```python
|
|
nc = NATS()
|
|
await nc.connect(
|
|
servers=[
|
|
"nats://demo.nats.io:1222",
|
|
"nats://demo.nats.io:1223",
|
|
"nats://demo.nats.io:1224"
|
|
],
|
|
dont_randomize=True,
|
|
)
|
|
|
|
# Do something with the connection
|
|
|
|
await nc.close()
|
|
```
|
|
{% endtab %}
|
|
|
|
{% tab title="Ruby" %}
|
|
```ruby
|
|
require 'nats/client'
|
|
|
|
NATS.start(servers: ["nats://127.0.0.1:1222", "nats://127.0.0.1:1223", "nats://127.0.0.1:1224"], dont_randomize_servers: true) do |nc|
|
|
# Do something with the connection
|
|
|
|
# Close the connection
|
|
nc.close
|
|
end
|
|
```
|
|
{% endtab %}
|
|
|
|
{% tab title="TypeScript" %}
|
|
```typescript
|
|
// will throw an exception if connection fails
|
|
let nc = await connect({
|
|
noRandomize: true,
|
|
servers: [
|
|
"nats://127.0.0.1:4443",
|
|
"nats://demo.nats.io:4222"
|
|
]
|
|
});
|
|
nc.close();
|
|
```
|
|
{% endtab %}
|
|
|
|
{% tab title="C" %}
|
|
```c
|
|
natsConnection *conn = NULL;
|
|
natsOptions *opts = NULL;
|
|
natsStatus s = NATS_OK;
|
|
const char *servers[] = {"nats://127.0.0.1:1222", "nats://127.0.0.1:1223", "nats://127.0.0.1:1224"};
|
|
|
|
s = natsOptions_Create(&opts);
|
|
if (s == NATS_OK)
|
|
s = natsOptions_SetServers(opts, servers, 3);
|
|
if (s == NATS_OK)
|
|
s = natsOptions_SetNoRandomize(opts, true);
|
|
if (s == NATS_OK)
|
|
s = natsConnection_Connect(&conn, opts);
|
|
|
|
(...)
|
|
|
|
// Destroy objects that were created
|
|
natsConnection_Destroy(conn);
|
|
natsOptions_Destroy(opts);
|
|
```
|
|
{% endtab %}
|
|
{% endtabs %}
|
|
|