Micro- Services. Distributed Systems. DevOps

Similar documents
Microservices, Messaging and Science Gateways. Review microservices for science gateways and then discuss messaging systems.

Project Midterms: March 22 nd : No Extensions

A Distributed System Case Study: Apache Kafka. High throughput messaging for diverse consumers

Knowns and Unknowns in Distributed Systems

Microservice Splitting the Monolith. Software Engineering II Sharif University of Technology MohammadAmin Fazli

BUILDING MICROSERVICES ON AZURE. ~ Vaibhav

Microservices. SWE 432, Fall 2017 Design and Implementation of Software for the Web

Your Microservice Layout

Distributed Architectures & Microservices. CS 475, Spring 2018 Concurrent & Distributed Systems

High Availability Distributed (Micro-)services. Clemens Vasters Microsoft

Microservices Beyond the Hype. SATURN San Diego May 3, 2016 Paulo Merson

Hi! NET Developer Group Braunschweig!

Data Acquisition. The reference Big Data stack

Building loosely coupled and scalable systems using Event-Driven Architecture. Jonas Bonér Patrik Nordwall Andreas Källberg

Sunil Shah SECURE, FLEXIBLE CONTINUOUS DELIVERY PIPELINES WITH GITLAB AND DC/OS Mesosphere, Inc. All Rights Reserved.

Microservices Smaller is Better? Eberhard Wolff Freelance consultant & trainer

Cloud-Native Applications. Copyright 2017 Pivotal Software, Inc. All rights Reserved. Version 1.0

ZooKeeper & Curator. CS 475, Spring 2018 Concurrent & Distributed Systems

Which application/messaging protocol is right for me?

Implementing the Twelve-Factor App Methodology for Developing Cloud- Native Applications

Building Microservices with the 12 Factor App Pattern

Microservices with Red Hat. JBoss Fuse

Advanced Continuous Delivery Strategies for Containerized Applications Using DC/OS

Microservices Architekturen aufbauen, aber wie?

Enhancing cloud applications by using messaging services IBM Corporation

Distributed Computation Models

Using the SDACK Architecture to Build a Big Data Product. Yu-hsin Yeh (Evans Ye) Apache Big Data NA 2016 Vancouver

The COS 333 Project. Robert M. Dondero, Ph.D. Princeton University

Open Cloud Engine - An Open Source Cloud Native Transformer

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions

Agreement and Consensus. SWE 622, Spring 2017 Distributed Software Engineering

Microservices on AWS. Matthias Jung, Solutions Architect AWS

Evaluation Guide for ASP.NET Web CMS and Experience Platforms

MOM MESSAGE ORIENTED MIDDLEWARE OVERVIEW OF MESSAGE ORIENTED MIDDLEWARE TECHNOLOGIES AND CONCEPTS. MOM Message Oriented Middleware

SUMMARY LAYERED ARCHITECTURE

RabbitMQ: Messaging in the Cloud

Map-Reduce. Marco Mura 2010 March, 31th

Transformation-free Data Pipelines by combining the Power of Apache Kafka and the Flexibility of the ESB's

The SMACK Stack: Spark*, Mesos*, Akka, Cassandra*, Kafka* Elizabeth K. Dublin Apache Kafka Meetup, 30 August 2017.

Architectural challenges for building a low latency, scalable multi-tenant data warehouse

Event Streams using Apache Kafka

Data Acquisition. The reference Big Data stack

How to re-invent your IT Architecture. André Christ, Co-CEO LeanIX

RELIABILITY & AVAILABILITY IN THE CLOUD

BARCELONA. 2015, Amazon Web Services, Inc. or its affiliates. All rights reserved

DELIVERING WITH MICROSERVICES HOW TO ITERATE TOWARDS SOPHISTICATION

Intuitive distributed algorithms. with F#

Managing Data at Scale: Microservices and Events. Randy linkedin.com/in/randyshoup

ZooKeeper Atomic Broadcast

