Upload
angelos-kapsimanis
View
144
Download
3
Embed Size (px)
Citation preview
μservices
Week 3
But it is not the only topic today
Also:
• Self-contained systems.
• Classical distributed systems.
• Hybrid microservice systems.
A modern classic on the subject
What is a microservice architecture?• In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API.
• These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.
Monoliths vs μservices
The upside of monoliths• With some care, you can run and test the application on a developer's laptop, and 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.
And the downside• Change cycles are tied together - a change made to a small part of the
application, requires the entire monolith to be rebuilt and deployed.• Over time it's often hard to keep a good modular structure, making it
harder to keep changes that ought to only affect one module within that module.
• Scaling requires scaling of the entire application rather than parts of it that require greater resource.
Evolved paradigm• These frustrations have led to the microservice architectural style:
building applications as suites of services.
• As well as the fact that services are independently deployable and scalable, each service also provides a firm module boundary, even allowing for different services to be written in different programming languages.
• They can also be managed (=Operations as well?) by different teams .
μservices are not novel
Characteristics of a Microservice ArchitectureComponentization via Services
• When talking about components we run into the difficult definition of what makes a component. Our definition is that a component is a unit of software that is independently replaceable and upgradeable.
• Microservice architectures will use libraries, but their primary way of componentizing their own software is by breaking down into services.
• We define libraries as components that are linked into a program and called using in-memory function calls, while services are out-of-process components who communicate with a mechanism such as a web service request, or remote procedure call.
Characteristics of a Microservice ArchitectureComponentization via Services (cont.)
• One main reason for using services as components (rather than libraries) is that services are independently deployable.
• Another consequence of using services as components is a more explicit component interface.
• Remote calls are more expensive than in-process calls, and thus remote APIs need to be coarser-grained, which is often more awkward to use.
Characteristics of a Microservice ArchitectureComponentization via Services (cont.)
• If you need to change the allocation of responsibilities between components, such movements of behavior are harder to do when you're crossing process boundaries.
• At a first approximation, we can observe that services map to runtime processes, but that is only a first approximation. A service may consist of multiple processes that will always be developed and deployed together, such as an application process and a database that's only used by that service.
Characteristics of a Microservice ArchitectureOrganized around Business Capabilities
Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization's communication structure.
-- Melvyn Conway, 1967
Division by technology
Division by business capability
Could we modularize monoliths by business capability?
Possibly yes, with some strings attached
• In the application is large enough to occupy multiple teams.
• If the teams are disciplined enough to stay within the defined boundaries of their business concern.
• There may be excessively too many contexts involved for the developers to keep in mind.
• The boundaries are implicit, making them more blurry and ambiguous compared to the microservice approach.
Characteristics of a Microservice ArchitectureProducts not Projects
• Most application development efforts that we see use a project model.
• Microservice proponents tend to avoid this model, preferring instead the notion that a team should own a product over its full lifetime.
• Amazon: "you build, you run it".
• The product mentality, ties in with the linkage to business capabilities, how can software assist its users to enhance the business capability.
Characteristics of a Microservice ArchitectureSmart endpoints and dumb pipes
• In many systems which require inter-process communication there has been an emphasis on 'smart' communication mechanisms, that enable message routing, applying business rules and advanced rules and advanced rules and advanced queueing.
• Microservice depend on simple communication tools, like simple REST protocols (usually over HTTP) and direct messaging (Erlang, Akka,…) or via a lightweight message bus (like ØMQ and RabbitMQ – Kafka?), which provides only a reliable, asynchronous messaging platform.
Characteristics of a Microservice ArchitectureSmart endpoints and dumb pipes (cont.)
• The smarts still live in the end points that are producing and consuming messages; in the services.
• In a monolith, the components are executing in-process and communication between them is via either method invocation or function call.
• The biggest issue in changing a monolith into microservices lies in changing the communication pattern (replacing fine-grained comms with coarser ones).
Characteristics of a Microservice ArchitectureDecentralized Governance
• Centralized Governance -> Standarization on single technology platforms.
• Works 'okay', but does not let us tap the full extend of different technologies which match different concerns the best.
• It doesn't mean that you need to use a different language for every service.
Characteristics of a Microservice ArchitectureDecentralized Governance (cont.)
Characteristics of a Microservice ArchitectureDecentralized Governance (cont.)
• Teams building microservices prefer a different approach to standards too. Rather than use a set of defined standards written down somewhere on paper they prefer the idea of producing useful tools that other developers can use to solve similar problems to the ones they are facing.
• Excellent example: https://github.com/Netflix
Characteristics of a Microservice Architecture Decentralized Governance (cont.)
• Define the contracts for your service.
• Contracts can help to automate the build process, irrespective of the resource's implementation.
• The service can be build to the point it satisfies the contract, no need for building unecessary artifacts (YAGNI) and specifications.
• Most extreme case: Amazon, devs build and run it 24/7.
Characteristics of a Microservice Architecture Decentralized Data Management
• The conceptual model of the world will differ between systems.
• Sales have a different view from Devs, Devs from Ops and Ops from PMs. They will need access to different subsets of the data or with a different presentation logic and semantics.
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
• A useful tool to tame the complexity is Domain-Driven Design (DDD).
• It can break down a complex problem domain into multiple bounded contexts and to map therelationships between them.
• Applicable to monoliths and μservices.
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
• How does a bounded context looks like?
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
• As well as decentralizing decisions about conceptual models, microservices also decentralize data storage decisions.
• While monolithic applications prefer a single logical database for persistant data.
• Microservices prefer letting each service manage its own database, either different instances of the same database technology, or entirely different database systems.
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
• This concept is named Polyglot Persistence.
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
Implications of Decentralized Data Management:
• How do we manage data updates?
• How do we ensure atomicity?
• How do we ensure consistency?
Characteristics of a Microservice Architecture Decentralized Data Management (cont.)
Implications of Decentralized Data Management:
• Transactionless coordination between services
• Accept eventual consistency.
• Evaluate: Cost of sporadic inconsistency vs Cost of lost business under greater consistency.
Characteristics of a Microservice Architecture Infrastructure Automation
• A must for μservice based architectures.
• It has evolved tremendously with the advent of public cloud providers.
• Relevant buzzwords: Continuous Integration and Continuoud Delivery.
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
Prerequisites for CD and CI:
• Thorough test coverage of the codebase.
• Lots of automated tests (not only unit tests).
• Every stage of the pipeline is actually an automated deployment to a new environment.
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
• CD and CI for monoliths and μservices is not differing much.
• Do it first for your system before you break it and then it will be easy :-)
• Make deployments boring and there wont be a difference between 1 or 10 services.
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
• CD and CI for monoliths and μservices is not differing much.
• Do it first for your system before you break it and then it will be easy :-)
• Make deployments boring and there wont be a difference between 1 or 10 services.
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
• Operating the architecturally different systems in production can be very different.
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
• Monitoring for μservices requires significant more automation and orchestration.
• There are many more moving parts and interfaces to look after.
• Employ a modern monitoring system which allows the collection of diverse metrics from many different log sources in dispersed locations, trend analysis and large actionable data size.
• Monitor services, not only machines; you are operating systems not apps.
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
Tools to look into, the ELK stack:
Characteristics of a Microservice Architecture Infrastructure Automation (cont.)
Tools to look into, the Prometheus + fluentd combo:
Characteristics of a Microservice Architecture Design for Failure
• A consequence of using services as components, is that applications need to be designed so that they can tolerate the failure of services
• Any service call could fail due to unavailability of the supplier, the client has to respond to this as gracefully as possible.
• Since services can fail at any time, it's important to be able to detect the failures quickly and, if possible, automatically restore service.
Characteristics of a Microservice Architecture Design for Failure (cont.)
• Microservice applications put a lot of emphasis on real-time monitoring of the application, checking both architectural elements (how many requests per second is the database getting) and business relevant metrics (such as how many orders per minute are received).
• Semantic monitoring can provide an early warning system of something going wrong that triggers development teams to follow up and investigate.
• Microservice teams would expect to see sophisticated monitoring and logging setups for each individual service such as dashboards showing up/down status and a variety of operational and business relevant metrics. Details on circuit breaker status, current throughput and latency are other examples we often encounter in the wild.
Characteristics of a Microservice Architecture Design for Failure (cont.)
Learning from the Pros:
Characteristics of a Microservice Architecture Design for Failure (cont.)
Erlang's design principles:
• Let it crash.
• Shift the failure management one level up, where it can be managed intelligently by your orchestration or monitoring software.
• Fail fast and recover fast and automatically.
• Keep as many things as possible immutable.
Characteristics of a Microservice Architecture Design for Failure (cont.)
• Results into running in the wild with 9 nines uptime.
• 9,99999999% uptime equals to 27ms/year downtime.
Erlang is a classical distributed processing environment, not a microservices-based one.
• Code can be reloaded to each 'service' node, they don't have a dedicated functionality like in a microservice application.
• The overall architecture is more 'fluid' in terms of semantics.
• A microservices-based system is a distributed system, but the other way around may not always hold true.
Characteristics of a Microservice Architecture Evolutionary Design
• Service decomposition is yet a further tool to enable application developers to control changes in their application without slowing down change.
• Change control doesn't necessarily mean change reduction - with the right attitudes and tools you can make frequent, fast, and well-controlled changes to software.
• The key property of a component is the notion of independent replacement and upgradeability - which implies we look for points where we can imagine rewriting a component without affecting its collaborators.
• Indeed many microservice groups take this further by explicitly expecting many services to be scrapped rather than evolved in the longer term.
Characteristics of a Microservice Architecture Evolutionary Design (cont.)
Characteristics of a Microservice Architecture Evolutionary Design
• The Guardian started their website as a monolith.
• They evolve it towards a μservice architecture.
• The monolith is the system's core.
• New features are added as microservices that use the monolith's API.
• Approach that works very well with transient features like thematic pages covering special events, polls or special issues with special UI elements and visualization.
Characteristics of a Microservice Architecture Evolutionary Design
• So evolving your design or using disposable services can be used for aims that are beyond pure engineering. For instance:
• Enhanced user experience.
• Easier A/B testing.
• Agility in feature delivery.
• Easier transition from a monolithic application.
Another path – Self-Contained Systems (SCS)
• Main concept: Instead of decomposing a monolith in microservices, you break it down to autonomous, replaceable web applications.
• SCS are larger than microservices and they will be considerably less SCS than microservices originating from a monolithic application.
• SCS have also separate UI, business logic and data persistence.
• The preferred integration point is on the UI level and sometimes on API.
Another path – Self-Contained Systems (SCS)
Show Case: Kühne + Nagel FreightNet
• An initially monolithic application which evolved to a 1,5 million LOCs Godzilla, with 200+ developers working on it.
• It is written in an internally developed Java Web Framework. Later Spring, JSP, JQuery, Swing/ ULC, GWT/GXT where thrown in the mix.
• It became extremely difficult to evolve it.
• It is K+N's most valuable product, evaluated to billions of Euros.
• It was a make-or-break situation for the company to keep the product manageable.
Show Case: Kühne + Nagel FreightNet (cont.)
The migration process followed was:• They stopped adding even more stuff to the monolith.• They found the seams of the monolith.• They realized that most of the seams are wishful thinking, way to complicated and inter-dependent to split.• They “desiccate” the monolith over time in spite of #3 through new projects that cover parts of some of the monolith’s functionality.• Moving to Microservices might be too much of a drastic step, especially when you have such complex monolithic software.
Show Case: Kühne + Nagel FreightNet (cont.)
• In the end, FreightNet was broken to 10 SCS, each one with ist one UI.
• Mode of transport or modules offering very special functionality were the seams which became the boundaries of the SCSs.
• It took them 4 years only to split the functionality from the monolith, but they see it as the only way possible to decompose a project of this order of complexity.
Interesting resources• https://dev.otto.de/2015/09/30/on-monoliths-and-microservices/
• https://www.elastic.io/breaking-down-monolith-microservices-and-self-contained-systems/
• https://dev.otto.de/2016/03/20/why-microservices/
• http://ryanjbaxter.com/2015/07/15/using-microservices-to-build-cloud-native-applications-part-1/
• Building Microservics, Buch 2013, O'Reilly.
• The Tao of Microservices, Rodger 2016, Manning.
Thank you very much! Have a nice weekend!