architectural code analysis...use of microservices architecture is appropriate use architectural...
TRANSCRIPT
![Page 1: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/1.jpg)
Role of Structural Analysis in building Microservices
Architectural Code Analysis
![Page 2: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/2.jpg)
1
Agenda
Intro to Structural Analysis Challenges addressed during traditional software development The new world of Cloud and Microservices – new set of
challenges Designing and building new applications Making use of Microservices Refactoring monolith applications
![Page 3: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/3.jpg)
2
Quick Intro
Background: 18 years of building and delivering enterprise level solutions for
Fortune 1000 companies and federal government agencies Various roles in software development, IT, delivery and solution
design organizations For the past 7 years have been helping customers to incorporate
Architectural Analysis into their development process
Contact: Email: [email protected] Twitter: itmetricsguy LinkedIn: linkedin.com/in/prabinovich
![Page 4: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/4.jpg)
Why is Structural Analysis is Important
Architecturally Complex Violations are structural flaws involving interactions among components that reside in different application layers. Although they constitute only 8% of the vulnerabilities in an application, they represent:– 48% of the repair effort and require 20 times more changes to fix!– 8 times more likely to escape into testing and 6 times more likely to escape into
operations.
UNIT LEVEL FLAWS
Downtime caused by system-level flaws!
of all defects
of total repair effort
92%
8%
52%
48% 90%
10%
SYSTEM LEVEL FLAWS Effective Software Risk Prevention: Focus on critical
violations that matter Focus resources on area
of highest impact not highest volume
“Tracking programming practices at the Unit Level alone may not translate into the anticipated
business impact, …most devastating defects can only be detected at the System Level.” - OMG
![Page 5: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/5.jpg)
4
Recent SEI Study on Impact of Decisions
![Page 6: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/6.jpg)
Look Horizontally Across Application Tiers
Look horizontally across layers to see how they are interacting
Logi
c D
ata
Laye
rU
I Lay
er
5
REDUCE COSTINCREASE CONTROLRISK MITIGATION
![Page 7: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/7.jpg)
Tracing Vertically Though Application Call StackLo
gic
Dat
a La
yer
UI L
ayer
6
Review vertical slice of the application from user action (or API call) through the call stack all the way down to the backend
components
REDUCE COSTINCREASE CONTROLRISK MITIGATION
![Page 8: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/8.jpg)
Good Quality?
Good Quality
Good Quality
?
?
7
Example: System-Level Defects visible through Transactions
Poor Quality
Website UI
Business Logic
Data Access & DB
Remote Calls in Loop
SELECT * FROM customers WHERE username = “John Doe”
SQL query on an XXL tables without indexes
Avoid using SQL queries inside a loop
Transaction
![Page 9: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/9.jpg)
MICROSERVICES DEFINEDWhat does the new world look like?
8
![Page 10: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/10.jpg)
9
What exactly are Microservices?
But... have consensus on principles They are small Narrowly focused Independently deployable
No concrete definition exists…
![Page 11: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/11.jpg)
10
The new world of Microservices
UI
Business Logic
Data Access
Database
UI
Microservice
Microservice
Microservice
Microservice
Data Data Data
![Page 12: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/12.jpg)
11
Microservices – The Promise
Faster time to market Independent release cycles Use any technology to develop Isolate failures
![Page 13: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/13.jpg)
12
Microservices – why do it?
Scaling of the development organization Scaling of applications that to meet increasing demand Increase velocity of getting features into production
It is all about scaling!
![Page 14: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/14.jpg)
13
Foundation Required to Support Microservices
Mature CI CD process Good understanding of the functional domain Organization is ready to embrace and restructure Finally, this is right design pattern – not a given!!
![Page 15: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/15.jpg)
14
Not a Silver Bullet
A lots of things to keep in mind In effect this is a "distributed" app design A LOT harder to build!!! As such, keep in mind all “Fallacies of Distributed Computing”
when utilizing Microservices architecture– The network is reliable.– Latency is zero.– Bandwidth is infinite.– The network is secure.– Topology doesn't change.– There is one administrator.– Transport cost is zero.– The network is homogeneous.
![Page 16: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/16.jpg)
15
Distributed Monolith Anti-Pattern
The entire notion of Microservices is built on is minimizing dependencies
UI
MS MS MS
Data Data Data
UI UI
MS MS MS
User Interface
Business Logic
Data Access
Database
![Page 17: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/17.jpg)
GREENFIELD PROJECTSArchitectural Analysis in Building new Microservices
16
![Page 18: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/18.jpg)
17
City Planner vs. Architect
City Planner is a better comparison to the role of a Software Architect vs. Civil Engineer
A system, just like a city, needs to be a happy place to cohabitate developers, operations people, and of course end users
“Zoning” Mentality – need to worry much less about what happens inside the zone than what happens between the zones. worry about what happens between the zones vs. inside the zones.”
Sam Newman Building Microservices: Designing Fine-Grained Systems
![Page 19: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/19.jpg)
18
Governance through Architectural Standards
Use of Standards in a distributed system is even more important then in Monolith
A lot more moving parts so need standardization in order for those system to come together
Architectural standards vs. coding standards
![Page 20: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/20.jpg)
19
Domain Driven Design
Core concept of Microservices Architecture Break down the system into Bounded Contexts
**Image from MartinFowler.com
![Page 21: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/21.jpg)
20
Approach for Defining Domains
Challenge – not so easy– Need to have very good understanding of the problem space– Getting boundaries wrong can be very costly– Doing a lot of upfront design is not practical
Caution – do not rush into it– Sam Newman – prematurely decomposing systems into
Microservices can be costly, especially if new to domain– Martin Flower suggests that Monolith-First approach might be better
way to go Approach – build and refactor
– Architectural Analysis can provide a number of indicators to determine when to refactor and for ensuring the boundaries have been drawn up correctly
![Page 22: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/22.jpg)
21
Architectural Analysis Metrics
Cohesion is a degree to which elements inside a module belong together determined by strength of their relationships
Coupling is the degree of interdependence between modules
CouplingCohesion
![Page 23: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/23.jpg)
22
Principle of Maintaining a Single Purpose
Use Cohesion Metrics to determine when service starts providing too much unrelated functionality
Perform continuous analysis and when gets above certain threshold put on the refactor backlog
Microservice A Microservice B Microservice C
Refactor
Web ServiceCall
Low Cohesion High
CohesionHigh Cohesion
![Page 24: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/24.jpg)
23
Principle of Avoiding Chatty Services
Coupling Metrics will provide indication on the level of dependencies between metric being developed and external metrics it consumes
Iterative calls to an external service is a potential indicator of excessive network traffic
Microservice AMicroservice B
Microservice C
Chatty - Iterative Call
Social - Makes use of many external
calls
![Page 25: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/25.jpg)
24
Cyclomatic Complexity Metric
Cyclomatic Complexity is determined by the logical paths through the component’s source code
![Page 26: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/26.jpg)
25
Avoid CRUD-type Services that are too Small
Use dataflow to identify the path traveled by the data elements from where they are stored to where they are shared out by the service
Evaluate the amount of “logic” (cyclomatic complexity) that is performed on the data to ensure internal implementation details are hidden and the service provide functionality beyond simple CRUD operations
![Page 27: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/27.jpg)
26
Principle of Hiding Implementation Details
Large portion of the data elements that is implemented by the service must be internal to the interworking of a service
Use Architectural analysis to evaluate the ratio of total data elements to the number of elements exposed by the services interfaces
Microservice A
![Page 28: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/28.jpg)
27
Principles of Observability and Traceability Observability is a level of transparency provided on what is happening
within the service Log when transaction starts, critical points and when it exists Include Correlation ID to allow tie relevant events together Compare cyclomatic complexity of a transaction to the level of
logging that is done within its boundaries
![Page 29: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/29.jpg)
28
Principle of Isolation of Failure
Use structural analysis to analyze the flow around calls to external services to ensure it is consistent and provides service resiliency
Calls to external services should not expect to be consistently dependable
Retry X times
Setup timeouts
Callout external service
Check success of
the call
Ensure calls to external services are properly decorated by setting appropriate timeout thresholds, recognition of failed conditions, retries, etc.
Synchronous vs. Asynchronous
![Page 30: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/30.jpg)
29
Principle of Being Conservative with Ingress Data
Postel’s Law – Be conservative in what you send and liberal in what you accept
Only extract data from payload that is being used by the service Use of Architectural Analysis to identify data not being used
User Service
Order Service
Get User Info
User
IDPK
Name
Address
Date of Birth
Payload
Print Invoice
Printing Service
Ship Product
Shipping Service- Name- Address
- Name- Amount
Get only “Name” and
“Address” from
payload
![Page 31: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/31.jpg)
30
Favor Orchestration vs. Choreography
Avoid “god” services that are responsible for coordinating activities
Avoid dumb CRUD services that are controlled by orchestration services
Total number of outgoing calls and the integration complexitymetrics are indicators of a “god” service
CRUD Service
CRUD Service
CRUD Service
CRUD Service
CRUD Service
Orchestration Service
![Page 32: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/32.jpg)
31
Use Pre-Built Tools
Zipkin – distributed tracing system Linker-d and Envoy – proxies for inter-services communication Handle a lot of hard stuff that have to deal with when building
distributed systems:– Discovery– Health checking– Load balancing– Observability– Failure handling
Provides a way for services implemented in different technologies to communicate with one another
Use Architectural Analysis to ensure these systems are used correctly, consistently and uniformly
![Page 33: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/33.jpg)
MODERNIZATION PROJECTSRefactoring Monolith Systems to Microservices
32
![Page 34: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/34.jpg)
33
Principles
Do it gradually – no big bang approach Start with least impactful parts of the application Use of “Stranger Pattern” to replace functionality It is all about Bounded Context and Seams
All these principles can be driven using Architectural Analysis through the metrics and insight that it provides about interworkings of a monolith application
![Page 35: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/35.jpg)
34
Identify Bounded Context and Seams
Cohesion and coupling metrics can naturally help point out which components are part of the same domain and belong together and where to make the separation from the system
![Page 36: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/36.jpg)
Component that will need to be decoupled
Recipe Bounded Context
Category Bounded Context
35
Use of Transactions to “Peel” Vertical Layers Review which components support delivering of functionality for specific
bounded context by reviewing transactions Identify components that create dependencies that will need to
decoupled
![Page 37: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/37.jpg)
36
Use of Architectural Dependency Mappings Review dependencies that will need to be taken care of while
decoupling components The level of interconnections will determine the effort and risks
associated with refactoring efforts
![Page 38: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/38.jpg)
37
Strangled Pattern in Action
Martin Fowler introduced the “Strangle Pattern” as a way to refactor older applications
Architectural Analysis provides insight to help manage that process
![Page 39: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/39.jpg)
38
Wrap-Up
In the new world of Microservices it is all about architecture Has a lot of potential, but adds much complexity Don’t forget old-school OO concepts as they are still applicable
in the new world Determine If use of Microservices architecture is appropriate Use Architectural Analysis for:
– Refactoring monolith to identify bounded context and gradually “strangle” out functionality
– Building new Microservices based application to drive consistency and adherence to best practices across an organization
– Ensuring you are getting most out of prepackaged proxy or tracing system being used by the application
![Page 40: Architectural Code Analysis...use of Microservices architecture is appropriate Use Architectural Analysis for: – Refactoring monolith to identify bounded context and gradually “strangle”](https://reader030.vdocument.in/reader030/viewer/2022041019/5ece5845a59d69109e45e220/html5/thumbnails/40.jpg)
39
Thank you
Contact: Email: [email protected] Twitter: itmetricsguy LinkedIn: linkedin.com/in/prabinovich