GAVIN KING RED HAT CEYLON SWARM

The Evolution of a Data Project

Indirect Communication

Introduction to Kafka (and why you care)

Transactions. CS 475, Spring 2018 Concurrent & Distributed Systems

Create High Performance, Massively Scalable Messaging Solutions with Apache ActiveBlaze

Containers, Serverless and Functions in a nutshell. Eugene Fedorenko

Logging in the age of

Apache Storm. Hortonworks Inc Page 1

Overview. Communication types and role of Middleware Remote Procedure Call (RPC) Message Oriented Communication Multicasting 2/36

Producer sends messages to the "hello" queue. The consumer receives messages from that queue.

IERG 4080 Building Scalable Internet-based Services

The New Red Hat JBoss EAP 7.0. Eran Mansour JBoss EAP Consultant / Matrix IT

Distributed systems. Lecture 6: distributed transactions, elections, consensus and replication. Malte Schwarzkopf

Intra-cluster Replication for Apache Kafka. Jun Rao

DIVING IN: INSIDE THE DATA CENTER

Replication in Distributed Systems

MODIFYING TRADITIONAL APPLICATIONS FOR MORE COST EFFECTIVE DEPLOYMENT

Microservices at Netflix Scale. First Principles, Tradeoffs, Lessons Learned Ruslan

Force.com Streaming API Developer Guide

Internet Technology. 06. Exam 1 Review Paul Krzyzanowski. Rutgers University. Spring 2016

IBM. Planning and Installation. IBM Workload Scheduler. Version 9 Release 4

The Idiot s Guide to Quashing MicroServices. Hani Suleiman

Getting Started With Containers

WHITE PAPER NGINX An Open Source Platform of Choice for Enterprise Website Architectures

416 Distributed Systems. RPC Day 2 Jan 11, 2017

Nevin Dong 董乃文 Principle Technical Evangelist Microsoft Cooperation

Architekturen für die Cloud

Streaming Log Analytics with Kafka

Microservices mit Java, Spring Boot & Spring Cloud. Eberhard Wolff

Distributed Systems. Messaging and JMS Distributed Systems 1. Master of Information System Management

Open Cloud Engine - An Open Source Cloud Native Platform

Ingress Kubernetes Tutorial

Lecture 21 11/27/2017 Next Lecture: Quiz review & project meetings Streaming & Apache Kafka

How you can benefit from using. javier

Serverless and APIs: Rethinking Curriculum in Higher Education. Munir Mandviwalla and Jeremy Shafer Temple University

Continuous Integration and Delivery with Spinnaker

SOA Architect. Certification

Uber Push and Subscribe Database

Lecture 2: January 24

Redis as a Reliable Work Queue. Percona University

CS 167 Final Exam Solutions

IEMS 5722 Mobile Network Programming and Distributed Server Architecture

For Volunteers An Elvanto Guide

Hands-On with IoT Standards & Protocols

Streaming ETL of High-Velocity Big Data Using SAS Event Stream Processing and SAS Viya

Send me up to 5 good questions in your opinion, I ll use top ones Via direct message at slack. Can be a group effort. Try to add some explanation.

Deep Dive Amazon Kinesis. Ian Meyers, Principal Solution Architect - Amazon Web Services

Design and Architecture. Derek Collison

Internet Technology 3/2/2016

IBM Software Group. IBM WebSphere MQ V7.0. Introduction and Technical Overview. An IBM Proof of Technology IBM Corporation

Transcription:

Micro- Services Distributed Systems DevOps

Microservices and Science Gateways

Martin Fowler s Definition Develop a single application as a suite of small services Each service runs in its own process Services communicate with lightweight mechanisms Often an HTTP resource API But that has some problems Messaging is better. These services are built around business capabilities Independently deployable by fully automated deployment machinery. Minimum of centralized management of these services, May be written in different programming languages May use different data storage technologies. http://martinfowler.com/articles/microservices.html

