Practical NATS From Beginner to Pro — Waldemar Quevedo Practical NATS From Beginner to Pro Waldemar Quevedo Practical NATS Waldemar Quevedo San Francisco, California, USA ISBN-13 (pbk): 978-1-4842-3569-0 ISBN-13 (electronic): 978-1-4842-3570-6 https://doi.org/10.1007/978-1-4842-3570-6 Library of Congress Control Number: 2018946546 Copyright © 2018 by Waldemar Quevedo This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now known or hereafter developed. Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to proprietary rights. While the advice and information in this book are believed to be true and accurate at the date of publication, neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or omissions that may be made. The publisher makes no warranty, express or implied, with respect to the material contained herein. Managing Director, Apress Media LLC: Welmoed Spahr Acquisitions Editor: Louise Corrigan Development Editor: James Markham Coordinating Editor: Nancy Chen Cover designed by eStudioCalamar Cover image designed by Freepik (www.freepik.com) Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail [email protected], or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware corporation. For information on translations, please e-mail [email protected], or visit http://www.apress. com/rights-permissions. Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales web page at http://www.apress.com/bulk-sales. Any source code or other supplementary material referenced by the author in this book is available to readers on GitHub via the book’s product page, located at www.apress.com/9781484235690. For more detailed information, please visit http://www.apress.com/source-code. Printed on acid-free paper For Mariko & Karina Table of Contents About the Author ���������������������������������������������������������������������������������xi About the Technical Reviewer �����������������������������������������������������������xiii Acknowledgments ������������������������������������������������������������������������������xv Foreword ������������������������������������������������������������������������������������������xvii Chapter 1: Introduction to NATS �����������������������������������������������������������1 Using NATS for Messaging ������������������������������������������������������������������������������������2 Messaging Over the REST �������������������������������������������������������������������������������������4 Do Not Assume the Audience ��������������������������������������������������������������������������������5 NATS As an Always Available Dial Tone �����������������������������������������������������������������8 Delivery Guarantees ��������������������������������������������������������������������������������������10 Is NATS a Message Broker or a Message Queue? �����������������������������������������11 A Brief History of NATS ���������������������������������������������������������������������������������������12 Roots in Ruby�������������������������������������������������������������������������������������������������12 I Wanna Go Fast! ��������������������������������������������������������������������������������������������14 Cloud-Native NATS ����������������������������������������������������������������������������������������������16 Summary�������������������������������������������������������������������������������������������������������������18 Chapter 2: The NATS Protocol �������������������������������������������������������������19 Overview of the Protocol �������������������������������������������������������������������������������������19 Why Not a Binary Protocol Instead? ��������������������������������������������������������������20 Setting Up the Environment ��������������������������������������������������������������������������������21 v TTaabbllee ooff CCoonnTTeennTTss Connecting to NATS ��������������������������������������������������������������������������������������������22 PING and PONG ���������������������������������������������������������������������������������������������������24 Sending and Receiving Messages ����������������������������������������������������������������������26 Publishing Messages with PUB ���������������������������������������������������������������������26 Registering Interest in a Subject with SUB ����������������������������������������������������28 Subject Names and Wildcards �����������������������������������������������������������������������31 Creating Queue Subscriptions for Load Balancing ����������������������������������������34 Limiting Interest in a Subject with UNSUB ����������������������������������������������������36 Publishing Requests ��������������������������������������������������������������������������������������38 Lowest Latency Response �����������������������������������������������������������������������������40 Summary�������������������������������������������������������������������������������������������������������������41 Chapter 3: The NATS Clients ���������������������������������������������������������������43 Features of a NATS Client �����������������������������������������������������������������������������������43 Using Connect �����������������������������������������������������������������������������������������������������45 Customizing a Connection ����������������������������������������������������������������������������������47 Authorization Credentials ������������������������������������������������������������������������������������50 Using Publish and Subscribe ������������������������������������������������������������������������������51 Using Publish ������������������������������������������������������������������������������������������������������52 Using Subscribe ��������������������������������������������������������������������������������������������������54 Using QueueSubscribe ����������������������������������������������������������������������������������������57 Removing a Subscription ������������������������������������������������������������������������������������58 Using Flush ���������������������������������������������������������������������������������������������������������62 Using Request �����������������������������������������������������������������������������������������������������63 The Classic Request/Response ���������������������������������������������������������������������65 The New Style Request/Response �����������������������������������������������������������������67 vi TTaabbllee ooff CCoonnTTeennTTss A Note on Asynchronous I/O ��������������������������������������������������������������������������������67 States of a NATS Connection ������������������������������������������������������������������������������73 Clients Reconnection Logic ���������������������������������������������������������������������������������77 Event Callbacks ���������������������������������������������������������������������������������������������������80 Using Close ���������������������������������������������������������������������������������������������������������82 Summary�������������������������������������������������������������������������������������������������������������84 Chapter 4: Setting Up NATS ����������������������������������������������������������������85 Server Configuration �������������������������������������������������������������������������������������������85 Exposed Ports �����������������������������������������������������������������������������������������������������88 Server Logging ����������������������������������������������������������������������������������������������������94 Logging Outputs ��������������������������������������������������������������������������������������������97 Configuring Authorization������������������������������������������������������������������������������������98 Extending the Authorization Deadline ����������������������������������������������������������100 TLS Options �������������������������������������������������������������������������������������������������������101 Tuning the Defaults �������������������������������������������������������������������������������������������102 Increasing the Maximum Payload Size ��������������������������������������������������������102 Extending the Deadline for Slow Consumers Handling �������������������������������103 Tuning the Keepalive Interval ����������������������������������������������������������������������104 Tuning the Maximum Number of Connections ��������������������������������������������104 Server Reloading �����������������������������������������������������������������������������������������������105 Reloading to Activate Tracing On-the-Fly ����������������������������������������������������105 Reducing the Number of Live Connections �������������������������������������������������107 Running NATS in Docker �����������������������������������������������������������������������������������108 Summary�����������������������������������������������������������������������������������������������������������109 vii TTaabbllee ooff CCoonnTTeennTTss Chapter 5: High Availability with NATS Clustering ���������������������������111 The NATS Cluster Network Topology �����������������������������������������������������������������111 Configuring a NATS Cluster from the CLI ����������������������������������������������������������114 Setting Up Clustering via the Configuration File ����������������������������������������������119 Explicitly Setting a Server Pool in the Client �����������������������������������������������������121 Disabling Random Reconnection Ordering ��������������������������������������������������122 Bootstrapping a Cluster Using Autodiscovery ���������������������������������������������������123 Monitoring a NATS Cluster State �����������������������������������������������������������������������124 On Autodiscovery and Load Balancers ��������������������������������������������������������������126 Setting Up a NATS Cluster Behind a Load Balancer �����������������������������������127 Summary�����������������������������������������������������������������������������������������������������������130 Chapter 6: Developing a Cloud- Native NATS Application �����������������131 The NATS Rider Application �������������������������������������������������������������������������������131 Scaffolding the Application �������������������������������������������������������������������������������133 Defining a Base Component ������������������������������������������������������������������������������137 Customizing the Connection to NATS ����������������������������������������������������������139 Enabling Components Discovery �����������������������������������������������������������������141 The NATS Rider API �������������������������������������������������������������������������������������������145 The Load Balanced Rider Manager �������������������������������������������������������������������154 The Driver Agent �����������������������������������������������������������������������������������������������161 Summary�����������������������������������������������������������������������������������������������������������167 Chapter 7: Monitoring NATS �������������������������������������������������������������169 Server Instrumentation �������������������������������������������������������������������������������������169 The /varz Endpoint ���������������������������������������������������������������������������������������170 The /connz Endpoint ������������������������������������������������������������������������������������175 About /routez �����������������������������������������������������������������������������������������������187 viii TTaabbllee ooff CCoonnTTeennTTss About /subsz ������������������������������������������������������������������������������������������������192 Using nats-top for Monitoring ���������������������������������������������������������������������193 Summary�����������������������������������������������������������������������������������������������������������196 Chapter 8: Securing NATS �����������������������������������������������������������������197 Connecting Securely to NATS ����������������������������������������������������������������������������197 Configuring TLS in the Server ����������������������������������������������������������������������199 Securing the Monitoring Endpoint ���������������������������������������������������������������200 Tuning the Authorization Timeout ����������������������������������������������������������������201 Setting a Certificate Authority ���������������������������������������������������������������������201 Require Clients to Provide a Certificate �������������������������������������������������������202 Setting Up a Secure NATS Environment from Scratch ��������������������������������������202 Installing cfssl for Certs Creation ����������������������������������������������������������������203 Defining the Security Roles �������������������������������������������������������������������������203 Creating a Custom Root CA �������������������������������������������������������������������������205 Securing the Connections from the Clients �������������������������������������������������206 Securing the Monitoring Endpoint ���������������������������������������������������������������208 Securing the Routes from the Cluster ���������������������������������������������������������209 Caveats from NATS TLS Support �����������������������������������������������������������������������211 Not Possible to Use TLS Right Away ������������������������������������������������������������211 Limitations of Configuring TLS from the Command Line �����������������������������212 Auto Discovery and Routes TLS �������������������������������������������������������������������213 Summary�����������������������������������������������������������������������������������������������������������216 Chapter 9: Troubleshooting NATS �����������������������������������������������������217 Types of Slow Consumer Errors ������������������������������������������������������������������������217 Troubleshooting Slow Consumer Protocol Errors ����������������������������������������������219 Subscriptions in Slow Consumer State �������������������������������������������������������������226 ix TTaabbllee ooff CCoonnTTeennTTss Routes as Slow Consumers in a NATS Cluster ��������������������������������������������������228 Summary�����������������������������������������������������������������������������������������������������������231 Chapter 10: Advanced NATS Techniques ������������������������������������������233 Using Inbox Subscriptions���������������������������������������������������������������������������������233 Subscriptions with Heartbeats ��������������������������������������������������������������������������246 Gathering Multiple Responses ��������������������������������������������������������������������������253 Summary�����������������������������������������������������������������������������������������������������������256 Index �������������������������������������������������������������������������������������������������257 x