1
0
mirror of https://github.com/taigrr/nats.docs synced 2025-01-18 04:03:23 -08:00
2019-06-07 11:12:14 -05:00

3098 lines
93 KiB
HTML

<!DOCTYPE HTML>
<html lang="" >
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>The Streaming Protocol ยท NATS</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="">
<meta name="generator" content="GitBook 3.2.3">
<meta name="author" content="The NATS Maintainers">
<link rel="stylesheet" href="../../gitbook/style.css">
<link rel="stylesheet" href="../../gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="../../gitbook/gitbook-plugin-toggle-chapters/toggle.css">
<link rel="stylesheet" href="../../gitbook/gitbook-plugin-anchors/plugin.css">
<link rel="stylesheet" href="../../gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="../../nats_streaming/gettingstarted/install.html" />
<link rel="prev" href="acks.html" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/3.6.95/css/materialdesignicons.min.css">
</head>
<body>
<div class="book">
<div class="book-summary">
<div id="book-search-input" role="search">
<input type="text" placeholder="Type to search" />
</div>
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="1.1" data-path="../../">
<a href="../../">
Introduction
</a>
</li>
<li class="chapter " data-level="1.2" data-path="../../whats_new/whats_new_20.html">
<a href="../../whats_new/whats_new_20.html">
What's New in 2.0
</a>
</li>
<li class="chapter " data-level="1.3" data-path="../../faq.html">
<a href="../../faq.html">
FAQ
</a>
</li>
<li class="chapter " data-level="1.4" >
<a target="_blank" href="https://nats.io">
nats.io
</a>
</li>
<li class="header">Concepts</li>
<li class="chapter " data-level="2.1" data-path="../concepts/intro.html">
<a href="../concepts/intro.html">
What is NATS
</a>
</li>
<li class="chapter " data-level="2.2" data-path="../concepts/subjects.html">
<a href="../concepts/subjects.html">
Subject-Based Messaging
</a>
</li>
<li class="chapter " data-level="2.3" data-path="../concepts/pubsub.html">
<a href="../concepts/pubsub.html">
Publish-Subscribe
</a>
</li>
<li class="chapter " data-level="2.4" data-path="../concepts/reqreply.html">
<a href="../concepts/reqreply.html">
Request-Reply
</a>
</li>
<li class="chapter " data-level="2.5" data-path="../concepts/queue.html">
<a href="../concepts/queue.html">
Queue Groups
</a>
</li>
<li class="chapter " data-level="2.6" data-path="../concepts/acks.html">
<a href="../concepts/acks.html">
Acknowledgements
</a>
</li>
<li class="chapter " data-level="2.7" data-path="../concepts/seq_num.html">
<a href="../concepts/seq_num.html">
Sequence Numbers
</a>
</li>
<li class="header">Developing With NATS</li>
<li class="chapter " data-level="3.1" data-path="../">
<a href="../">
Introduction
</a>
</li>
<li class="chapter " data-level="3.2" data-path="../connecting/intro.html">
<a href="../connecting/intro.html">
Connecting
</a>
<ul class="articles">
<li class="chapter " data-level="3.2.1" data-path="../connecting/default_server.html">
<a href="../connecting/default_server.html">
Connecting to the Default Server
</a>
</li>
<li class="chapter " data-level="3.2.2" data-path="../connecting/specific_server.html">
<a href="../connecting/specific_server.html">
Connecting to a Specific Server
</a>
</li>
<li class="chapter " data-level="3.2.3" data-path="../connecting/cluster.html">
<a href="../connecting/cluster.html">
Connecting to a Cluster
</a>
</li>
<li class="chapter " data-level="3.2.4" data-path="../connecting/connect_timeout.html">
<a href="../connecting/connect_timeout.html">
Setting a Connect Timeout
</a>
</li>
<li class="chapter " data-level="3.2.5" data-path="../connecting/pingpong.html">
<a href="../connecting/pingpong.html">
Ping/Pong Protocol
</a>
</li>
<li class="chapter " data-level="3.2.6" data-path="../connecting/protocol.html">
<a href="../connecting/protocol.html">
Controlling the Client/Server Protocol
</a>
</li>
<li class="chapter " data-level="3.2.7" data-path="../connecting/noecho.html">
<a href="../connecting/noecho.html">
Turning Off Echo'd Messages
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.3" data-path="../reconnect/intro.html">
<a href="../reconnect/intro.html">
Automatic Reconnections
</a>
<ul class="articles">
<li class="chapter " data-level="3.3.1" data-path="../reconnect/disable.html">
<a href="../reconnect/disable.html">
Disabling Reconnect
</a>
</li>
<li class="chapter " data-level="3.3.2" data-path="../reconnect/max.html">
<a href="../reconnect/max.html">
Set the Number of Reconnect Attempts
</a>
</li>
<li class="chapter " data-level="3.3.3" data-path="../reconnect/wait.html">
<a href="../reconnect/wait.html">
Pausing Between Reconnect Attempts
</a>
</li>
<li class="chapter " data-level="3.3.4" data-path="../reconnect/random.html">
<a href="../reconnect/random.html">
Avoiding the Thundering Herd
</a>
</li>
<li class="chapter " data-level="3.3.5" data-path="../reconnect/events.html">
<a href="../reconnect/events.html">
Listening for Reconnect Events
</a>
</li>
<li class="chapter " data-level="3.3.6" data-path="../reconnect/buffer.html">
<a href="../reconnect/buffer.html">
Buffering Messages During Reconnect Attempts
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.4" data-path="../security/intro.html">
<a href="../security/intro.html">
Securing Connections
</a>
<ul class="articles">
<li class="chapter " data-level="3.4.1" data-path="../security/userpass.html">
<a href="../security/userpass.html">
Authenticating with a User and Password
</a>
</li>
<li class="chapter " data-level="3.4.2" data-path="../security/token.html">
<a href="../security/token.html">
Authenticating with a Token
</a>
</li>
<li class="chapter " data-level="3.4.3" data-path="../security/nkey.html">
<a href="../security/nkey.html">
Authenticating with an NKey
</a>
</li>
<li class="chapter " data-level="3.4.4" data-path="../security/creds.html">
<a href="../security/creds.html">
Authenticating with a Credentials File
</a>
</li>
<li class="chapter " data-level="3.4.5" data-path="../security/tls.html">
<a href="../security/tls.html">
Encrypting Connections with TLS
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.5" data-path="../receiving/intro.html">
<a href="../receiving/intro.html">
Receiving Messages
</a>
<ul class="articles">
<li class="chapter " data-level="3.5.1" data-path="../receiving/sync.html">
<a href="../receiving/sync.html">
Synchronous Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.2" data-path="../receiving/async.html">
<a href="../receiving/async.html">
Asynchronous Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.3" data-path="../receiving/unsubscribing.html">
<a href="../receiving/unsubscribing.html">
Unsubscribing
</a>
</li>
<li class="chapter " data-level="3.5.4" data-path="../receiving/unsub_after.html">
<a href="../receiving/unsub_after.html">
Unsubscribing After N Messages
</a>
</li>
<li class="chapter " data-level="3.5.5" data-path="../receiving/reply.html">
<a href="../receiving/reply.html">
Replying to a Message
</a>
</li>
<li class="chapter " data-level="3.5.6" data-path="../receiving/wildcards.html">
<a href="../receiving/wildcards.html">
Wildcard Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.7" data-path="../receiving/queues.html">
<a href="../receiving/queues.html">
Queue Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.8" data-path="../receiving/drain.html">
<a href="../receiving/drain.html">
Draining Messages Before Disconnect
</a>
</li>
<li class="chapter " data-level="3.5.9" data-path="../receiving/structure.html">
<a href="../receiving/structure.html">
Structured Data
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.6" data-path="../sending/intro.html">
<a href="../sending/intro.html">
Sending Messages
</a>
<ul class="articles">
<li class="chapter " data-level="3.6.1" data-path="../sending/replyto.html">
<a href="../sending/replyto.html">
Including a Reply Subject
</a>
</li>
<li class="chapter " data-level="3.6.2" data-path="../sending/request_reply.html">
<a href="../sending/request_reply.html">
Request-Reply Semantics
</a>
</li>
<li class="chapter " data-level="3.6.3" data-path="../sending/caches.html">
<a href="../sending/caches.html">
Caches, Flush and Ping
</a>
</li>
<li class="chapter " data-level="3.6.4" data-path="../sending/structure.html">
<a href="../sending/structure.html">
Sending Structured Data
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.7" data-path="../events/intro.html">
<a href="../events/intro.html">
Monitoring the Connection
</a>
<ul class="articles">
<li class="chapter " data-level="3.7.1" data-path="../events/events.html">
<a href="../events/events.html">
Listen for Connection Events
</a>
</li>
<li class="chapter " data-level="3.7.2" data-path="../events/slow.html">
<a href="../events/slow.html">
Slow Consumers
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.8" data-path="../tutorials/intro.html">
<a href="../tutorials/intro.html">
Tutorials
</a>
<ul class="articles">
<li class="chapter " data-level="3.8.1" data-path="../tutorials/pubsub.html">
<a href="../tutorials/pubsub.html">
Explore NATS Pub/Sub
</a>
</li>
<li class="chapter " data-level="3.8.2" data-path="../tutorials/reqreply.html">
<a href="../tutorials/reqreply.html">
Explore NATS Request/Reply
</a>
</li>
<li class="chapter " data-level="3.8.3" data-path="../tutorials/queues.html">
<a href="../tutorials/queues.html">
Explore NATS Queueing
</a>
</li>
<li class="chapter " data-level="3.8.4" data-path="../tutorials/custom_dialer.html">
<a href="../tutorials/custom_dialer.html">
Advanced Connect and Custom Dialer in Go
</a>
</li>
</ul>
</li>
<li class="header">NATS Server</li>
<li class="chapter " data-level="4.1" data-path="../../nats_server/installation.html">
<a href="../../nats_server/installation.html">
Installing
</a>
</li>
<li class="chapter " data-level="4.2" data-path="../../nats_server/running.html">
<a href="../../nats_server/running.html">
Running
</a>
<ul class="articles">
<li class="chapter " data-level="4.2.1" data-path="../../nats_server/windows_srv.html">
<a href="../../nats_server/windows_srv.html">
Window Service
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4.3" data-path="../../nats_server/clients.html">
<a href="../../nats_server/clients.html">
Clients
</a>
</li>
<li class="chapter " data-level="4.4" data-path="../../nats_server/flags.html">
<a href="../../nats_server/flags.html">
Flags
</a>
</li>
<li class="chapter " data-level="4.5" data-path="../../nats_server/configuration.html">
<a href="../../nats_server/configuration.html">
Configuration
</a>
<ul class="articles">
<li class="chapter " data-level="4.5.1" data-path="../../nats_server/securing_nats.html">
<a href="../../nats_server/securing_nats.html">
Securing NATS
</a>
<ul class="articles">
<li class="chapter " data-level="4.5.1.1" data-path="../../nats_server/tls.html">
<a href="../../nats_server/tls.html">
Enabling TLS
</a>
</li>
<li class="chapter " data-level="4.5.1.2" data-path="../../nats_server/auth_intro.html">
<a href="../../nats_server/auth_intro.html">
Authentication
</a>
<ul class="articles">
<li class="chapter " data-level="4.5.1.2.1" data-path="../../nats_server/tokens.html">
<a href="../../nats_server/tokens.html">
Tokens
</a>
</li>
<li class="chapter " data-level="4.5.1.2.2" data-path="../../nats_server/username_password.html">
<a href="../../nats_server/username_password.html">
Username/Password
</a>
</li>
<li class="chapter " data-level="4.5.1.2.3" data-path="../../nats_server/tls_mutual_auth.html">
<a href="../../nats_server/tls_mutual_auth.html">
TLS Authentication
</a>
</li>
<li class="chapter " data-level="4.5.1.2.4" data-path="../../nats_server/nkey_auth.html">
<a href="../../nats_server/nkey_auth.html">
NKeys
</a>
</li>
<li class="chapter " data-level="4.5.1.2.5" data-path="../../nats_server/accounts.html">
<a href="../../nats_server/accounts.html">
Accounts
</a>
</li>
<li class="chapter " data-level="4.5.1.2.6" data-path="../../nats_server/jwt_auth.html">
<a href="../../nats_server/jwt_auth.html">
JWTs
</a>
</li>
<li class="chapter " data-level="4.5.1.2.7" data-path="../../nats_server/auth_timeout.html">
<a href="../../nats_server/auth_timeout.html">
Authentication Timeout
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4.5.1.3" data-path="../../nats_server/authorization.html">
<a href="../../nats_server/authorization.html">
Authorization
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4.5.2" data-path="../../nats_server/clustering.html">
<a href="../../nats_server/clustering.html">
Clustering
</a>
<ul class="articles">
<li class="chapter " data-level="4.5.2.1" data-path="../../nats_server/cluster_config.html">
<a href="../../nats_server/cluster_config.html">
Configuration
</a>
</li>
<li class="chapter " data-level="4.5.2.2" data-path="../../nats_server/cluster_tls.html">
<a href="../../nats_server/cluster_tls.html">
TLS Authentication
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4.5.3" data-path="../../gateways/">
<a href="../../gateways/">
Gateways
</a>
<ul class="articles">
<li class="chapter " data-level="4.5.3.1" data-path="../../gateways/gateway.html">
<a href="../../gateways/gateway.html">
Configuration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4.5.4" data-path="../../leafnodes/">
<a href="../../leafnodes/">
Leaf Nodes
</a>
<ul class="articles">
<li class="chapter " data-level="4.5.4.1" data-path="../../leafnodes/leafnode_conf.html">
<a href="../../leafnodes/leafnode_conf.html">
Configuration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4.5.5" data-path="../../nats_server/logging.html">
<a href="../../nats_server/logging.html">
Logging
</a>
</li>
<li class="chapter " data-level="4.5.6" data-path="../../nats_server/monitoring.html">
<a href="../../nats_server/monitoring.html">
Monitoring
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4.6" data-path="../../nats_admin/">
<a href="../../nats_admin/">
Managing A NATS Server
</a>
<ul class="articles">
<li class="chapter " data-level="4.6.1" data-path="../../nats_admin/upgrading_cluster.html">
<a href="../../nats_admin/upgrading_cluster.html">
Upgrading a Cluster
</a>
</li>
<li class="chapter " data-level="4.6.2" data-path="../../nats_admin/slow_consumers.html">
<a href="../../nats_admin/slow_consumers.html">
Slow Consumers
</a>
</li>
<li class="chapter " data-level="4.6.3" data-path="../../nats_admin/signals.html">
<a href="../../nats_admin/signals.html">
Signals
</a>
</li>
<li class="chapter " data-level="4.6.4" data-path="../../sys_accounts/">
<a href="../../sys_accounts/">
System Accounts
</a>
<ul class="articles">
<li class="chapter " data-level="4.6.4.1" data-path="../../sys_accounts/sys_accounts.html">
<a href="../../sys_accounts/sys_accounts.html">
Configuration
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="4.7" data-path="../../nats_docker/">
<a href="../../nats_docker/">
NATS and Docker
</a>
<ul class="articles">
<li class="chapter " data-level="4.7.1" data-path="../../nats_docker/tutorial.html">
<a href="../../nats_docker/tutorial.html">
Tutorial
</a>
</li>
<li class="chapter " data-level="4.7.2" data-path="../../nats_docker/docker_swarm.html">
<a href="../../nats_docker/docker_swarm.html">
Docker Swarm
</a>
</li>
</ul>
</li>
<li class="header">NATS Tools</li>
<li class="chapter " data-level="5.1" data-path="../../nats_tools/mkpasswd.html">
<a href="../../nats_tools/mkpasswd.html">
mkpasswd
</a>
</li>
<li class="chapter " data-level="5.2" data-path="../../nats_tools/nk.html">
<a href="../../nats_tools/nk.html">
nk
</a>
</li>
<li class="chapter " data-level="5.3" data-path="../../nats_tools/nsc/">
<a href="../../nats_tools/nsc/">
nsc
</a>
<ul class="articles">
<li class="chapter " data-level="5.3.1" data-path="../../nats_tools/nsc/nsc.html">
<a href="../../nats_tools/nsc/nsc.html">
Basics
</a>
</li>
<li class="chapter " data-level="5.3.2" data-path="../../nats_tools/nsc/streams.html">
<a href="../../nats_tools/nsc/streams.html">
Streams
</a>
</li>
<li class="chapter " data-level="5.3.3" data-path="../../nats_tools/nsc/services.html">
<a href="../../nats_tools/nsc/services.html">
Services
</a>
</li>
<li class="chapter " data-level="5.3.4" data-path="../../nats_tools/nsc/signing_keys.html">
<a href="../../nats_tools/nsc/signing_keys.html">
Signing Keys
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="5.4" data-path="../../nats_tools/nas/">
<a href="../../nats_tools/nas/">
nats-account-server
</a>
<ul class="articles">
<li class="chapter " data-level="5.4.1" data-path="../../nats_tools/nas/nas_conf.html">
<a href="../../nats_tools/nas/nas_conf.html">
Basics
</a>
</li>
<li class="chapter " data-level="5.4.2" data-path="../../nats_tools/nas/inspecting_jwts.html">
<a href="../../nats_tools/nas/inspecting_jwts.html">
Inspecting JWTs
</a>
</li>
<li class="chapter " data-level="5.4.3" data-path="../../nats_tools/nas/dir_store.html">
<a href="../../nats_tools/nas/dir_store.html">
Directory Store
</a>
</li>
<li class="chapter " data-level="5.4.4" data-path="../../nats_tools/nas/notifications.html">
<a href="../../nats_tools/nas/notifications.html">
Update Notifications
</a>
</li>
<li class="chapter " data-level="5.4.5" data-path="../../nats_tools/nas/mem_resolver.html">
<a href="../../nats_tools/nas/mem_resolver.html">
Memory Resolver
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="5.5" data-path="../../nats_tools/nats_top/">
<a href="../../nats_tools/nats_top/">
nats-top
</a>
<ul class="articles">
<li class="chapter " data-level="5.5.1" data-path="../../nats_tools/nats_top/tutorial.html">
<a href="../../nats_tools/nats_top/tutorial.html">
Tutorial
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="5.6" data-path="../../nats_tools/natsbench.html">
<a href="../../nats_tools/natsbench.html">
nats-bench
</a>
</li>
<li class="header">NATS Streaming Concepts</li>
<li class="chapter " data-level="6.1" data-path="../../nats_streaming/intro.html">
<a href="../../nats_streaming/intro.html">
Introduction
</a>
<ul class="articles">
<li class="chapter " data-level="6.1.1" data-path="../../nats_streaming/relation-to-nats.html">
<a href="../../nats_streaming/relation-to-nats.html">
Relation to NATS
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6.2" data-path="../../nats_streaming/client-connections.html">
<a href="../../nats_streaming/client-connections.html">
Client Connections
</a>
</li>
<li class="chapter " data-level="6.3" data-path="../../nats_streaming/channels/channels.html">
<a href="../../nats_streaming/channels/channels.html">
Channels
</a>
<ul class="articles">
<li class="chapter " data-level="6.3.1" data-path="../../nats_streaming/channels/message-log.html">
<a href="../../nats_streaming/channels/message-log.html">
Message Log
</a>
</li>
<li class="chapter " data-level="6.3.2" data-path="../../nats_streaming/channels/subscriptions/subscriptions.html">
<a href="../../nats_streaming/channels/subscriptions/subscriptions.html">
Subscriptions
</a>
<ul class="articles">
<li class="chapter " data-level="6.3.2.1" data-path="../../nats_streaming/channels/subscriptions/regular.html">
<a href="../../nats_streaming/channels/subscriptions/regular.html">
Regular
</a>
</li>
<li class="chapter " data-level="6.3.2.2" data-path="../../nats_streaming/channels/subscriptions/durable.html">
<a href="../../nats_streaming/channels/subscriptions/durable.html">
Durable
</a>
</li>
<li class="chapter " data-level="6.3.2.3" data-path="../../nats_streaming/channels/subscriptions/queue-group.html">
<a href="../../nats_streaming/channels/subscriptions/queue-group.html">
Queue Group
</a>
</li>
<li class="chapter " data-level="6.3.2.4" data-path="../../nats_streaming/channels/subscriptions/redelivery.html">
<a href="../../nats_streaming/channels/subscriptions/redelivery.html">
Redelivery
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="6.4" data-path="../../nats_streaming/store-interface.html">
<a href="../../nats_streaming/store-interface.html">
Store Interface
</a>
</li>
<li class="chapter " data-level="6.5" data-path="../../nats_streaming/store-encryption.html">
<a href="../../nats_streaming/store-encryption.html">
Store Encryption
</a>
</li>
<li class="chapter " data-level="6.6" data-path="../../nats_streaming/clustering/clustering.html">
<a href="../../nats_streaming/clustering/clustering.html">
Clustering
</a>
<ul class="articles">
<li class="chapter " data-level="6.6.1" data-path="../../nats_streaming/clustering/supported-stores.html">
<a href="../../nats_streaming/clustering/supported-stores.html">
Supported Stores
</a>
</li>
<li class="chapter " data-level="6.6.2" data-path="../../nats_streaming/clustering/configuration.html">
<a href="../../nats_streaming/clustering/configuration.html">
Configuration
</a>
</li>
<li class="chapter " data-level="6.6.3" data-path="../../nats_streaming/clustering/auto-configuration.html">
<a href="../../nats_streaming/clustering/auto-configuration.html">
Auto Configuration
</a>
</li>
<li class="chapter " data-level="6.6.4" data-path="../../nats_streaming/clustering/containers.html">
<a href="../../nats_streaming/clustering/containers.html">
Containers
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6.7" data-path="../../nats_streaming/fault-tolerance/ft.html">
<a href="../../nats_streaming/fault-tolerance/ft.html">
Fault Tolerance
</a>
<ul class="articles">
<li class="chapter " data-level="6.7.1" data-path="../../nats_streaming/fault-tolerance/active-server.html">
<a href="../../nats_streaming/fault-tolerance/active-server.html">
Active Server
</a>
</li>
<li class="chapter " data-level="6.7.2" data-path="../../nats_streaming/fault-tolerance/standby-server.html">
<a href="../../nats_streaming/fault-tolerance/standby-server.html">
Standby Servers
</a>
</li>
<li class="chapter " data-level="6.7.3" data-path="../../nats_streaming/fault-tolerance/shared-state.html">
<a href="../../nats_streaming/fault-tolerance/shared-state.html">
Shared State
</a>
</li>
<li class="chapter " data-level="6.7.4" data-path="../../nats_streaming/fault-tolerance/failover.html">
<a href="../../nats_streaming/fault-tolerance/failover.html">
Failover
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6.8" data-path="../../nats_streaming/partitioning.html">
<a href="../../nats_streaming/partitioning.html">
Partitioning
</a>
</li>
<li class="header">Developing With NATS Streaming</li>
<li class="chapter " data-level="7.1" data-path="./">
<a href="./">
Introduction
</a>
</li>
<li class="chapter " data-level="7.2" data-path="connecting.html">
<a href="connecting.html">
Connecting to NATS Streaming
</a>
</li>
<li class="chapter " data-level="7.3" data-path="publishing.html">
<a href="publishing.html">
Publishing to a Channel
</a>
</li>
<li class="chapter " data-level="7.4" data-path="receiving.html">
<a href="receiving.html">
Receiving Messages from a Channel
</a>
</li>
<li class="chapter " data-level="7.5" data-path="durables.html">
<a href="durables.html">
Durable Subscriptions
</a>
</li>
<li class="chapter " data-level="7.6" data-path="queues.html">
<a href="queues.html">
Queue Subscriptions
</a>
</li>
<li class="chapter " data-level="7.7" data-path="acks.html">
<a href="acks.html">
Acknowledgements
</a>
</li>
<li class="chapter active" data-level="7.8" data-path="protocol.html">
<a href="protocol.html">
The Streaming Protocol
</a>
</li>
<li class="header">NATS Streaming Server</li>
<li class="chapter " data-level="8.1" data-path="../../nats_streaming/gettingstarted/install.html">
<a href="../../nats_streaming/gettingstarted/install.html">
Installing
</a>
</li>
<li class="chapter " data-level="8.2" data-path="../../nats_streaming/gettingstarted/run.html">
<a href="../../nats_streaming/gettingstarted/run.html">
Running
</a>
</li>
<li class="chapter " data-level="8.3" data-path="../../nats_streaming/gettingstarted/configuring.html">
<a href="../../nats_streaming/gettingstarted/configuring.html">
Configuring
</a>
</li>
<li class="chapter " data-level="8.4" data-path="../../nats_streaming/gettingstarted/tls.html">
<a href="../../nats_streaming/gettingstarted/tls.html">
Securing
</a>
</li>
<li class="chapter " data-level="8.5" data-path="../../nats_streaming/gettingstarted/process-signaling.html">
<a href="../../nats_streaming/gettingstarted/process-signaling.html">
Process Signaling
</a>
</li>
<li class="chapter " data-level="8.6" data-path="../../nats_streaming/gettingstarted/windows-service.html">
<a href="../../nats_streaming/gettingstarted/windows-service.html">
Windows Service
</a>
</li>
<li class="chapter " data-level="8.7" data-path="embedding.html">
<a href="embedding.html">
Embedding NATS Streaming Server
</a>
</li>
<li class="chapter " data-level="8.8" data-path="../../nats_streaming/swarm.html">
<a href="../../nats_streaming/swarm.html">
Docker Swarm
</a>
</li>
<li class="chapter " data-level="8.9" data-path="../../nats_streaming/monitoring/monitoring.html">
<a href="../../nats_streaming/monitoring/monitoring.html">
Monitoring
</a>
<ul class="articles">
<li class="chapter " data-level="8.9.1" data-path="../../nats_streaming/monitoring/enabling.html">
<a href="../../nats_streaming/monitoring/enabling.html">
Enabling
</a>
</li>
<li class="chapter " data-level="8.9.2" data-path="../../nats_streaming/monitoring/endpoints.html">
<a href="../../nats_streaming/monitoring/endpoints.html">
Endpoints
</a>
</li>
</ul>
</li>
<li class="header">NATS Protocol</li>
<li class="chapter " data-level="9.1" data-path="../../nats_protocol/nats-protocol-demo.html">
<a href="../../nats_protocol/nats-protocol-demo.html">
Protocol Demo
</a>
</li>
<li class="chapter " data-level="9.2" data-path="../../nats_protocol/nats-protocol.html">
<a href="../../nats_protocol/nats-protocol.html">
Client Protocol
</a>
<ul class="articles">
<li class="chapter " data-level="9.2.1" data-path="../../nats_protocol/nats-client-dev.html">
<a href="../../nats_protocol/nats-client-dev.html">
Developing a Client
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="9.3" data-path="../../nats_protocol/nats-server-protocol.html">
<a href="../../nats_protocol/nats-server-protocol.html">
NATS Cluster Protocol
</a>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="../.." >The Streaming Protocol</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<div id="book-search-results">
<div class="search-noresults">
<section class="normal markdown-section">
<h1 id="writing-your-own-client-library"><a name="writing-your-own-client-library" class="plugin-anchor" href="#writing-your-own-client-library"><i class="fa fa-link" aria-hidden="true"></i></a>Writing your own client library</h1>
<p>You can find a list of all supported client libraries <a href="https://nats.io/download/" target="_blank">here</a>. There are also links to community contributed clients.</p>
<p>In the event you would want to write your own NATS Streaming library, you could have a look at existing libraries to understand the flow. But you need to use <a href="https://developers.google.com/protocol-buffers/" target="_blank">Google Protocol Buffers</a> to exchange protocols between the client and the server.</p>
<h2 id="nats-streaming-protocol"><a name="nats-streaming-protocol" class="plugin-anchor" href="#nats-streaming-protocol"><i class="fa fa-link" aria-hidden="true"></i></a>NATS Streaming Protocol</h2>
<p>The NATS streaming protocol sits atop the core NATS protocol and uses <a href="https://developers.google.com/protocol-buffers/" target="_blank">Google&apos;s Protocol Buffers</a>. Protocol buffer messages are marshaled into bytes and published as NATS messages on specific subjects described below. In communicating with the NATS Streaming Server, the NATS request/reply pattern is used for all protocol messages that have a corresponding reply.</p>
<h3 id="nats-streaming-protocol-conventions"><a name="nats-streaming-protocol-conventions" class="plugin-anchor" href="#nats-streaming-protocol-conventions"><i class="fa fa-link" aria-hidden="true"></i></a>NATS streaming protocol conventions</h3>
<p><strong>Subject names</strong>: Subject names, including reply subject (INBOX) names, are case-sensitive and must be non-empty alphanumeric strings with no embedded whitespace, and optionally token-delimited using the dot character (<code>.</code>), e.g.:</p>
<p><code>FOO</code>, <code>BAR</code>, <code>foo.bar</code>, <code>foo.BAR</code>, <code>FOO.BAR</code> and <code>FOO.BAR.BAZ</code> are all valid subject names</p>
<p><code>FOO. BAR</code>, <code>foo. .bar</code> and<code>foo..bar</code> are *not- valid subject names</p>
<p><strong>Wildcards</strong>: NATS streaming does <strong>not</strong> support wildcards in subject subscriptions</p>
<p><strong>Protocol definition</strong>: The fields of NATS streaming protocol messages are defined in the NATS streaming client <a href="https://github.com/nats-io/stan.go/blob/master/pb/protocol.proto" target="_blank">protocol file</a>.</p>
<h3 id="nats-streaming-protocol-messages"><a name="nats-streaming-protocol-messages" class="plugin-anchor" href="#nats-streaming-protocol-messages"><i class="fa fa-link" aria-hidden="true"></i></a>NATS streaming protocol messages</h3>
<p>The following table briefly describes the NATS streaming protocol messages.</p>
<p>Click the name to see more detailed information, including usage:</p>
<h4 id="protocols"><a name="protocols" class="plugin-anchor" href="#protocols"><i class="fa fa-link" aria-hidden="true"></i></a>Protocols</h4>
<table>
<thead>
<tr>
<th>Message Name</th>
<th style="text-align:left">Sent By</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#connectrequest"><code>ConnectRequest</code></a></td>
<td style="text-align:left">Client</td>
<td style="text-align:left">Request to connect to the NATS Streaming Server</td>
</tr>
<tr>
<td><a href="#connectresponse"><code>ConnectResponse</code></a></td>
<td style="text-align:left">Server</td>
<td style="text-align:left">Result of a connection request</td>
</tr>
<tr>
<td><a href="#subscriptionrequest"><code>SubscriptionRequest</code></a></td>
<td style="text-align:left">Client</td>
<td style="text-align:left">Request sent to subscribe and retrieve data</td>
</tr>
<tr>
<td><a href="#subscriptionresponse"><code>SubscriptionResponse</code></a></td>
<td style="text-align:left">Server</td>
<td style="text-align:left">Result of a subscription request</td>
</tr>
<tr>
<td><a href="#unsubscriberequest"><code>UnsubscribeRequest</code></a></td>
<td style="text-align:left">Client</td>
<td style="text-align:left">Unsubscribe from a subject</td>
</tr>
<tr>
<td><a href="#pubmsg"><code>PubMsg</code></a></td>
<td style="text-align:left">Client</td>
<td style="text-align:left">Publish a message to a subject</td>
</tr>
<tr>
<td><a href="#puback"><code>PubAck</code></a></td>
<td style="text-align:left">Server</td>
<td style="text-align:left">An acknowledgement that a published message has been processed on the server</td>
</tr>
<tr>
<td><a href="#msgproto"><code>MsgProto</code></a></td>
<td style="text-align:left">Server</td>
<td style="text-align:left">A message from the NATS Streaming Server to a subscribing client</td>
</tr>
<tr>
<td><a href="#ack"><code>Ack</code></a></td>
<td style="text-align:left">Client</td>
<td style="text-align:left">Acknowledges that a message has been received</td>
</tr>
<tr>
<td><a href="#ping"><code>Ping</code></a></td>
<td style="text-align:left">Client</td>
<td style="text-align:left">Ping sent to server to detect connection loss</td>
</tr>
<tr>
<td><a href="#pingresponse"><code>PingResponse</code></a></td>
<td style="text-align:left">Server</td>
<td style="text-align:left">Result of a Ping</td>
</tr>
<tr>
<td><a href="#closerequest"><code>CloseRequest</code></a></td>
<td style="text-align:left">Client</td>
<td style="text-align:left">Request sent to close the connection to the NATS Streaming Server</td>
</tr>
<tr>
<td><a href="#closeresponse"><code>CloseResp</code></a></td>
<td style="text-align:left">Server</td>
<td style="text-align:left">Result of the close request</td>
</tr>
</tbody>
</table>
<p>The following sections explain each protocol message.</p>
<h4 id="connectrequest"><a name="connectrequest" class="plugin-anchor" href="#connectrequest"><i class="fa fa-link" aria-hidden="true"></i></a>ConnectRequest</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>A connection request is sent when a streaming client connects to the NATS Streaming Server. The connection request contains a unique identifier representing the client, and an inbox subject the client will listen on for incoming heartbeats. The identifier <strong>must</strong> be unique; a connection attempt with an identifier currently in use will fail. The inbox subject is the subject where the client receives incoming heartbeats, and responds by publishing an empty NATS message to the reply subject, indicating it is alive. The NATS Streaming Server will return a <a href="#connectresponse">ConnectResponse</a> message to the reply subject specified in the NATS request message.</p>
<p>More advanced libraries can set the protocol to 1 and send a connection ID which in combination with ping interval and ping max out allows the library to detect that the connection to the server is lost.</p>
<p>This request is published to a subject comprised of the <code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>discover-prefix</span><span class="token punctuation">&gt;</span></span>.cluster-id</code>, for example, if a NATS Streaming Server was started with a cluster-id of <code>mycluster</code>, and the default prefix was used, the client publishes to <code>_STAN.discover.mycluster</code></p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>clientID</code>: A unique identifier for a client</li>
<li><code>heartbeatInbox</code>: An inbox to which the NATS Streaming Server will send heartbeats for the client to process</li>
<li><code>protocol</code>: Protocol the client is at</li>
<li><code>connID</code>: Connection ID, a way to uniquely identify a connection (no connection should ever have the same)</li>
<li><code>pingInterval</code>: Interval at which client wishes to send PINGs (expressed in seconds)</li>
<li><code>pingMaxOut</code>: Maximum number of PINGs without a response after which the connection can be considered lost</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="connectresponse"><a name="connectresponse" class="plugin-anchor" href="#connectresponse"><i class="fa fa-link" aria-hidden="true"></i></a>ConnectResponse</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>After a <code>ConnectRequest</code> is published, the NATS Streaming Server responds with this message on the reply subject of the underlying NATS request. The NATS Streaming Server requires the client to make requests and publish messages on certain subjects (described above), and when a connection is successful, the client saves the information returned to be used in sending other NATS streaming protocol messages. In the event the connection was not successful, an error is returned in the <code>error</code> field.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>pubPrefix</code>: Prefix to use when publishing</li>
<li><code>subRequests</code>: Subject used for subscription requests</li>
<li><code>unsubRequests</code>: Subject used for unsubscribe requests</li>
<li><code>closeRequests</code>: Subject for closing a connection</li>
<li><code>error</code>: An error string, which will be empty/omitted upon success</li>
<li><code>subCloseRequests</code>: Subject to use for subscription close requests</li>
<li><code>pingRequests</code>: Subject to use for PING requests</li>
<li><code>pingInterval</code>: Interval at which client should send PINGs (expressed in seconds).</li>
<li><code>pingMaxOut</code>: Maximum number of PINGs without a response after which the connection can be considered lost</li>
<li><code>protocol</code>: Protocol version the server is at</li>
<li><code>publicKey</code>: Reserved for future use</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="subscriptionrequest"><a name="subscriptionrequest" class="plugin-anchor" href="#subscriptionrequest"><i class="fa fa-link" aria-hidden="true"></i></a>SubscriptionRequest</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>A <code>SubscriptionRequest</code> is published on the subject returned in the <code>subRequests</code> field of a <a href="#connectresponse">ConnectResponse</a>, and creates a subscription to a subject on the NATS Streaming Server. This will return a <a href="#subscriptionresponse">SubscriptionResponse</a> message to the reply subject specified in the NATS protocol request message.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>clientID</code>: Client ID originally provided in the <a href="#connectrequest">ConnectRequest</a></li>
<li><code>subject</code>: Formal subject to subscribe to, e.g. foo.bar</li>
<li><code>qGroup</code>: Optional queue group</li>
<li><code>inbox</code>: Inbox subject to deliver messages on</li>
<li><code>maxInFlight</code>: Maximum inflight messages without an acknowledgement allowed</li>
<li><code>ackWaitInSecs</code>: Timeout for receiving an acknowledgement from the client</li>
<li><code>durableName</code>: Optional durable name which survives client restarts</li>
<li><code>startPosition</code>: An enumerated type specifying the point in history to start replaying data</li>
<li><code>startSequence</code>: Optional start sequence number</li>
<li><code>startTimeDelta</code>: Optional start time</li>
</ul>
<h5 id="startposition-enumeration"><a name="startposition-enumeration" class="plugin-anchor" href="#startposition-enumeration"><i class="fa fa-link" aria-hidden="true"></i></a>StartPosition enumeration</h5>
<ul>
<li><code>NewOnly</code>: Send only new messages</li>
<li><code>LastReceived</code>: Send only the last received message</li>
<li><code>TimeDeltaStart</code>: Send messages from duration specified in the <code>startTimeDelta</code> field.</li>
<li><code>SequenceStart</code>: Send messages starting from the sequence in the <code>startSequence</code> field.</li>
<li><code>First</code>: Send all available messages</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="subscriptionresponse"><a name="subscriptionresponse" class="plugin-anchor" href="#subscriptionresponse"><i class="fa fa-link" aria-hidden="true"></i></a>SubscriptionResponse</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>The <code>SubscriptionResponse</code> message is the response from the <code>SubscriptionRequest</code>. After a client has processed an incoming <a href="#msgproto">MsgProto</a> message, it must send an acknowledgement to the <code>ackInbox</code> subject provided here.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>ackInbox</code>: subject the client sends message acknowledgements to the NATS Streaming Server</li>
<li><code>error</code>: error string, empty/omitted if no error</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="unsubscriberequest"><a name="unsubscriberequest" class="plugin-anchor" href="#unsubscriberequest"><i class="fa fa-link" aria-hidden="true"></i></a>UnsubscribeRequest</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>The <code>UnsubscribeRequest</code> closes or unsubcribes the subscription from the specified subject. The inbox specified is the <code>inbox</code> returned from the NATS Streaming Server in the <code>SubscriptionResponse</code>. Depending on which subject this request is sent, the action will result in close (if sent to subject <code>subCloseRequests</code>) or unsubscribe (if sent to subject <code>unsubRequests</code>)</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>clientID</code>: Client ID originally provided in the <a href="#connectrequest">ConnectRequest</a></li>
<li><code>subject</code>: Subject for the subscription</li>
<li><code>inbox</code>: Inbox subject to identify subscription</li>
<li><code>durableName</code>: Optional durable name which survives client restarts</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="pubmsg"><a name="pubmsg" class="plugin-anchor" href="#pubmsg"><i class="fa fa-link" aria-hidden="true"></i></a>PubMsg</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>The <code>PubMsg</code> protocol message is published from a client to the NATS Streaming Server. The GUID must be unique, and is returned in the <a href="#puback">PubAck</a> message to correlate the success or failure of storing this particular message.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>clientID</code>: Client ID originally provided in the <a href="#connectrequest">ConnectRequest</a></li>
<li><code>guid</code>: a guid generated for this particular message</li>
<li><code>subject</code>: subject</li>
<li><code>data</code>: payload</li>
<li><code>connID</code>: Connection ID. For servers that know about this field, clientID can be omitted</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="puback"><a name="puback" class="plugin-anchor" href="#puback"><i class="fa fa-link" aria-hidden="true"></i></a>PubAck</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>The <code>PubAck</code> message is an acknowledgement from the NATS Streaming Server that a message has been processed. The message arrives on the subject specified on the reply subject of the NATS message the <code>PubMsg</code> was published on. The GUID is the same GUID used in the <code>PubMsg</code> being acknowledged. If an error string is present, the message was not persisted by the NATS Streaming Server and no guarantees regarding persistence are honored. <code>PubAck</code> messages may be handled asynchronously from their corresponding <code>PubMsg</code> in the client.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>guid</code>: GUID of the message being acknowledged by the NATS Streaming Server</li>
<li><code>error</code>: An error string, empty/omitted if no error</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="msgproto"><a name="msgproto" class="plugin-anchor" href="#msgproto"><i class="fa fa-link" aria-hidden="true"></i></a>MsgProto</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>The <code>MsgProto</code> message is received by client from the NATS Streaming Server, containing the payload of messages sent by a publisher. A <code>MsgProto</code> message that is not acknowledged with an <a href="#ack">Ack</a> message within the duration specified by the <code>ackWaitInSecs</code> field of the subscription request will be redelivered.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>sequence</code>: Globally ordered sequence number for the subject&apos;s channel</li>
<li><code>subject</code>: Subject</li>
<li><code>data</code>: Payload</li>
<li><code>timestamp</code>: Time the message was stored in the server.</li>
<li><code>redelivered</code>: Flag specifying if the message is being redelivered</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="ack"><a name="ack" class="plugin-anchor" href="#ack"><i class="fa fa-link" aria-hidden="true"></i></a>Ack</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>An <code>Ack</code> message is an acknowledgement from the client that a <a href="#msgproto">MsgProto</a> message has been considered received. It is published to the <code>ackInbox</code> field of the <a href="#subscriptionresponse">SubscriptionResponse</a>.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>subject</code>: Subject of the message being acknowledged</li>
<li><code>sequence</code>: Sequence of the message being acknowledged</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="ping"><a name="ping" class="plugin-anchor" href="#ping"><i class="fa fa-link" aria-hidden="true"></i></a>Ping</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>A <code>Ping</code> message is sent to the server at configured interval to check that the connection ID is still valid. This should be used only if client is at protocol 1, and has sent a <code>connID</code> in the <a href="#connectrequest">ConnectRequest</a> protocol.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>connID</code>: The connection ID</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="pingresponse"><a name="pingresponse" class="plugin-anchor" href="#pingresponse"><i class="fa fa-link" aria-hidden="true"></i></a>PingResponse</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>This is a response from the server to a <code>Ping</code> from the client. If the content is not empty, it will be the error indicating to the client why the connection is no longer valid.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>error</code>: Error string, empty/omitted if no error</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="closerequest"><a name="closerequest" class="plugin-anchor" href="#closerequest"><i class="fa fa-link" aria-hidden="true"></i></a>CloseRequest</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>A <code>CloseRequest</code> message is published on the <code>closeRequests</code> subject from the <a href="#connectresponse">ConnectResponse</a>, and notifies the NATS Streaming Server that the client connection is closing, allowing the server to free up resources. This message should <strong>always</strong> be sent when a client is finished using a connection.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>clientID</code>: Client ID originally provided in the <a href="#connectrequest">ConnectRequest</a></li>
</ul>
<p><a href="#protocols">Back to table</a></p>
<h4 id="closeresponse"><a name="closeresponse" class="plugin-anchor" href="#closeresponse"><i class="fa fa-link" aria-hidden="true"></i></a>CloseResponse</h4>
<h5 id="description"><a name="description" class="plugin-anchor" href="#description"><i class="fa fa-link" aria-hidden="true"></i></a>Description</h5>
<p>The <code>CloseResponse</code> is sent by the NATS Streaming Server on the reply subject of the <code>CloseRequest</code> NATS message. This response contains any error that may have occurred with the corresponding close call.</p>
<h5 id="message-structure"><a name="message-structure" class="plugin-anchor" href="#message-structure"><i class="fa fa-link" aria-hidden="true"></i></a>Message Structure</h5>
<ul>
<li><code>error</code>: error string, empty/omitted if no error</li>
</ul>
<p><a href="#protocols">Back to table</a></p>
</section>
</div>
<div class="search-results">
<div class="has-results">
<h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
<ul class="search-results-list"></ul>
</div>
<div class="no-results">
<h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
</div>
</div>
</div>
</div>
</div>
</div>
<a href="acks.html" class="navigation navigation-prev " aria-label="Previous page: Acknowledgements">
<i class="fa fa-angle-left"></i>
</a>
<a href="../../nats_streaming/gettingstarted/install.html" class="navigation navigation-next " aria-label="Next page: Installing">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"The Streaming Protocol","level":"7.8","depth":1,"next":{"title":"Installing","level":"8.1","depth":1,"path":"nats_streaming/gettingstarted/install.md","ref":"nats_streaming/gettingstarted/install.md","articles":[]},"previous":{"title":"Acknowledgements","level":"7.7","depth":1,"path":"developer/streaming/acks.md","ref":"developer/streaming/acks.md","articles":[]},"dir":"ltr"},"config":{"plugins":["prism","-sharing","-highlight","include-html","toggle-chapters","anchors"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"prism":{"lang":{"ascii":"markup","text":"markup"}},"include-html":{},"toggle-chapters":{},"anchors":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"The NATS Maintainers","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"NATS","gitbook":"*","description":"Administrative, developer and conceptual documentation for the NATS messaging system."},"file":{"path":"developer/streaming/protocol.md","mtime":"2019-05-30T22:52:52.237Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-06-07T16:09:42.554Z"},"basePath":"../..","book":{"language":""}});
});
</script>
</div>
<!-- Viz Support -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/2.1.2/viz.js"> </script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/viz.js/2.1.2/lite.render.js"> </script>
<!-- Site code -->
<script>
function flash(elem, text, speed) {
if (!elem) {
return;
}
var s = elem.style;
elem.textContent = text;
s.display = 'block';
s.opacity = 1;
(function fade() {
(s.opacity -= .1) < .1 ? s.display = "none" : setTimeout(fade, speed)
})();
}
function copyToClipboard(text, el) {
var copyTest = document.queryCommandSupported('copy');
var elOriginalText = el.getAttribute('data-original-title');
if (copyTest === true) {
var copyTextArea = document.createElement("textarea");
copyTextArea.value = text;
document.body.appendChild(copyTextArea);
copyTextArea.select();
try {
var successful = document.execCommand('copy');
var msg = successful ? 'Copied!' : 'Whoops, not copied!';
var parent = el.parentNode.parentNode;
var msgElem = parent.querySelector(".copy-msg");
flash(msgElem, msg, 100);
} catch (err) {
console.log('Oops, unable to copy', err);
}
document.body.removeChild(copyTextArea);
el.setAttribute('data-original-title', elOriginalText);
} else {
// Fallback if browser doesn't support .execCommand('copy')
window.prompt("Copy to clipboard: Ctrl+C or Command+C, Enter", text);
}
}
function processGraphVizSections(elements) {
var elements = document.querySelectorAll("[data-viz]");
var viz = new Viz();
Array.prototype.forEach.call(elements, function (x) {
var engine = x.getAttribute("data-viz");
var image = viz.renderImageElement(x.innerText, {
format: "png",
engine: engine
}).then(function (element) {
x.parentNode.insertBefore(element, x);
});
});
};
function updateLanguageParameter(value) {
const param = "lang";
if (window.location.href.indexOf("?") >= 0) {
const regExp = new RegExp(param + "(.+?)(&|$)", "g");
const newUrl = window.location.href.replace(regExp, param + "=" + encodeURIComponent(value) + "$2");
window.history.pushState("", "", newUrl);
} else {
const newUrl = window.location.href + "?" + param + "=" + encodeURIComponent(value);
window.history.pushState("", "", newUrl);
}
}
function getLanguageParameter() {
var match = RegExp('[?&]lang=([^&]*)').exec(window.location.search);
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}
function docReady() {
window.gitbook.events.bind("page.change", function () {
pageChanged();
});
}
function pageChanged() {
var logos = document.querySelectorAll(".nats");
if (logos && logos.length == 0) {
gitbook.toolbar.createButton({
icon: 'nats',
label: 'NATS Home Page',
position: 'right',
onClick: function () {
var win = window.open("https://nats.io/", '_blank');
win.focus();
}
});
}
document.querySelectorAll('.js-copy').forEach(elem => {
elem.addEventListener("click", function () {
var el = this;
var parent = this.parentNode.parentNode;
var code = parent.querySelector('code');
var text = code.textContent || code.innerText;
copyToClipboard(text, el);
})
});
document.querySelectorAll('.api-lang').forEach(elem => {
elem.addEventListener("click", function () {
var curLang = sessionStorage.getItem('nats-api-language');
var lang = this.getAttribute('data-language');
// Stop the infinite loop
if (curLang == lang) {
return;
}
sessionStorage.setItem('nats-api-language', lang); // So we only do this 1x
updateLanguageParameter(lang)
document.querySelectorAll('.api-lang[data-language=' + lang + ']').forEach(elem => {
elem.click();
});
})
});
if (sessionStorage) {
var curLang = sessionStorage.getItem('nats-api-language');
var queryLang = getLanguageParameter();
var lang = curLang;
if (queryLang) { // query takes precedent
lang = queryLang
}
if (lang) {
document.querySelectorAll('.api-lang[data-language=' + lang + ']').forEach(elem => {
elem.click();
});
}
}
setTimeout(function () {
processGraphVizSections();
}, 1);
}
if (document.readyState != 'loading') docReady();
else if (document.addEventListener) document.addEventListener('DOMContentLoaded', docReady);
else document.attachEvent('onreadystatechange', function () {
if (document.readyState == 'complete') docReady();
});
</script>
<!-- Github Buttons -->
<script async defer src="https://buttons.github.io/buttons.js"></script>
<!-- Styles -->
<style>
.nats {
display: inline-block;
width: 16px;
height: 16px;
background: url(https://nats.io/img/nats-icon-color.svg);
background-size: 16px 16px;
background-repeat: no-repeat;
}
div.graphviz {
background: transparent;
border: 0;
padding-top: 15px;
padding-right: 15px;
padding-bottom: 25px;
padding-left: 15px;
text-align: center;
}
code[data-viz] {
display: none;
}
.tab-wrap {
transition: 0.3s box-shadow ease;
border-radius: 6px;
max-width: 100%;
display: flex;
flex-wrap: wrap;
position: relative;
list-style: none;
background-color: #fff;
margin: 20px 0;
/* box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);*/
}
.tab-wrap:hover {
box-shadow: 0 12px 23px rgba(0, 0, 0, 0.23), 0 10px 10px rgba(0, 0, 0, 0.19);
}
.tab {
display: none;
}
/* Using scss these would be generated, we have to manually create enough for all tabs, start with 8 */
.tab:checked:nth-of-type(1)~.tab__content:nth-of-type(1) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:checked:nth-of-type(2)~.tab__content:nth-of-type(2) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:checked:nth-of-type(3)~.tab__content:nth-of-type(3) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:checked:nth-of-type(4)~.tab__content:nth-of-type(4) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:checked:nth-of-type(5)~.tab__content:nth-of-type(5) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:checked:nth-of-type(6)~.tab__content:nth-of-type(6) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:checked:nth-of-type(7)~.tab__content:nth-of-type(7) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:checked:nth-of-type(8)~.tab__content:nth-of-type(8) {
opacity: 1;
transition: 0.5s opacity ease-in, 0.8s -webkit-transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease;
transition: 0.5s opacity ease-in, 0.8s transform ease, 0.8s -webkit-transform ease;
position: relative;
top: 0;
z-index: 100;
-webkit-transform: translateY(0px);
transform: translateY(0px);
text-shadow: 0 0 0;
}
.tab:first-of-type:not(:last-of-type)+label {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.tab:not(:first-of-type):not(:last-of-type)+label {
border-radius: 0;
}
.tab:last-of-type:not(:first-of-type)+label {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.tab:checked+label {
background-color: #fff;
box-shadow: 0 -1px 0 #fff inset;
cursor: default;
font-weight: bold;
border: 1px solid #ddd;
border-bottom-color: transparent;
}
.tab:checked+label:hover {
box-shadow: 0 -1px 0 #fff inset;
background-color: #fff;
}
.tab+label {
box-shadow: 0 -1px 0 #eee inset;
border-radius: 6px 6px 0 0;
cursor: pointer;
display: block;
text-decoration: none;
color: #27aae1;
flex-grow: 3;
text-align: center;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
text-align: center;
transition: 0.3s background-color ease, 0.3s box-shadow ease;
height: 50px;
box-sizing: border-box;
padding: 15px;
}
.tab+label:hover {
background-color: #f9f9f9;
box-shadow: 0 1px 0 #f4f4f4 inset;
}
.tab__content {
padding: 2px 2px;
background-color: transparent;
position: absolute;
width: 100%;
z-index: -1;
opacity: 0;
left: 0;
-webkit-transform: translateY(-3px);
transform: translateY(-3px);
border-radius: 6px;
}
.tab__content pre {
margin-bottom: 0px !important;
}
.toolbar-icons {
display: inline-block;
position: relative;
padding-left: 4px;
}
a.toolbar-icons {
text-decoration: none;
}
.toolbar-icons .mdi {
color: #4183c4;
}
.copy-msg {
color: #4183c4;
}
.pull-right {
float: right !important;
}
.pull-left {
float: left !important;
}
</style>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-111730698-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-111730698-1');
</script>
<script src="../../gitbook/gitbook.js"></script>
<script src="../../gitbook/theme.js"></script>
<script src="../../gitbook/gitbook-plugin-toggle-chapters/toggle.js"></script>
<script src="../../gitbook/gitbook-plugin-search/search-engine.js"></script>
<script src="../../gitbook/gitbook-plugin-search/search.js"></script>
<script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
<script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
<script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
</body>
</html>