Monolithic Applications Enterprise applications three tiered architecture a client-side user interface a database a server-side application. Server-side Application handle HTTP requests, execute domain logic, retrieve and update data from the database, select and populate HTML views to be sent to the browser. This server-side application is a monolith A single logical executable. Changes require building and deploying a new version of the server-side application.

Other Questionable Monolithic Patterns The server-side application interacts with a single database Not everything needs to fit into one DB system Not just CAP choices: use the DB that fits each subsytem s problem and your development patterns Splitting teams into tiers The DB team, the UX team, the Server App team The deployment and operations team CAP: Consistency-Availability-Partition Tolerance

Recall the Gateway Octopus Diagram Browser HTTPS Super Scheduling and Resource Management Web Interface Server Client SDK HTTP or TCP/IP Server SDK Application Server Resource Plugins In micro-service arch, these also need scheduling Karst: MOAB/Torque Stampede: SLURM Comet: SLURM Jureca:SLURM

Decoupling the App Server, Take 1 Application Manager API Server Metadata Server API Server API Server API Server API Server Application Application Manager Application Manager Application Manager Application Manager Application Manager Manager Metadata Metadata Server Metadata Server Metadata Server Metadata Server Metadata Server Server

What Science Gateway Microservices Can We Identify?

My Suggested List (1/2) Entry Point Orchestrator Stateless Metadata Server API Server High availability, load-balanced Scheduler Highly available leader Resources, Applications Highly available?

My Suggested List (2/2) Stateful Metadata Server Application Manager Experiment state Submits jobs Fire and forget Monitor Service Monitors jobs on remote resources Logging Centralize your service logs

Draw and Think

Thought Exercise Assume Amazon Cloud and a big budget How do these components interact? How can I distribute copies of components across multiple availability zones? What kinds of failures can occur? How can I handle failures of different components?

Last Thoughts: Are Monolithic Applications Bad? A monolithic server is a natural way to approach building many systems. Monolithic applications can and should still be modular All your logic for handling a request runs in a single process You can use the basic features of your language to divide up the application into classes, functions, and namespaces. Monoliths can still use DevOps You can run and test the application on a developer's laptop, Use a deployment pipeline to ensure that changes are properly tested and deployed into production. You can horizontally scale the monolith by running many instances behind a load-balancer. DB CAP problems don t hit most applications

The Dividing Line When do you decouple your code? When is a monolithic application better?

Monolithic Applications: Traditional Software Releases Software releases occur in discrete increments Run on clients systems Releases may be frequent but they are still distinct Firefox OS system upgrades Traditional release cycles Extensive testing Alpha, beta, release candidates, and full releases Extensive recompiling and testing required after code changes Code changes require the entire release cycle to be repeated

MicroServices: Software as a Service Does your software run as a service? Do you run this service yourself? Or does another part of your organization run the service that your team develops? Traditional release cycles don t work well Test-release-deploy takes too long May make releases many times per day You can be a little more tolerant of bugs discovered after release if you can fix quickly or roll back quickly. Get new features and improvements into production quickly.

Microservices: Start with Modularity Think about your current application. How can you break it into modular component parts? What are the interfaces? What are the messages that you need to send between the parts? Your code should be modular anyway. OGSI and Spring do this for single JVM Java applications You can maintain a module without touching other code.

Spring Coders, Speak Up! What components, POJOs, etc do you have in your code now?

Should a person or group own a subset of modules or microservices? For small teams, NO in my experience. Team members come and go They aren t always available anyway Work-life balance will eventually become important to most No one should be indispensable Module ownership leads to other problems Possessive ownership culture Opaque code Not my problem if it happens in another module

Ownership and Conway s Law Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization's communication structure. Melvin Conway

In Other Words If you separate your organization into Systems specialists, DB admins, Software developers, User experience specialists, etc, And ask them to build something, Then the system will look like the org chart. This is the opposite of the DevOps approach Creates the bureaucratic infighting that plague organizations.

