1
0
mirror of https://github.com/taigrr/nats.docs synced 2025-01-18 04:03:23 -08:00
nats.docs/docs/whats_new/whats_new_20.html
2019-09-27 16:14:03 -05:00

3283 lines
89 KiB
HTML

<!DOCTYPE HTML>
<html lang="" >
<head>
<meta charset="UTF-8">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>What's New in 2.0 ยท 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="../faq.html" />
<link rel="prev" href="../" />
<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 active" data-level="1.2" data-path="whats_new_20.html">
<a href="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="../developer/concepts/intro.html">
<a href="../developer/concepts/intro.html">
What is NATS
</a>
</li>
<li class="chapter " data-level="2.2" data-path="../developer/concepts/subjects.html">
<a href="../developer/concepts/subjects.html">
Subject-Based Messaging
</a>
</li>
<li class="chapter " data-level="2.3" data-path="../developer/concepts/pubsub.html">
<a href="../developer/concepts/pubsub.html">
Publish-Subscribe
</a>
</li>
<li class="chapter " data-level="2.4" data-path="../developer/concepts/reqreply.html">
<a href="../developer/concepts/reqreply.html">
Request-Reply
</a>
</li>
<li class="chapter " data-level="2.5" data-path="../developer/concepts/queue.html">
<a href="../developer/concepts/queue.html">
Queue Groups
</a>
</li>
<li class="chapter " data-level="2.6" data-path="../developer/concepts/acks.html">
<a href="../developer/concepts/acks.html">
Acknowledgements
</a>
</li>
<li class="chapter " data-level="2.7" data-path="../developer/concepts/seq_num.html">
<a href="../developer/concepts/seq_num.html">
Sequence Numbers
</a>
</li>
<li class="header">Developing With NATS</li>
<li class="chapter " data-level="3.1" data-path="../developer/">
<a href="../developer/">
Introduction
</a>
</li>
<li class="chapter " data-level="3.2" data-path="../developer/connecting/intro.html">
<a href="../developer/connecting/intro.html">
Connecting
</a>
<ul class="articles">
<li class="chapter " data-level="3.2.1" data-path="../developer/connecting/default_server.html">
<a href="../developer/connecting/default_server.html">
Connecting to the Default Server
</a>
</li>
<li class="chapter " data-level="3.2.2" data-path="../developer/connecting/specific_server.html">
<a href="../developer/connecting/specific_server.html">
Connecting to a Specific Server
</a>
</li>
<li class="chapter " data-level="3.2.3" data-path="../developer/connecting/cluster.html">
<a href="../developer/connecting/cluster.html">
Connecting to a Cluster
</a>
</li>
<li class="chapter " data-level="3.2.4" data-path="../developer/connecting/connect_timeout.html">
<a href="../developer/connecting/connect_timeout.html">
Setting a Connect Timeout
</a>
</li>
<li class="chapter " data-level="3.2.5" data-path="../developer/connecting/pingpong.html">
<a href="../developer/connecting/pingpong.html">
Ping/Pong Protocol
</a>
</li>
<li class="chapter " data-level="3.2.6" data-path="../developer/connecting/protocol.html">
<a href="../developer/connecting/protocol.html">
Controlling the Client/Server Protocol
</a>
</li>
<li class="chapter " data-level="3.2.7" data-path="../developer/connecting/noecho.html">
<a href="../developer/connecting/noecho.html">
Turning Off Echo'd Messages
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.3" data-path="../developer/reconnect/intro.html">
<a href="../developer/reconnect/intro.html">
Automatic Reconnections
</a>
<ul class="articles">
<li class="chapter " data-level="3.3.1" data-path="../developer/reconnect/disable.html">
<a href="../developer/reconnect/disable.html">
Disabling Reconnect
</a>
</li>
<li class="chapter " data-level="3.3.2" data-path="../developer/reconnect/max.html">
<a href="../developer/reconnect/max.html">
Set the Number of Reconnect Attempts
</a>
</li>
<li class="chapter " data-level="3.3.3" data-path="../developer/reconnect/wait.html">
<a href="../developer/reconnect/wait.html">
Pausing Between Reconnect Attempts
</a>
</li>
<li class="chapter " data-level="3.3.4" data-path="../developer/reconnect/random.html">
<a href="../developer/reconnect/random.html">
Avoiding the Thundering Herd
</a>
</li>
<li class="chapter " data-level="3.3.5" data-path="../developer/reconnect/events.html">
<a href="../developer/reconnect/events.html">
Listening for Reconnect Events
</a>
</li>
<li class="chapter " data-level="3.3.6" data-path="../developer/reconnect/buffer.html">
<a href="../developer/reconnect/buffer.html">
Buffering Messages During Reconnect Attempts
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.4" data-path="../developer/security/intro.html">
<a href="../developer/security/intro.html">
Securing Connections
</a>
<ul class="articles">
<li class="chapter " data-level="3.4.1" data-path="../developer/security/userpass.html">
<a href="../developer/security/userpass.html">
Authenticating with a User and Password
</a>
</li>
<li class="chapter " data-level="3.4.2" data-path="../developer/security/token.html">
<a href="../developer/security/token.html">
Authenticating with a Token
</a>
</li>
<li class="chapter " data-level="3.4.3" data-path="../developer/security/nkey.html">
<a href="../developer/security/nkey.html">
Authenticating with an NKey
</a>
</li>
<li class="chapter " data-level="3.4.4" data-path="../developer/security/creds.html">
<a href="../developer/security/creds.html">
Authenticating with a Credentials File
</a>
</li>
<li class="chapter " data-level="3.4.5" data-path="../developer/security/tls.html">
<a href="../developer/security/tls.html">
Encrypting Connections with TLS
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.5" data-path="../developer/receiving/intro.html">
<a href="../developer/receiving/intro.html">
Receiving Messages
</a>
<ul class="articles">
<li class="chapter " data-level="3.5.1" data-path="../developer/receiving/sync.html">
<a href="../developer/receiving/sync.html">
Synchronous Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.2" data-path="../developer/receiving/async.html">
<a href="../developer/receiving/async.html">
Asynchronous Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.3" data-path="../developer/receiving/unsubscribing.html">
<a href="../developer/receiving/unsubscribing.html">
Unsubscribing
</a>
</li>
<li class="chapter " data-level="3.5.4" data-path="../developer/receiving/unsub_after.html">
<a href="../developer/receiving/unsub_after.html">
Unsubscribing After N Messages
</a>
</li>
<li class="chapter " data-level="3.5.5" data-path="../developer/receiving/reply.html">
<a href="../developer/receiving/reply.html">
Replying to a Message
</a>
</li>
<li class="chapter " data-level="3.5.6" data-path="../developer/receiving/wildcards.html">
<a href="../developer/receiving/wildcards.html">
Wildcard Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.7" data-path="../developer/receiving/queues.html">
<a href="../developer/receiving/queues.html">
Queue Subscriptions
</a>
</li>
<li class="chapter " data-level="3.5.8" data-path="../developer/receiving/drain.html">
<a href="../developer/receiving/drain.html">
Draining Messages Before Disconnect
</a>
</li>
<li class="chapter " data-level="3.5.9" data-path="../developer/receiving/structure.html">
<a href="../developer/receiving/structure.html">
Structured Data
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.6" data-path="../developer/sending/intro.html">
<a href="../developer/sending/intro.html">
Sending Messages
</a>
<ul class="articles">
<li class="chapter " data-level="3.6.1" data-path="../developer/sending/replyto.html">
<a href="../developer/sending/replyto.html">
Including a Reply Subject
</a>
</li>
<li class="chapter " data-level="3.6.2" data-path="../developer/sending/request_reply.html">
<a href="../developer/sending/request_reply.html">
Request-Reply Semantics
</a>
</li>
<li class="chapter " data-level="3.6.3" data-path="../developer/sending/caches.html">
<a href="../developer/sending/caches.html">
Caches, Flush and Ping
</a>
</li>
<li class="chapter " data-level="3.6.4" data-path="../developer/sending/structure.html">
<a href="../developer/sending/structure.html">
Sending Structured Data
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.7" data-path="../developer/events/intro.html">
<a href="../developer/events/intro.html">
Monitoring the Connection
</a>
<ul class="articles">
<li class="chapter " data-level="3.7.1" data-path="../developer/events/events.html">
<a href="../developer/events/events.html">
Listen for Connection Events
</a>
</li>
<li class="chapter " data-level="3.7.2" data-path="../developer/events/slow.html">
<a href="../developer/events/slow.html">
Slow Consumers
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="3.8" data-path="../developer/tutorials/intro.html">
<a href="../developer/tutorials/intro.html">
Tutorials
</a>
<ul class="articles">
<li class="chapter " data-level="3.8.1" data-path="../developer/tutorials/pubsub.html">
<a href="../developer/tutorials/pubsub.html">
Explore NATS Pub/Sub
</a>
</li>
<li class="chapter " data-level="3.8.2" data-path="../developer/tutorials/reqreply.html">
<a href="../developer/tutorials/reqreply.html">
Explore NATS Request/Reply
</a>
</li>
<li class="chapter " data-level="3.8.3" data-path="../developer/tutorials/queues.html">
<a href="../developer/tutorials/queues.html">
Explore NATS Queueing
</a>
</li>
<li class="chapter " data-level="3.8.4" data-path="../developer/tutorials/custom_dialer.html">
<a href="../developer/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/nats-docker-tutorial.html">
<a href="../nats_docker/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>
<li class="chapter " data-level="5.3.5" data-path="../nats_tools/nsc/revocation.html">
<a href="../nats_tools/nsc/revocation.html">
Revocation
</a>
</li>
<li class="chapter " data-level="5.3.6" data-path="../nats_tools/nsc/managed.html">
<a href="../nats_tools/nsc/managed.html">
Managed Operators
</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/nats-top-tutorial.html">
<a href="../nats_tools/nats_top/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>
</li>
<li class="chapter " data-level="6.2" data-path="../nats_streaming/relation-to-nats.html">
<a href="../nats_streaming/relation-to-nats.html">
Relation to NATS
</a>
</li>
<li class="chapter " data-level="6.3" data-path="../nats_streaming/client-connections.html">
<a href="../nats_streaming/client-connections.html">
Client Connections
</a>
</li>
<li class="chapter " data-level="6.4" 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.4.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.4.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.4.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.4.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.4.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.4.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.5" data-path="../nats_streaming/store-interface.html">
<a href="../nats_streaming/store-interface.html">
Store Interface
</a>
</li>
<li class="chapter " data-level="6.6" data-path="../nats_streaming/store-encryption.html">
<a href="../nats_streaming/store-encryption.html">
Store Encryption
</a>
</li>
<li class="chapter " data-level="6.7" 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.7.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.7.2" data-path="../nats_streaming/clustering/configuration.html">
<a href="../nats_streaming/clustering/configuration.html">
Configuration
</a>
</li>
<li class="chapter " data-level="6.7.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.7.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.8" 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.8.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.8.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.8.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.8.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.9" data-path="../nats_streaming/partitioning.html">
<a href="../nats_streaming/partitioning.html">
Partitioning
</a>
</li>
<li class="chapter " data-level="6.10" data-path="../nats_streaming/monitoring/monitoring.html">
<a href="../nats_streaming/monitoring/monitoring.html">
Monitoring
</a>
<ul class="articles">
<li class="chapter " data-level="6.10.1" data-path="../nats_streaming/monitoring/endpoints.html">
<a href="../nats_streaming/monitoring/endpoints.html">
Endpoints
</a>
</li>
</ul>
</li>
<li class="header">Developing With NATS Streaming</li>
<li class="chapter " data-level="7.1" data-path="../developer/streaming/">
<a href="../developer/streaming/">
Introduction
</a>
</li>
<li class="chapter " data-level="7.2" data-path="../developer/streaming/connecting.html">
<a href="../developer/streaming/connecting.html">
Connecting to NATS Streaming
</a>
</li>
<li class="chapter " data-level="7.3" data-path="../developer/streaming/publishing.html">
<a href="../developer/streaming/publishing.html">
Publishing to a Channel
</a>
</li>
<li class="chapter " data-level="7.4" data-path="../developer/streaming/receiving.html">
<a href="../developer/streaming/receiving.html">
Receiving Messages from a Channel
</a>
</li>
<li class="chapter " data-level="7.5" data-path="../developer/streaming/durables.html">
<a href="../developer/streaming/durables.html">
Durable Subscriptions
</a>
</li>
<li class="chapter " data-level="7.6" data-path="../developer/streaming/queues.html">
<a href="../developer/streaming/queues.html">
Queue Subscriptions
</a>
</li>
<li class="chapter " data-level="7.7" data-path="../developer/streaming/acks.html">
<a href="../developer/streaming/acks.html">
Acknowledgements
</a>
</li>
<li class="chapter " data-level="7.8" data-path="../developer/streaming/protocol.html">
<a href="../developer/streaming/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/changes.html">
<a href="../nats_streaming/gettingstarted/changes.html">
Important Changes
</a>
</li>
<li class="chapter " data-level="8.2" data-path="../nats_streaming/gettingstarted/install.html">
<a href="../nats_streaming/gettingstarted/install.html">
Installing
</a>
</li>
<li class="chapter " data-level="8.3" data-path="../nats_streaming/gettingstarted/run.html">
<a href="../nats_streaming/gettingstarted/run.html">
Running
</a>
</li>
<li class="chapter " data-level="8.4" data-path="../nats_streaming/configuring/configuring.html">
<a href="../nats_streaming/configuring/configuring.html">
Configuring
</a>
<ul class="articles">
<li class="chapter " data-level="8.4.1" data-path="../nats_streaming/configuring/cmdline.html">
<a href="../nats_streaming/configuring/cmdline.html">
Command line arguments
</a>
</li>
<li class="chapter " data-level="8.4.2" data-path="../nats_streaming/configuring/cfgfile.html">
<a href="../nats_streaming/configuring/cfgfile.html">
Configuration file
</a>
</li>
<li class="chapter " data-level="8.4.3" data-path="../nats_streaming/configuring/storelimits.html">
<a href="../nats_streaming/configuring/storelimits.html">
Store Limits
</a>
<ul class="articles">
<li class="chapter " data-level="8.4.3.1" data-path="../nats_streaming/configuring/storelimits.html">
<a href="../nats_streaming/configuring/storelimits.html#limits-inheritance">
Limits inheritance
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="8.4.4" data-path="../nats_streaming/configuring/persistence.html">
<a href="../nats_streaming/configuring/persistence.html">
Persistence
</a>
<ul class="articles">
<li class="chapter " data-level="8.4.4.1" data-path="../nats_streaming/configuring/filestore.html">
<a href="../nats_streaming/configuring/filestore.html">
File Store
</a>
<ul class="articles">
<li class="chapter " data-level="8.4.4.1.1" data-path="../nats_streaming/configuring/filestore.html">
<a href="../nats_streaming/configuring/filestore.html#options">
Options
</a>
</li>
<li class="chapter " data-level="8.4.4.1.2" data-path="../nats_streaming/configuring/filestore.html">
<a href="../nats_streaming/configuring/filestore.html#recovery-errors">
Recovery Errors
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="8.4.4.2" data-path="../nats_streaming/configuring/sqlstore.html">
<a href="../nats_streaming/configuring/sqlstore.html">
SQL Store
</a>
<ul class="articles">
<li class="chapter " data-level="8.4.4.2.1" data-path="../nats_streaming/configuring/sqlstore.html">
<a href="../nats_streaming/configuring/sqlstore.html#read-and-write-timeouts">
Read and Write Timeouts
</a>
</li>
<li class="chapter " data-level="8.4.4.2.2" data-path="../nats_streaming/configuring/sqlstore.html">
<a href="../nats_streaming/configuring/sqlstore.html#options">
Options
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="8.4.5" data-path="../nats_streaming/configuring/tls.html">
<a href="../nats_streaming/configuring/tls.html">
Securing
</a>
<ul class="articles">
<li class="chapter " data-level="8.4.5.1" data-path="../nats_streaming/configuring/tls.html">
<a href="../nats_streaming/configuring/tls.html#authenticating-users">
Authenticating Users
</a>
</li>
<li class="chapter " data-level="8.4.5.2" data-path="../nats_streaming/configuring/tls.html">
<a href="../nats_streaming/configuring/tls.html#using-tls">
TLS
</a>
</li>
</ul>
</li>
</ul>
</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="../developer/streaming/embedding.html">
<a href="../developer/streaming/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="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=".." >What's New in 2.0</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="whats-new-in-nats-20"><a name="whats-new-in-nats-20" class="plugin-anchor" href="#whats-new-in-nats-20"><i class="fa fa-link" aria-hidden="true"></i></a>What&apos;s New in NATS 2.0</h1>
<p>NATS 2.0 is the largest feature release since the original code base for the
server was released. NATS 2.0 was created to allow a new way of thinking about
NATS as a shared utility, solving problems at scale through distributed
security, multi-tenancy, larger networks, and secure sharing of data.</p>
<h2 id="rationale"><a name="rationale" class="plugin-anchor" href="#rationale"><i class="fa fa-link" aria-hidden="true"></i></a>Rationale</h2>
<p>NATS 2.0 was created to address problems in large scale distributed computing.</p>
<p>It is difficult at best to combine identity management end-to-end
(or end-to-edge), with data sharing, while adhering to policy and compliance.
Current distributed systems increase significantly in operational complexity
as they scale upward. Problems arise around service discovery, connectivity,
scaling for volume, and application onboarding and updates.
Disaster recovery is difficult, especially as systems have evolved to
operate in silos defined by technology rather than business needs.
As complexity increases, systems become expensive to operate in terms of time
and money. They become fragile making it difficult to deploy services and
applications hindering innovation, increasing time to value and total cost
of ownership.</p>
<p>We decided to:</p>
<ul>
<li><strong>Reduce total cost of ownership</strong>: Users want reduced TCO for their
distributed systems. This is addressed by an easy to use technology that
can operate at global scale with simple configuration and a resilient
and cloud-native architecture.</li>
<li><strong>Decrease Time to Value</strong>: As systems scale, <em>time to value</em> increases.
Operations resist change due to risk in touching a complex and fragile
system. Providing isolation contexts can help mitigate this.</li>
<li><strong>Support manageable large scale deployments</strong>: No data silos defined by
software, instead easily managed through software to provide exactly what the
business needs. We wanted to provide easy to configure disaster recovery.</li>
<li><strong>Decentralize security</strong>: Provide security supporting one
technology end-to-end where organizations may self-manage making it
easier to support a massive number of endpoints.</li>
</ul>
<p>To achieve this, we added a number of new features that are transparent
to existing clients with 100% backward client compatibility.</p>
<h2 id="accounts"><a name="accounts" class="plugin-anchor" href="#accounts"><i class="fa fa-link" aria-hidden="true"></i></a>Accounts</h2>
<p>Accounts are securely isolated communication contexts that allow multi-tenancy
spanning a NATS deployment. Accounts allow users to bifurcate technology from
business driven use cases, where data silos are created by design, not software
limitations. When a client connects, it specifies an account or will default
to authentication with a global account.</p>
<p>At least some services need to share data outside of their account.
Data can be securely shared between accounts with secure services and
streams. Only mutual agreement between account owners permit data flow,
and the import account has complete control over its own subject space.</p>
<p>This means within an account, limitations may be set and subjects can be used
without worry of collisions with other groups or organizations. Development
groups choose any subjects without affecting the rest of the system, and open
up accounts to export or import only the services and streams they need.</p>
<p>Accounts are easy, secure, and cost effective. There is one NATS deployment
to manage, but organizations and development teams can self manage with more
autonomy reducing time to value with faster, more agile development practices.</p>
<h3 id="service-and-streams"><a name="service-and-streams" class="plugin-anchor" href="#service-and-streams"><i class="fa fa-link" aria-hidden="true"></i></a>Service and Streams</h3>
<p>Services and streams are mechanisms to share messages between accounts.</p>
<p>Think of a service as an RPC endpoint into an account. Behind that account
there might be many microservices working in concert to handle requests, but
from outside the account there is simply one subject exposed.</p>
<p><strong>Services</strong> definition to share an endpoint:</p>
<ul>
<li>Export a service to allow other accounts to import</li>
<li>Import a service to allow requests to be sent securely and seamlessly to
another account</li>
</ul>
<p>Use cases include most applications - anything that accepts a request and returns
a response.</p>
<p><strong>Stream</strong> definitions allow continuous data flow between accounts:</p>
<ul>
<li>Export a stream to allow egress</li>
<li>Import a stream to allow ingress</li>
</ul>
<p>Use cases include Observability, Metrics, and Data analytics. Any application
or endpoint reading a stream of data.</p>
<p>Note that services and streams operate with <strong>zero</strong> client configuration or
API changes. Services may even move between accounts, entirely transparent
to end clients.</p>
<h3 id="system-accounts"><a name="system-accounts" class="plugin-anchor" href="#system-accounts"><i class="fa fa-link" aria-hidden="true"></i></a>System Accounts</h3>
<p>The system account publishes system messages under established subject patterns.
These are internal NATS system messages that may be useful to operators.</p>
<p>Server initiated events and data include:</p>
<ul>
<li>Client connection events</li>
<li>Account connection status</li>
<li>Authentication errors</li>
<li>Leaf node connection events</li>
<li>Server stats summary</li>
</ul>
<p>Tools and clients with proper privileges can request:</p>
<ul>
<li>Service statistics</li>
<li>Server discovery and metrics</li>
</ul>
<p>Account servers will also publish messages when an account changes.</p>
<p>With this information and system metadata you can build useful
monitoring and anomaly detection tools.</p>
<h2 id="global-deployments"><a name="global-deployments" class="plugin-anchor" href="#global-deployments"><i class="fa fa-link" aria-hidden="true"></i></a>Global Deployments</h2>
<p>NATS 2.0 supports global deployments, allowing for global topologies that
optimize for WANs while extend to the edge or devices.</p>
<h3 id="self-healing"><a name="self-healing" class="plugin-anchor" href="#self-healing"><i class="fa fa-link" aria-hidden="true"></i></a>Self Healing</h3>
<p>While self healing features have been part of NATS 1.X releases, we
ensured they continue to work in global deployments. These include:</p>
<ul>
<li>Client and server connections automatically reconnect</li>
<li>Auto-Discovery where servers exchange server topology changes with each
other and with clients, in real time with zero configuration changes and
zero downtime while being entirely transparent to clients. Clients can
failover to servers they were not originally configured with.</li>
<li>NATS server clusters dynamically adjust to new or removed servers allowing
for seamless rolling upgrades and scaling up or down.</li>
</ul>
<h3 id="superclusters"><a name="superclusters" class="plugin-anchor" href="#superclusters"><i class="fa fa-link" aria-hidden="true"></i></a>Superclusters</h3>
<p>Conceptually, superclusters are clusters of NATS clusters. Create
superclusters to deploy a truly global NATS network. Superclusters use
a novel spline based technology with a unique approach to topology, keeping
one hop semantics and optimizing WAN traffic through optimistic sends with
interest graph pruning. Superclusters provide transparent, intelligent support
for geo-distributed queue subscribers.</p>
<h3 id="disaster-recovery"><a name="disaster-recovery" class="plugin-anchor" href="#disaster-recovery"><i class="fa fa-link" aria-hidden="true"></i></a>Disaster Recovery</h3>
<p>Superclusters inherently support disaster recovery. With geo-distributed queue
subscribers, local clients are preferred, then an RTT is used to find the lowest
latency NATS cluster containing a matching queue subscriber in the supercluster.</p>
<p>What does this mean?</p>
<p>Let&apos;s say you have a set of load balanced services in US East Coast
(US-EAST), another set in the EU (EU-WEST), and a supercluster consisting
of a NATS cluster in US-EAST connected to a NATS cluster in EU-WEST. Clients
in the US would connect to a US-EAST, and services connected to that cluster
would service those clients. Clients in Europe would automatically use
services connected to EU-WEST. If the services in US-EAST disconnect,
clients in US-EAST will begin using services in EU-WEST.</p>
<p>Once the Eastern US services have reconnected to US-EAST, those services
will immediately begin servicing the Eastern US clients since they&apos;re local to
the NATS cluster. This is automatic and entirely transparent to the client.
There is no extra configuration in NATS servers.</p>
<p>This is <strong>zero configuration disaster recovery</strong>.</p>
<h3 id="leaf-nodes"><a name="leaf-nodes" class="plugin-anchor" href="#leaf-nodes"><i class="fa fa-link" aria-hidden="true"></i></a>Leaf Nodes</h3>
<p>Leaf nodes are NATS servers running in a special configuration, allowing
hub and spoke topologies to extend superclusters.</p>
<p>Leaf nodes can also bridge separate security domains. e.g. IoT, mobile, web.
They are ideal for edge computing, IoT hubs, or data centers that need to be
connected to a global NATS deployment. Local applications that communicate
using the loopback interface with physical VM or Container security can
leverage leaf nodes as well.</p>
<p>Leaf nodes:</p>
<ul>
<li>Transparently and securely bind to a remote NATS account</li>
<li>Securely bridge specific local data to a wider NATS deployment</li>
<li>Are 100% transparent to clients which remain simple, lightweight, and easy to develop</li>
<li>Allow for a local security scheme while using new NATS security features globally</li>
<li>Can create a DMZ between a local NATS deployment and external NATS cluster or supercluster.</li>
</ul>
<h2 id="decentralized-security"><a name="decentralized-security" class="plugin-anchor" href="#decentralized-security"><i class="fa fa-link" aria-hidden="true"></i></a>Decentralized Security</h2>
<h3 id="operators-accounts-and-users"><a name="operators-accounts-and-users" class="plugin-anchor" href="#operators-accounts-and-users"><i class="fa fa-link" aria-hidden="true"></i></a>Operators, Accounts, and Users</h3>
<p>NATS 2.0 Security consists of defining Operators, Accounts, and Users
within a NATS deployment.</p>
<ul>
<li>An <strong>Operator</strong> provides the root of trust for the system, may represent
a company or enterprise<ul>
<li>Creates <strong>Accounts</strong> for account administrators. An account represents
an organization, business unit, or service offering with a secure context
within the NATS deployment, for example an IT system monitoring group, a
set of microservices, or a regional IoT deployment. Account creation
would likely be managed by a central group.</li>
</ul>
</li>
<li><strong>Accounts</strong> define limits and may securely expose services and streams.<ul>
<li>Account managers create <strong>Users</strong> with permissions</li>
</ul>
</li>
<li><strong>Users</strong> have specific credentials and permissions.</li>
</ul>
<h3 id="trust-chain"><a name="trust-chain" class="plugin-anchor" href="#trust-chain"><i class="fa fa-link" aria-hidden="true"></i></a>Trust Chain</h3>
<p>PKI (NKeys encoded <a href="https://ed25519.cr.yp.to/" target="_blank">Ed25519</a>) and signed JWTs
create a hierarchy of Operators, Accounts, and Users creating a scalable
and flexible distributed security mechanism.</p>
<ul>
<li><strong>Operators</strong> are represented by a self signed JWT and is the only thing that
is required to be configured in the server. This JWT is usually signed by a
master key that is kept offline. The JWT will contain valid signing keys that
can be revoked with the master updating this JWT.<ul>
<li>Operators will sign <strong>Account</strong> JWTs with various signing keys.</li>
<li><strong>Accounts</strong> sign <strong>User</strong> JWTs, again with various signing keys.</li>
</ul>
</li>
<li>Clients or leaf nodes present <strong>User</strong> credentials and a signed nonce when connecting.<ul>
<li>The server uses resolvers to obtain JWTs and verify the client trust chain.</li>
</ul>
</li>
</ul>
<p>This allows for rapid change of permissions, authentication and limits, to a
secure multi-tenant NATS system.</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="../" class="navigation navigation-prev " aria-label="Previous page: Introduction">
<i class="fa fa-angle-left"></i>
</a>
<a href="../faq.html" class="navigation navigation-next " aria-label="Next page: FAQ">
<i class="fa fa-angle-right"></i>
</a>
</div>
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"What's New in 2.0","level":"1.2","depth":1,"next":{"title":"FAQ","level":"1.3","depth":1,"path":"faq.md","ref":"faq.md","articles":[]},"previous":{"title":"Introduction","level":"1.1","depth":1,"path":"README.md","ref":"README.md","articles":[]},"dir":"ltr"},"config":{"plugins":["prism","-sharing","-highlight","include-html","toggle-chapters","anchors","edit-link"],"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"}},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"include-html":{},"fontsettings":{"theme":"white","family":"sans","size":2},"edit-link":{"label":"edit","base":"https://github.com/nats-io/docs/edit/master"},"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},"anchors":{},"toggle-chapters":{}},"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":"whats_new/whats_new_20.md","mtime":"2019-09-23T22:49:18.496Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-09-27T21:13:11.925Z"},"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();
});
var searchInput = document.querySelector('#book-search-input input');
if (searchInput) {
searchInput.addEventListener('keyup', function(event) {
if (event.keyCode === 13) {
event.target.blur();
}
});
}
}
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-edit-link/plugin.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>