重连尝试期间的消息缓冲

Core NATS 客户端库会尽可能实现即发即弃的语义。你应该使用 JetStream 功能来获得更高级的服务质量,从而处理因服务器连接中断而导致的 Core NATS 消息被丢弃的情况。话虽如此,你正在使用的客户端库可能包含的一项功能是:在连接断开时能够缓冲外发的消息。

在短暂的重连期间,客户端可以允许应用程序发布消息。但由于服务器离线,这些消息会被缓存在客户端中。一旦重新连接,客户端库就会发送这些消息。当达到最大重连缓冲区容量时,客户端将无法再发布消息,并会返回错误。

请注意,虽然从应用程序的角度看消息似乎已经发送,但由于连接可能始终无法重新建立,这些消息有可能永远无法真正发出。你的应用程序应该使用 ACK 等模式,或者使用 JetStream publish 调用来确保消息投递。

对于支持此功能的客户端,你可以通过字节数、消息数或两者结合的方式来设定此缓冲区的大小。

{% tabs %} {% tab title="Go" %}

// Set reconnect buffer size in bytes (5 MB)
nc, err := nats.Connect("demo.nats.io", nats.ReconnectBufSize(5*1024*1024))
if err != nil {
    log.Fatal(err)
}
defer nc.Close()

// Do something with the connection

{% endtab %}

{% tab title="Java" %}

Options options = new Options.Builder()
    .server("nats://demo.nats.io:4222")
    .reconnectBufferSize(5 * 1024 * 1024)  // Set buffer in bytes
    .build();
Connection nc = Nats.connect(options);

// Do something with the connection

nc.close();

{% endtab %}

{% tab title="JavaScript" %}

// Reconnect buffer size is not configurable on NATS JavaScript client

{% endtab %}

{% tab title="Python" %}

# Asyncio NATS client currently does not implement a reconnect buffer

{% endtab %}

{% tab title="C#" %}

// Reconnect buffer size is not configurable on NATS .NET client

{% endtab %}

{% tab title="Ruby" %}

# There is currently no reconnect pending buffer as part of the Ruby NATS client

{% endtab %}

{% tab title="C" %}

natsConnection      *conn      = NULL;
natsOptions         *opts      = NULL;
natsStatus          s          = NATS_OK;

s = natsOptions_Create(&opts);
if (s == NATS_OK)
    // Set reconnect buffer size in bytes (5 MB)
    s = natsOptions_SetReconnectBufSize(opts, 5*1024*1024);
if (s == NATS_OK)
    s = natsConnection_Connect(&conn, opts);

(...)

// Destroy objects that were created
natsConnection_Destroy(conn);
natsOptions_Destroy(opts);

{% endtab %} {% endtabs %}

如本文档所述,每个客户端库的行为可能略有不同。请查阅您正在使用的库的文档。