Products, Not Projects The alternative: organize around products A product team has all the expertise it needs Jim Gray interviews Werner Vogels: https://queue.acm.org/detail.cfm?id=1142065 You build it, you own it Problems with this approach: Someone may work on multiple products Who is that person s boss?

My Advice: Own the Entire Product Even if you aren t the manager. Own the product.

Do you see this in the way you work now? Or in the way you worked before you came back to school?

How Big Is a Module? How little is micro?

Rules of Thumb You Might Encounter Amazon s two-pizza rule Teams shouldn t be larger than what two pizzas can feed A good programmer should be able to rewrite a microservice in a couple of weeks Bounded Contexts from Domain Driven Design Can We Make This More Rigorous?

Messaging patterns between components Request-response REST Common in Internet applications but you would never do this within code in a single JVM Push Common in single JVM application: Observer, listener patterns But not so common in decoupled applications. More generally, asynchronous messaging is a little scary. One-to-one The component knows which component needs to get the new information. Many-to-many Components don t need to know which other components needs the information. They just broadcast it.

How Big Is a Component? One answer: the optimal message pattern should not change when going from single JVM to distributed components. Telescope in and telescope out Components that run in the same process can be chatty and send lots of messages. Messages can be pointers to shared data objects Messages are always received This is true for both request and push messaging.

Pan-Galactic Components Components that run across the universe need different messages, either infrequent or terse. No shared data objects to point to. Distributed components must also assume a wide variety of message failures Lost connections Recipients never received the message Recipients received messages in the wrong order Recipients crashed while processing... Microservices are distributed systems Should know and use DS ideas

Microservices Are Not Distributed Objects A component is not an object in the OO sense. A component should be a service in the SOA sense Recall REST architecture: services should be as idempotent as possible. If you send the same message more than once, the server state after processing the message is the same. Ex: If a component receives 10 identical message saying submit a job, the component should only submit the job once. How do you know the message is really identical? Timestamps, other identifiers, etc Shared nothing between services Message processing should have no side effects that need to be exposed to other components Anti-pattern: all those output files generated by scientific applications

Decentralized Data Management This is an open challenge for Apache Airavata The Registry component, backed by a single DB system, holds all the data Microservice Antipattern One database has all the information for the application Limits your choice of data stores: you have to use the same DB technology for everything. Microservices constantly need to make remote DB calls Performance and security

Setting Data Boundaries This is easy when the data isn t connected or lightly connected. But not easy to split up a traditionally designed DB schema. Science gateway data boundaries You may want to split stateless and stateful data If you split even lightly connected data across services, you will need to consider consistency Strong: requires distributed transactions, which can be tricky Weak: eventual consistency. Can you live with this? What data boundaries do science gateways have?

How do services communicate? Ideally, always do the same thing. Your development environment should be a miniature version of your deployment environment: containerization Encapsulate and abstract This touches DevOps CI/CD, so those are separate lectures Keep the communication patterns the same Push, pull 1-1, or N-N We ll look at messaging systems in detail next Push messaging, many-to-many, reliable delivery, replay, etc

If I make everything distributed, how can I test? Unit tests within components are simple But testing the entire system becomes an operational test This is not a bad thing if you can script your operation tests And you should Monolith: test your code while building with Maven Bring up simple test DBs like SQLite or Derby One big build does everything

Microservice Testing Microservice: test your code in an operation-like setting Don t build the entire code every time Build only the microservice you are working on. So your build should be modular So maybe you don t need one big build system after all And maybe you don t need one git repo for everything... And maybe you don t need one version # that covers all your code... So releases become incremental Testing, monitoring, and logging become more continuous This is a touch point between Microservices and DevOps

Designing for Failure Microservices need to be built to tolerate errors. What kinds of errors will science gateway microservices encounter? How do you detect these failures? What tools do you need? What strategies can you use to do system testing?

Messaging in Distributed Systems

Zab: Atomic Broadcasting Clients See Spaces Zookeeper s client API resembles a structured version of the Tuple Spaces concept of parallel programming.

