Distributed Systems with Node.js: Building Enterprise-Ready Backend Services

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Many companies, from startups to Fortune 500 companies alike, use Node.js to build performant backend services. And engineers love Node.js for its approachable API and familiar syntax. Backed by the world's largest package repository, Node's enterprise foothold is only expected to grow. In this hands-on guide, author Thomas Hunter II proves that Node.js is just as capable as traditional enterprise platforms for building services that are observable, scalable, and resilient. Intermediate to advanced Node.js developers will find themselves integrating application code with a breadth of tooling from each layer of a modern service stack. • Learn why running redundant copies of the same Node.js service is necessary • Know which protocol to choose, depending on the situation • Fine-tune your application containers for use in production • Track down errors in a distributed setting to determine which service is at fault • Simplify app code and increase performance by offloading work to a reverse proxy • Build dashboards to monitor service health and throughput • Find out why so many different tools are required when operating in an enterprise environment

Author(s): Thomas Hunter II
Edition: 1
Publisher: O'Reilly Media
Year: 2020

Language: English
Commentary: Vector PDF
Pages: 390
City: Sebastopol, CA
Tags: Security; JavaScript; Web Applications; Distributed Systems; HTTP; Pipelines; Docker; Deployment; GraphQL; Node.js; Kubernetes; Unit Testing; Containerization; TravisCI; Integration Testing; Testing; Container Orchestration; Grafana; Scaling; Resilience; Graphite; Stateless Applications; Load Testing; StatsD; Zipkin; Observability; gRPC; Cabot

Cover
Copyright
Table of Contents
Foreword
Preface
Target Audience
Goals
Conventions Used in This Book
Using Code Examples
O’Reilly Online Learning
How to Contact Us
Acknowledgments
Chapter 1. Why Distributed?
The Single-Threaded Nature of JavaScript
Quick Node.js Overview
The Node.js Event Loop
Event Loop Phases
Code Example
Event Loop Tips
Sample Applications
Service Relationship
Producer Service
Consumer Service
Chapter 2. Protocols
Request and Response with HTTP
HTTP Payloads
HTTP Semantics
HTTP Compression
HTTPS / TLS
JSON over HTTP
The Dangers of Serializing POJOs
API Facade with GraphQL
GraphQL Schema
Queries and Responses
GraphQL Producer
GraphQL Consumer
RPC with gRPC
Protocol Buffers
gRPC Producer
gRPC Consumer
Chapter 3. Scaling
The Cluster Module
A Simple Example
Request Dispatching
Cluster Shortcomings
Reverse Proxies with HAProxy
Introduction to HAProxy
Load Balancing and Health Checks
Compression
TLS Termination
Rate Limiting and Back Pressure
SLA and Load Testing
Introduction to Autocannon
Running a Baseline Load Test
Reverse Proxy Concerns
Protocol Concerns
Coming Up with SLOs
Chapter 4. Observability
Environments
Logging with ELK
Running ELK via Docker
Transmitting Logs from Node.js
Creating a Kibana Dashboard
Running Ad-Hoc Queries
Metrics with Graphite, StatsD, and Grafana
Running via Docker
Transmitting Metrics from Node.js
Creating a Grafana Dashboard
Node.js Health Indicators
Distributed Request Tracing with Zipkin
How Does Zipkin Work?
Running Zipkin via Docker
Transmitting Traces from Node.js
Visualizing a Request Tree
Visualizing Microservice Dependencies
Health Checks
Building a Health Check
Testing the Health Check
Alerting with Cabot
Create a Twilio Trial Account
Running Cabot via Docker
Creating a Health Check
Chapter 5. Containers
Introduction to Docker
Containerizing a Node.js Service
Dependency Stage
Release Stage
From Image to Container
Rebuilding and Versioning an Image
Basic Orchestration with Docker Compose
Composing Node.js Services
Internal Docker Registry
Running the Docker Registry
Pushing and Pulling to the Registry
Running a Docker Registry UI
Chapter 6. Deployments
Build Pipeline with Travis CI
Creating a Basic Project
Configuring Travis CI
Testing a Pull Request
Automated Testing
Unit Tests
Integration Tests
Code Coverage Enforcement
Deploying to Heroku
Create a Heroku App
Configure Travis CI
Deploy Your Application
Modules, Packages, and SemVer
Node.js Modules
SemVer (Semantic Versioning)
npm Packages and the npm CLI
Internal npm Registry
Running Verdaccio
Configuring npm to Use Verdaccio
Publishing to Verdaccio
Chapter 7. Container Orchestration
Introduction to Kubernetes
Kubernetes Overview
Kubernetes Concepts
Starting Kubernetes
Getting Started
Deploying an Application
Kubectl Subcommands
Kubectl Configuration Files
Service Discovery
Modifying Deployments
Scaling Application Instances
Deploying New Application Versions
Rolling Back Application Deployments
Chapter 8. Resilience
The Death of a Node.js Process
Process Exit
Exceptions, Rejections, and Emitted Errors
Signals
Building Stateless Services
Avoiding Memory Leaks
Bounded In-Process Caches
External Caching with Memcached
Introducing Memcached
Running Memcached
Caching Data with Memcached
Data Structure Mutations
Database Connection Resilience
Running PostgreSQL
Automatic Reconnection
Connection Pooling
Schema Migrations with Knex
Configuring Knex
Creating a Schema Migration
Applying a Migration
Rolling Back a Migration
Live Migrations
Idempotency and Messaging Resilience
HTTP Retry Logic
Circuit Breaker Pattern
Exponential Backoff
Resilience Testing
Random Crashes
Event Loop Pauses
Random Failed Async Operations
Chapter 9. Distributed Primitives
The ID Generation Problem
Introduction to Redis
Redis Operations
Strings
Lists
Sets
Hash
Sorted Sets
Generic Commands
Other Types
Seeking Atomicity
Transactions
Lua Scripting
Writing a Lua Script File
Loading the Lua Script
Tying It All Together
Chapter 10. Security
Wrangling Repositories
Recognizing Attack Surface
Parameter Checking and Deserialization
Malicious npm Packages
Application Configuration
Environment Variables
Configuration Files
Secrets Management
Upgrading Dependencies
Automatic Upgrades with GitHub Dependabot
Manual Upgrades with npm CLI
Unpatched Vulnerabilities
Upgrading Node.js
Node.js LTS Schedule
Upgrade Approach
Appendix A. Installing HAProxy
Linux: Build from Source
Linux: Install Precompiled Binary
macOS: Install via Homebrew
Appendix B. Installing Docker
macOS: Install Docker Desktop for Mac
Linux: Convenient Install Script
Appendix C. Installing Minikube & Kubectl
Linux: Debian Package and Precompiled Binary
macOS: Install via Homebrew
Index
About the Author
Colophon