Advanced Message Queuing Protocol Overview More Distributed Service Concepts

AMQP: Network Protocol and Architecture, Not An API Many Implementations RabbitMQ Apache ActiveMQ Apache Qpid SwiftMQ And others: This contradicts my earlier distinction between horizontal and vertical standardization efforts At least for Version 0-9-1 Each implementation can have its own API I ll focus on Version 0-9-1 This is not an AMQP tutorial

Basic Concepts

An AMQP Server (or Broker) Two main parts Exchange Message Queue Exchanges can interact with multiple message queues Exchange Accepts producer messages Sends to the Message Queue Message Queue Routes messages to different consumers depending on arbitrary criteria Buffers messages when consumers are not able to accept them fast enough.

Producers and Consumers Producers only interact with Exchanges Consumers interact with Message Queues Consumers aren t passive Can create and destroy message queues The same application can act as both a publisher and a consumer You can implement Request-Response with AMQP Except the publisher doesn t block Ex: your application may want an ACK or NACK when it publishes This is a reply queue

Message Queue Types of queue properties: Private or shared Durable or temporary Client-named or server- named, etc. Store-and-forward queue: holds messages and distributes these between consumers on a round-robin basis. Durable and shared between multiple consumers. Private reply queue: holds messages and forwards these to a single consumer. Reply queues are typically temporary, server-named, and private to one consumer. Private subscription queue: holds messages collected from various "subscribed" sources, and forwards these to a single consumer.

Consumers and Message Queues AMQP Consumers can create their own queues and bind them to Exchanges This has an interesting implication Queues can have more than one attached consumer AMQP queues are FIFO AMQP allows only one consumer per queue to receive the message. Use round-robin delivery if > 1 attached consumer. This greatly simplifies things If you need > 1 consumer to receive a message, you can give each consumer their own queue. Use topic matching to route messages Compare this to Zab and atomic broadcast protocols, generally. AMQP makes some simplifications

The Exchange Receives messages Inspects a message header, body, and properties Routes messages to appropriate message queues Routing usually done with routing keys in the message payload For point-to-point messages, the routing key is the name of the message queue For pub-sub routing, the routing key is the name of the topic Topics can be hierarchical

Publish-Subscribe Patterns Useful for many-to-many messaging In microservice-based systems, several different types of components may want to receive the same message But take different actions Ex: you can always add a logger service You can always do this with explicitly named routing keys. You may also want to use hierarchical (name space) key names and pattern matching. gateway.jobs.jobtype.gromacs Gateway.jobs.jobtype.*

The Message Payload Read the specification for more details. In general AMQP follows the head-body format The message body payload is binary AMQP assumes the content is handled by consumers It is the consumer s job to do something with the content. Unlike JMS You could serialize your content with JSON or Thrift and deserializeit to directly send objects.

Message Exchange Patterns

Direct Exchange A publisher sends a message to an exchange with a specific routing key. The exchange routes this to the message queue bound to the routing key. One or more consumers receive messages if listening to the queue. Default: round-robin queuing to deliver to multiple subscribers of same queue queue=app.svc01 queue=app.svc01 routing- Queue.Declare Basic.Consume Basic.Publish key=app.svc01

Fanout Exchange Message Queue binds to an Exchange with no argument Publisher sends a message to the Exchange The Exchange sends the message to the Message Queue All consumers listening to all Message Queues associated with an Exchange get the message

Topic Exchange Message Queues bind using routing patterns instead of routing keys. A Publisher sends a message with a routing key. Exchange will route to all Message Queues that match the routing key s pattern

More Examples The RabbitMQ tutorial page has several nice examples of classic message exchange patterns. https://www.rabbitmq.com/getstarted.html

Some Useful Capabilities of Messaging Systems for Microservices Overarching Requirement: It should support your system s distributed state machine Let s brainstorm some

Useful Capabilities: My List (1/2) Supports both push and pull messaging Deliver messages in order Successfully delivered messages are delivered exactly once Multiple recipients OK Deliver messages to one or more listeners based on pre-defined topics. Store messages persistently There are no active recipients. All recipients are busy Determine if critical messages were delivered correctly

Useful Capabilities: My List (2/2) Redeliver messages that weren t correctly received Corrupted messages, no recipients, etc Recipient can change Redeliver messages on request Helps clients resynch their states Allow other components to inspect message delivery metadata. Supports elasticity, fault tolerance Priority messaging? Qualities of Service Security, fault tolerance

Which Messaging Software to Choose? AMQP does not cover all the capabilities listed above. It can be extended to cover these in many cases AMQP messaging system implementations are not necessarily cloudready They have to be configured as highly available services. Primary + failover No fancy leader elections, etc as used in Zookeeper + Zab Have scaling limitations, although these may not matter at our scales. Other messaging systems (Kafka, HedWig) are alternatives

Some Applications

Simple Work Queue Queue up work to be done. Publisher: pushes a request for work into the queue Queue should be a simple Direct Exchange Message Queue should implement only deliver message once to once consumer. Round-robin scheduling. RabbitMQ does this out of the box Consumer: Sends an ACK after completing the task If a Queue-Client closes before an ACK, resend message to a new consumer. RabbitMQ detects these types of failures.

Simple Work Queue MSG 1 AppMan Worker Gateway API Server MSG1, 2, 3 Broker ACK ACK MSG 2 AppMan Worker ACK 3 Job requests come to the API Server API Server publishes to Broker (Exchange + Message Queue) Broker sends to workers in round-robin Workers send ACKs when done If Broker detects a closed connection before an ACK, sends MSG to a different worker MSG 3 AppMan Worker

What Could Possibly Go Wrong? Jobs take a long time to finish, so ACKs may not come for hours. Durable connections needed between Consumers and Message Queues Alternatively, the ACK could come from a different process Jobs may actually get launched on the external supercomputer, so you don t want to launch twice just because of a missing ACK Clients have to implement their own queues Could get another work request while doing work.

Work Queue, Take Two Orchestrator pushes work into a queue. Have workers request work when they are not busy. RabbitMQ supports this as prefetchcount Use round-robin but don t send work to busy workers with outstanding ACKs. Workers do not receive work requests when they are busy. Worker sends ACK after successfully submitting the job. This only means the job has been submitted Worker can take more work A separate process handles the state changes on the supercomputer Publishes queued, executing, completed or failed messages When job is done, Orchestrator creates a cleanup job Any worker available can take this.

Work Queue, Take 2 2. RunJob AppMan Worker 1a. Ready 3. ACK Orchestrator 0. RunJob 7. Cleanup Broker 5. Done Email Listener 9. ACK 1b. Ready Experiment Metadata Manager 4., 6., 10. Job Status 8. CleanUp AppMan Worker

What Could Possibly Go Wrong? A Worker may not be able to submit the job Remote supercomputer is unreachable, for example We need a NACK The Orchestrator and Experiment Metadata components are also consumers. Should send ACKs to make sure messages are delivered. Orchestrator and Experiment Metadata Manager may also die and get replaced. Unlike AppMan workers, Orchestrator and EMM may need a leader-follower implementation Broker crashes RabbitMQ provides some durability for restarting Possible to lose cached messages that haven t gone to persistent storage

What Else Could Go Wrong? Lots of things. How do you debug unexpected errors? Logs A logger like LogStash should be one of your consumers No one-to-one messages any more. Everything has at least 2 subscribers Your log service The main target Or you could use Fanout

Summary Microservices are applications built out of distributed components Important if you run Software as a Service Connection to DevOps: Accelerate the develop-test-deploy cycle Continuous Integration and Continuous Delivery are essential Services need to communicate Asynchronous messaging is powerful mechanism Push, many-to-many Can easily extend to add more components

Micro- Services Distributed Systems DevOps