@mytechtoday/augment-extensions 1.2.2 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -22
- package/augment-extensions/domain-rules/software-architecture/README.md +143 -143
- package/augment-extensions/domain-rules/software-architecture/examples/banking-layered.md +961 -961
- package/augment-extensions/domain-rules/software-architecture/examples/ecommerce-microservices.md +990 -990
- package/augment-extensions/domain-rules/software-architecture/examples/iot-eventdriven.md +882 -882
- package/augment-extensions/domain-rules/software-architecture/examples/monolith-to-microservices-migration.md +703 -703
- package/augment-extensions/domain-rules/software-architecture/examples/serverless-imageprocessing.md +957 -957
- package/augment-extensions/domain-rules/software-architecture/examples/trading-eventdriven.md +747 -747
- package/augment-extensions/domain-rules/software-architecture/module.json +119 -119
- package/augment-extensions/domain-rules/software-architecture/rules/challenges-solutions.md +763 -763
- package/augment-extensions/domain-rules/software-architecture/rules/definitions-terminology.md +409 -409
- package/augment-extensions/domain-rules/software-architecture/rules/design-principles.md +684 -684
- package/augment-extensions/domain-rules/software-architecture/rules/evaluation-testing.md +1381 -1381
- package/augment-extensions/domain-rules/software-architecture/rules/event-driven-architecture.md +616 -616
- package/augment-extensions/domain-rules/software-architecture/rules/fundamentals.md +306 -306
- package/augment-extensions/domain-rules/software-architecture/rules/industry-architectures.md +554 -554
- package/augment-extensions/domain-rules/software-architecture/rules/layered-architecture.md +776 -776
- package/augment-extensions/domain-rules/software-architecture/rules/microservices-architecture.md +503 -503
- package/augment-extensions/domain-rules/software-architecture/rules/modeling-documentation.md +1199 -1199
- package/augment-extensions/domain-rules/software-architecture/rules/monolithic-architecture.md +351 -351
- package/augment-extensions/domain-rules/software-architecture/rules/principles.md +556 -556
- package/augment-extensions/domain-rules/software-architecture/rules/quality-attributes.md +797 -797
- package/augment-extensions/domain-rules/software-architecture/rules/scalability-performance.md +1345 -1345
- package/augment-extensions/domain-rules/software-architecture/rules/security-architecture.md +1039 -1039
- package/augment-extensions/domain-rules/software-architecture/rules/serverless-architecture.md +711 -711
- package/augment-extensions/domain-rules/software-architecture/rules/skills-development.md +568 -568
- package/augment-extensions/domain-rules/software-architecture/rules/tools-methodologies.md +961 -961
- package/augment-extensions/visual-design/CHANGELOG.md +132 -0
- package/augment-extensions/visual-design/README.md +255 -0
- package/augment-extensions/visual-design/__tests__/README.md +119 -0
- package/augment-extensions/visual-design/__tests__/style-selector.test.ts +172 -0
- package/augment-extensions/visual-design/__tests__/vendor-styles.test.ts +214 -0
- package/augment-extensions/visual-design/domains/other/ai-prompt-helper.ts +157 -0
- package/augment-extensions/visual-design/domains/other/dotnet-application.ts +156 -0
- package/augment-extensions/visual-design/domains/other/linux-platform.ts +156 -0
- package/augment-extensions/visual-design/domains/other/mobile-application.ts +157 -0
- package/augment-extensions/visual-design/domains/other/motion-picture.ts +156 -0
- package/augment-extensions/visual-design/domains/other/os-application.ts +156 -0
- package/augment-extensions/visual-design/domains/other/print-campaigns.ts +158 -0
- package/augment-extensions/visual-design/domains/other/web-app.ts +157 -0
- package/augment-extensions/visual-design/domains/other/website.ts +161 -0
- package/augment-extensions/visual-design/domains/other/windows-platform.ts +156 -0
- package/augment-extensions/visual-design/domains/web-page-styles/amazon-cloudscape.ts +506 -0
- package/augment-extensions/visual-design/domains/web-page-styles/google-modern.ts +615 -0
- package/augment-extensions/visual-design/domains/web-page-styles/microsoft-fluent.ts +531 -0
- package/augment-extensions/visual-design/examples/README.md +97 -0
- package/augment-extensions/visual-design/examples/ai-prompt-generation.md +233 -0
- package/augment-extensions/visual-design/examples/basic-usage.md +216 -0
- package/augment-extensions/visual-design/examples/domain-workflows.md +257 -0
- package/augment-extensions/visual-design/examples/vendor-comparison.md +247 -0
- package/augment-extensions/visual-design/module.json +78 -0
- package/augment-extensions/visual-design/style-selector.ts +177 -0
- package/augment-extensions/visual-design/types.ts +302 -0
- package/augment-extensions/visual-design/visual-design-core.ts +469 -0
- package/augment-extensions/workflows/adr-support/README.md +227 -0
- package/augment-extensions/workflows/adr-support/__tests__/adr-validator.test.ts +203 -0
- package/augment-extensions/workflows/adr-support/adr-validator.ts +162 -0
- package/augment-extensions/workflows/adr-support/examples/complete-lifecycle-example.md +449 -0
- package/augment-extensions/workflows/adr-support/examples/integration-example.md +580 -0
- package/augment-extensions/workflows/adr-support/examples/superseding-example.md +436 -0
- package/augment-extensions/workflows/adr-support/module.json +112 -0
- package/augment-extensions/workflows/adr-support/rules/adr-creation.md +372 -0
- package/augment-extensions/workflows/adr-support/rules/beads-integration.md +443 -0
- package/augment-extensions/workflows/adr-support/rules/conflict-detection.md +486 -0
- package/augment-extensions/workflows/adr-support/rules/decision-detection.md +362 -0
- package/augment-extensions/workflows/adr-support/rules/lifecycle-management.md +427 -0
- package/augment-extensions/workflows/adr-support/rules/openspec-integration.md +465 -0
- package/augment-extensions/workflows/adr-support/rules/template-selection.md +405 -0
- package/augment-extensions/workflows/adr-support/rules/validation-rules.md +543 -0
- package/augment-extensions/workflows/adr-support/schemas/adr-config.json +191 -0
- package/augment-extensions/workflows/adr-support/schemas/adr-metadata.json +172 -0
- package/augment-extensions/workflows/adr-support/templates/business-case.md +235 -0
- package/augment-extensions/workflows/adr-support/templates/madr-elaborate.md +197 -0
- package/augment-extensions/workflows/adr-support/templates/madr-simple.md +68 -0
- package/augment-extensions/workflows/adr-support/templates/nygard.md +84 -0
- package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -213
- package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -169
- package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -165
- package/cli/dist/utils/auto-sync.js +19 -19
- package/package.json +5 -3
- package/augment-extensions/workflows/openspec/README.md +0 -96
- package/augment-extensions/workflows/openspec/examples/complete-change-example.md +0 -244
- package/augment-extensions/workflows/openspec/module.json +0 -54
- package/augment-extensions/workflows/openspec/rules/best-practices.md +0 -272
- package/augment-extensions/workflows/openspec/rules/manual-setup.md +0 -231
- package/augment-extensions/workflows/openspec/rules/spec-format.md +0 -236
- package/augment-extensions/workflows/openspec/rules/workflow.md +0 -214
package/augment-extensions/domain-rules/software-architecture/rules/monolithic-architecture.md
CHANGED
|
@@ -1,351 +1,351 @@
|
|
|
1
|
-
# Monolithic Architecture
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
This document covers monolithic architecture patterns, best practices, and when to use this architectural style for software systems.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Knowledge
|
|
10
|
-
|
|
11
|
-
### What is Monolithic Architecture?
|
|
12
|
-
|
|
13
|
-
**Definition**
|
|
14
|
-
- Single, unified codebase and deployment unit
|
|
15
|
-
- All components run in the same process
|
|
16
|
-
- Shared memory space and resources
|
|
17
|
-
- Single database (typically)
|
|
18
|
-
|
|
19
|
-
**Characteristics**
|
|
20
|
-
- Tightly coupled components
|
|
21
|
-
- Shared data model
|
|
22
|
-
- Single deployment artifact (JAR, WAR, executable)
|
|
23
|
-
- Vertical scaling (scale entire application)
|
|
24
|
-
|
|
25
|
-
**Types of Monoliths**
|
|
26
|
-
1. **Modular Monolith**: Well-organized internal modules with clear boundaries
|
|
27
|
-
2. **Big Ball of Mud**: Poorly structured, tangled dependencies
|
|
28
|
-
3. **Layered Monolith**: Organized in horizontal layers (presentation, business, data)
|
|
29
|
-
|
|
30
|
-
### When to Use Monolithic Architecture
|
|
31
|
-
|
|
32
|
-
**Good Fit**
|
|
33
|
-
- Small to medium-sized applications
|
|
34
|
-
- Simple business domains
|
|
35
|
-
- Small development teams (< 10 developers)
|
|
36
|
-
- Rapid prototyping and MVPs
|
|
37
|
-
- Limited scalability requirements
|
|
38
|
-
- Tight deadlines with limited resources
|
|
39
|
-
|
|
40
|
-
**Poor Fit**
|
|
41
|
-
- Large, complex domains
|
|
42
|
-
- Need for independent scaling of components
|
|
43
|
-
- Multiple teams working independently
|
|
44
|
-
- Frequent deployments of different features
|
|
45
|
-
- Technology diversity requirements
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## Skills
|
|
50
|
-
|
|
51
|
-
### Designing a Modular Monolith
|
|
52
|
-
|
|
53
|
-
**Module Organization**
|
|
54
|
-
1. **Domain-Driven Modules**: Organize by business capabilities
|
|
55
|
-
- User Management
|
|
56
|
-
- Order Processing
|
|
57
|
-
- Inventory Management
|
|
58
|
-
- Billing
|
|
59
|
-
|
|
60
|
-
2. **Layer-Based Modules**: Organize by technical concerns
|
|
61
|
-
- Presentation Layer
|
|
62
|
-
- Application Layer
|
|
63
|
-
- Domain Layer
|
|
64
|
-
- Infrastructure Layer
|
|
65
|
-
|
|
66
|
-
**Module Boundaries**
|
|
67
|
-
- Define clear interfaces between modules
|
|
68
|
-
- Avoid circular dependencies
|
|
69
|
-
- Use dependency injection for loose coupling
|
|
70
|
-
- Encapsulate module internals
|
|
71
|
-
|
|
72
|
-
**Package Structure Example**
|
|
73
|
-
```
|
|
74
|
-
com.example.app/
|
|
75
|
-
├── user/
|
|
76
|
-
│ ├── UserController.java
|
|
77
|
-
│ ├── UserService.java
|
|
78
|
-
│ ├── UserRepository.java
|
|
79
|
-
│ └── User.java
|
|
80
|
-
├── order/
|
|
81
|
-
│ ├── OrderController.java
|
|
82
|
-
│ ├── OrderService.java
|
|
83
|
-
│ ├── OrderRepository.java
|
|
84
|
-
│ └── Order.java
|
|
85
|
-
└── shared/
|
|
86
|
-
├── config/
|
|
87
|
-
├── utils/
|
|
88
|
-
└── exceptions/
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Managing Dependencies
|
|
92
|
-
|
|
93
|
-
**Dependency Rules**
|
|
94
|
-
- Higher layers depend on lower layers
|
|
95
|
-
- Domain layer has no external dependencies
|
|
96
|
-
- Use interfaces to invert dependencies
|
|
97
|
-
- Avoid tight coupling to frameworks
|
|
98
|
-
|
|
99
|
-
**Dependency Injection**
|
|
100
|
-
```java
|
|
101
|
-
// Good: Constructor injection with interfaces
|
|
102
|
-
public class OrderService {
|
|
103
|
-
private final OrderRepository repository;
|
|
104
|
-
private final EmailService emailService;
|
|
105
|
-
|
|
106
|
-
public OrderService(OrderRepository repository,
|
|
107
|
-
EmailService emailService) {
|
|
108
|
-
this.repository = repository;
|
|
109
|
-
this.emailService = emailService;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Bad: Direct instantiation
|
|
114
|
-
public class OrderService {
|
|
115
|
-
private OrderRepository repository = new OrderRepositoryImpl();
|
|
116
|
-
private EmailService emailService = new EmailServiceImpl();
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### Database Management
|
|
121
|
-
|
|
122
|
-
**Single Database Approach**
|
|
123
|
-
- Shared schema across all modules
|
|
124
|
-
- Use database transactions for consistency
|
|
125
|
-
- Careful schema evolution
|
|
126
|
-
- Consider schema namespaces for modules
|
|
127
|
-
|
|
128
|
-
**Data Access Patterns**
|
|
129
|
-
- Repository pattern for data access
|
|
130
|
-
- ORM for object-relational mapping
|
|
131
|
-
- Database migrations (Flyway, Liquibase)
|
|
132
|
-
- Connection pooling
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
## Examples
|
|
137
|
-
|
|
138
|
-
### E-Commerce Monolith Structure
|
|
139
|
-
|
|
140
|
-
**Application Structure**
|
|
141
|
-
```
|
|
142
|
-
ecommerce-app/
|
|
143
|
-
├── src/
|
|
144
|
-
│ ├── main/
|
|
145
|
-
│ │ ├── java/
|
|
146
|
-
│ │ │ └── com/example/ecommerce/
|
|
147
|
-
│ │ │ ├── catalog/
|
|
148
|
-
│ │ │ │ ├── Product.java
|
|
149
|
-
│ │ │ │ ├── ProductService.java
|
|
150
|
-
│ │ │ │ └── ProductController.java
|
|
151
|
-
│ │ │ ├── cart/
|
|
152
|
-
│ │ │ │ ├── Cart.java
|
|
153
|
-
│ │ │ │ ├── CartService.java
|
|
154
|
-
│ │ │ │ └── CartController.java
|
|
155
|
-
│ │ │ ├── order/
|
|
156
|
-
│ │ │ │ ├── Order.java
|
|
157
|
-
│ │ │ │ ├── OrderService.java
|
|
158
|
-
│ │ │ │ └── OrderController.java
|
|
159
|
-
│ │ │ └── payment/
|
|
160
|
-
│ │ │ ├── Payment.java
|
|
161
|
-
│ │ │ ├── PaymentService.java
|
|
162
|
-
│ │ │ └── PaymentController.java
|
|
163
|
-
│ │ └── resources/
|
|
164
|
-
│ │ ├── application.properties
|
|
165
|
-
│ │ └── db/migration/
|
|
166
|
-
│ └── test/
|
|
167
|
-
└── pom.xml
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
**Service Layer Example**
|
|
171
|
-
```java
|
|
172
|
-
@Service
|
|
173
|
-
@Transactional
|
|
174
|
-
public class OrderService {
|
|
175
|
-
private final OrderRepository orderRepository;
|
|
176
|
-
private final ProductService productService;
|
|
177
|
-
private final PaymentService paymentService;
|
|
178
|
-
private final EmailService emailService;
|
|
179
|
-
|
|
180
|
-
public Order createOrder(CreateOrderRequest request) {
|
|
181
|
-
// Validate products
|
|
182
|
-
List<Product> products = productService.validateProducts(
|
|
183
|
-
request.getProductIds()
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
// Calculate total
|
|
187
|
-
BigDecimal total = calculateTotal(products);
|
|
188
|
-
|
|
189
|
-
// Create order
|
|
190
|
-
Order order = new Order();
|
|
191
|
-
order.setCustomerId(request.getCustomerId());
|
|
192
|
-
order.setProducts(products);
|
|
193
|
-
order.setTotal(total);
|
|
194
|
-
order.setStatus(OrderStatus.PENDING);
|
|
195
|
-
|
|
196
|
-
// Save order
|
|
197
|
-
order = orderRepository.save(order);
|
|
198
|
-
|
|
199
|
-
// Process payment
|
|
200
|
-
Payment payment = paymentService.processPayment(
|
|
201
|
-
order.getId(),
|
|
202
|
-
total
|
|
203
|
-
);
|
|
204
|
-
|
|
205
|
-
if (payment.isSuccessful()) {
|
|
206
|
-
order.setStatus(OrderStatus.CONFIRMED);
|
|
207
|
-
emailService.sendOrderConfirmation(order);
|
|
208
|
-
} else {
|
|
209
|
-
order.setStatus(OrderStatus.FAILED);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
return orderRepository.save(order);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
|
-
## Understanding
|
|
220
|
-
|
|
221
|
-
### Advantages of Monolithic Architecture
|
|
222
|
-
|
|
223
|
-
**Development Simplicity**
|
|
224
|
-
- Single codebase to understand
|
|
225
|
-
- Easier debugging (single process)
|
|
226
|
-
- Simpler IDE setup
|
|
227
|
-
- Straightforward testing
|
|
228
|
-
|
|
229
|
-
**Deployment Simplicity**
|
|
230
|
-
- Single deployment unit
|
|
231
|
-
- No distributed system complexity
|
|
232
|
-
- Easier rollback
|
|
233
|
-
- Simpler infrastructure
|
|
234
|
-
|
|
235
|
-
**Performance**
|
|
236
|
-
- In-process communication (no network overhead)
|
|
237
|
-
- Shared memory access
|
|
238
|
-
- ACID transactions
|
|
239
|
-
- Lower latency
|
|
240
|
-
|
|
241
|
-
**Development Velocity (Initially)**
|
|
242
|
-
- Faster initial development
|
|
243
|
-
- No service boundaries to negotiate
|
|
244
|
-
- Shared code reuse
|
|
245
|
-
- Simpler refactoring
|
|
246
|
-
|
|
247
|
-
### Disadvantages and Challenges
|
|
248
|
-
|
|
249
|
-
**Scalability Limitations**
|
|
250
|
-
- Must scale entire application
|
|
251
|
-
- Cannot scale components independently
|
|
252
|
-
- Resource inefficiency
|
|
253
|
-
- Vertical scaling limits
|
|
254
|
-
|
|
255
|
-
**Deployment Risks**
|
|
256
|
-
- Single point of failure
|
|
257
|
-
- All-or-nothing deployments
|
|
258
|
-
- Longer deployment times
|
|
259
|
-
- Higher risk of breaking changes
|
|
260
|
-
|
|
261
|
-
**Technology Lock-in**
|
|
262
|
-
- Single technology stack
|
|
263
|
-
- Difficult to adopt new technologies
|
|
264
|
-
- Framework upgrades affect entire app
|
|
265
|
-
- Limited experimentation
|
|
266
|
-
|
|
267
|
-
**Team Coordination**
|
|
268
|
-
- Code conflicts increase with team size
|
|
269
|
-
- Merge conflicts
|
|
270
|
-
- Coordination overhead
|
|
271
|
-
- Slower release cycles
|
|
272
|
-
|
|
273
|
-
**Maintenance Challenges**
|
|
274
|
-
- Growing complexity over time
|
|
275
|
-
- Tight coupling increases
|
|
276
|
-
- Technical debt accumulation
|
|
277
|
-
- Difficult to understand (large codebases)
|
|
278
|
-
|
|
279
|
-
### Best Practices
|
|
280
|
-
|
|
281
|
-
**Keep It Modular**
|
|
282
|
-
- Enforce module boundaries
|
|
283
|
-
- Use package-private visibility
|
|
284
|
-
- Avoid circular dependencies
|
|
285
|
-
- Regular architecture reviews
|
|
286
|
-
|
|
287
|
-
**Maintain Clean Architecture**
|
|
288
|
-
- Separate concerns (layers)
|
|
289
|
-
- Dependency inversion
|
|
290
|
-
- Domain-driven design
|
|
291
|
-
- SOLID principles
|
|
292
|
-
|
|
293
|
-
**Automated Testing**
|
|
294
|
-
- Unit tests for business logic
|
|
295
|
-
- Integration tests for workflows
|
|
296
|
-
- End-to-end tests for critical paths
|
|
297
|
-
- Test coverage monitoring
|
|
298
|
-
|
|
299
|
-
**Continuous Integration/Deployment**
|
|
300
|
-
- Automated builds
|
|
301
|
-
- Automated testing
|
|
302
|
-
- Feature flags for gradual rollouts
|
|
303
|
-
- Blue-green deployments
|
|
304
|
-
|
|
305
|
-
**Monitoring and Observability**
|
|
306
|
-
- Application performance monitoring
|
|
307
|
-
- Error tracking
|
|
308
|
-
- Logging (structured logs)
|
|
309
|
-
- Health checks
|
|
310
|
-
|
|
311
|
-
### Migration Strategies
|
|
312
|
-
|
|
313
|
-
**When to Consider Migration**
|
|
314
|
-
- Team size exceeds 10-15 developers
|
|
315
|
-
- Deployment frequency bottleneck
|
|
316
|
-
- Scaling requirements differ by component
|
|
317
|
-
- Technology diversity needed
|
|
318
|
-
|
|
319
|
-
**Strangler Fig Pattern**
|
|
320
|
-
1. Identify bounded context to extract
|
|
321
|
-
2. Build new microservice alongside monolith
|
|
322
|
-
3. Route new traffic to microservice
|
|
323
|
-
4. Migrate existing data gradually
|
|
324
|
-
5. Decommission monolith code
|
|
325
|
-
|
|
326
|
-
**Branch by Abstraction**
|
|
327
|
-
1. Create abstraction layer
|
|
328
|
-
2. Implement new service behind abstraction
|
|
329
|
-
3. Gradually migrate callers
|
|
330
|
-
4. Remove old implementation
|
|
331
|
-
5. Remove abstraction
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
## References
|
|
336
|
-
|
|
337
|
-
- **Books**
|
|
338
|
-
- "Monolith to Microservices" by Sam Newman
|
|
339
|
-
- "Building Evolutionary Architectures" by Neal Ford
|
|
340
|
-
- "Clean Architecture" by Robert C. Martin
|
|
341
|
-
|
|
342
|
-
- **Patterns**
|
|
343
|
-
- Modular Monolith Pattern
|
|
344
|
-
- Layered Architecture Pattern
|
|
345
|
-
- Strangler Fig Pattern
|
|
346
|
-
|
|
347
|
-
- **Standards**
|
|
348
|
-
- ISO/IEC 42010 (Architecture Description)
|
|
349
|
-
- Twelve-Factor App Methodology
|
|
350
|
-
|
|
351
|
-
|
|
1
|
+
# Monolithic Architecture
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document covers monolithic architecture patterns, best practices, and when to use this architectural style for software systems.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Knowledge
|
|
10
|
+
|
|
11
|
+
### What is Monolithic Architecture?
|
|
12
|
+
|
|
13
|
+
**Definition**
|
|
14
|
+
- Single, unified codebase and deployment unit
|
|
15
|
+
- All components run in the same process
|
|
16
|
+
- Shared memory space and resources
|
|
17
|
+
- Single database (typically)
|
|
18
|
+
|
|
19
|
+
**Characteristics**
|
|
20
|
+
- Tightly coupled components
|
|
21
|
+
- Shared data model
|
|
22
|
+
- Single deployment artifact (JAR, WAR, executable)
|
|
23
|
+
- Vertical scaling (scale entire application)
|
|
24
|
+
|
|
25
|
+
**Types of Monoliths**
|
|
26
|
+
1. **Modular Monolith**: Well-organized internal modules with clear boundaries
|
|
27
|
+
2. **Big Ball of Mud**: Poorly structured, tangled dependencies
|
|
28
|
+
3. **Layered Monolith**: Organized in horizontal layers (presentation, business, data)
|
|
29
|
+
|
|
30
|
+
### When to Use Monolithic Architecture
|
|
31
|
+
|
|
32
|
+
**Good Fit**
|
|
33
|
+
- Small to medium-sized applications
|
|
34
|
+
- Simple business domains
|
|
35
|
+
- Small development teams (< 10 developers)
|
|
36
|
+
- Rapid prototyping and MVPs
|
|
37
|
+
- Limited scalability requirements
|
|
38
|
+
- Tight deadlines with limited resources
|
|
39
|
+
|
|
40
|
+
**Poor Fit**
|
|
41
|
+
- Large, complex domains
|
|
42
|
+
- Need for independent scaling of components
|
|
43
|
+
- Multiple teams working independently
|
|
44
|
+
- Frequent deployments of different features
|
|
45
|
+
- Technology diversity requirements
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Skills
|
|
50
|
+
|
|
51
|
+
### Designing a Modular Monolith
|
|
52
|
+
|
|
53
|
+
**Module Organization**
|
|
54
|
+
1. **Domain-Driven Modules**: Organize by business capabilities
|
|
55
|
+
- User Management
|
|
56
|
+
- Order Processing
|
|
57
|
+
- Inventory Management
|
|
58
|
+
- Billing
|
|
59
|
+
|
|
60
|
+
2. **Layer-Based Modules**: Organize by technical concerns
|
|
61
|
+
- Presentation Layer
|
|
62
|
+
- Application Layer
|
|
63
|
+
- Domain Layer
|
|
64
|
+
- Infrastructure Layer
|
|
65
|
+
|
|
66
|
+
**Module Boundaries**
|
|
67
|
+
- Define clear interfaces between modules
|
|
68
|
+
- Avoid circular dependencies
|
|
69
|
+
- Use dependency injection for loose coupling
|
|
70
|
+
- Encapsulate module internals
|
|
71
|
+
|
|
72
|
+
**Package Structure Example**
|
|
73
|
+
```
|
|
74
|
+
com.example.app/
|
|
75
|
+
├── user/
|
|
76
|
+
│ ├── UserController.java
|
|
77
|
+
│ ├── UserService.java
|
|
78
|
+
│ ├── UserRepository.java
|
|
79
|
+
│ └── User.java
|
|
80
|
+
├── order/
|
|
81
|
+
│ ├── OrderController.java
|
|
82
|
+
│ ├── OrderService.java
|
|
83
|
+
│ ├── OrderRepository.java
|
|
84
|
+
│ └── Order.java
|
|
85
|
+
└── shared/
|
|
86
|
+
├── config/
|
|
87
|
+
├── utils/
|
|
88
|
+
└── exceptions/
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Managing Dependencies
|
|
92
|
+
|
|
93
|
+
**Dependency Rules**
|
|
94
|
+
- Higher layers depend on lower layers
|
|
95
|
+
- Domain layer has no external dependencies
|
|
96
|
+
- Use interfaces to invert dependencies
|
|
97
|
+
- Avoid tight coupling to frameworks
|
|
98
|
+
|
|
99
|
+
**Dependency Injection**
|
|
100
|
+
```java
|
|
101
|
+
// Good: Constructor injection with interfaces
|
|
102
|
+
public class OrderService {
|
|
103
|
+
private final OrderRepository repository;
|
|
104
|
+
private final EmailService emailService;
|
|
105
|
+
|
|
106
|
+
public OrderService(OrderRepository repository,
|
|
107
|
+
EmailService emailService) {
|
|
108
|
+
this.repository = repository;
|
|
109
|
+
this.emailService = emailService;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Bad: Direct instantiation
|
|
114
|
+
public class OrderService {
|
|
115
|
+
private OrderRepository repository = new OrderRepositoryImpl();
|
|
116
|
+
private EmailService emailService = new EmailServiceImpl();
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Database Management
|
|
121
|
+
|
|
122
|
+
**Single Database Approach**
|
|
123
|
+
- Shared schema across all modules
|
|
124
|
+
- Use database transactions for consistency
|
|
125
|
+
- Careful schema evolution
|
|
126
|
+
- Consider schema namespaces for modules
|
|
127
|
+
|
|
128
|
+
**Data Access Patterns**
|
|
129
|
+
- Repository pattern for data access
|
|
130
|
+
- ORM for object-relational mapping
|
|
131
|
+
- Database migrations (Flyway, Liquibase)
|
|
132
|
+
- Connection pooling
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Examples
|
|
137
|
+
|
|
138
|
+
### E-Commerce Monolith Structure
|
|
139
|
+
|
|
140
|
+
**Application Structure**
|
|
141
|
+
```
|
|
142
|
+
ecommerce-app/
|
|
143
|
+
├── src/
|
|
144
|
+
│ ├── main/
|
|
145
|
+
│ │ ├── java/
|
|
146
|
+
│ │ │ └── com/example/ecommerce/
|
|
147
|
+
│ │ │ ├── catalog/
|
|
148
|
+
│ │ │ │ ├── Product.java
|
|
149
|
+
│ │ │ │ ├── ProductService.java
|
|
150
|
+
│ │ │ │ └── ProductController.java
|
|
151
|
+
│ │ │ ├── cart/
|
|
152
|
+
│ │ │ │ ├── Cart.java
|
|
153
|
+
│ │ │ │ ├── CartService.java
|
|
154
|
+
│ │ │ │ └── CartController.java
|
|
155
|
+
│ │ │ ├── order/
|
|
156
|
+
│ │ │ │ ├── Order.java
|
|
157
|
+
│ │ │ │ ├── OrderService.java
|
|
158
|
+
│ │ │ │ └── OrderController.java
|
|
159
|
+
│ │ │ └── payment/
|
|
160
|
+
│ │ │ ├── Payment.java
|
|
161
|
+
│ │ │ ├── PaymentService.java
|
|
162
|
+
│ │ │ └── PaymentController.java
|
|
163
|
+
│ │ └── resources/
|
|
164
|
+
│ │ ├── application.properties
|
|
165
|
+
│ │ └── db/migration/
|
|
166
|
+
│ └── test/
|
|
167
|
+
└── pom.xml
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Service Layer Example**
|
|
171
|
+
```java
|
|
172
|
+
@Service
|
|
173
|
+
@Transactional
|
|
174
|
+
public class OrderService {
|
|
175
|
+
private final OrderRepository orderRepository;
|
|
176
|
+
private final ProductService productService;
|
|
177
|
+
private final PaymentService paymentService;
|
|
178
|
+
private final EmailService emailService;
|
|
179
|
+
|
|
180
|
+
public Order createOrder(CreateOrderRequest request) {
|
|
181
|
+
// Validate products
|
|
182
|
+
List<Product> products = productService.validateProducts(
|
|
183
|
+
request.getProductIds()
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
// Calculate total
|
|
187
|
+
BigDecimal total = calculateTotal(products);
|
|
188
|
+
|
|
189
|
+
// Create order
|
|
190
|
+
Order order = new Order();
|
|
191
|
+
order.setCustomerId(request.getCustomerId());
|
|
192
|
+
order.setProducts(products);
|
|
193
|
+
order.setTotal(total);
|
|
194
|
+
order.setStatus(OrderStatus.PENDING);
|
|
195
|
+
|
|
196
|
+
// Save order
|
|
197
|
+
order = orderRepository.save(order);
|
|
198
|
+
|
|
199
|
+
// Process payment
|
|
200
|
+
Payment payment = paymentService.processPayment(
|
|
201
|
+
order.getId(),
|
|
202
|
+
total
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
if (payment.isSuccessful()) {
|
|
206
|
+
order.setStatus(OrderStatus.CONFIRMED);
|
|
207
|
+
emailService.sendOrderConfirmation(order);
|
|
208
|
+
} else {
|
|
209
|
+
order.setStatus(OrderStatus.FAILED);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return orderRepository.save(order);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Understanding
|
|
220
|
+
|
|
221
|
+
### Advantages of Monolithic Architecture
|
|
222
|
+
|
|
223
|
+
**Development Simplicity**
|
|
224
|
+
- Single codebase to understand
|
|
225
|
+
- Easier debugging (single process)
|
|
226
|
+
- Simpler IDE setup
|
|
227
|
+
- Straightforward testing
|
|
228
|
+
|
|
229
|
+
**Deployment Simplicity**
|
|
230
|
+
- Single deployment unit
|
|
231
|
+
- No distributed system complexity
|
|
232
|
+
- Easier rollback
|
|
233
|
+
- Simpler infrastructure
|
|
234
|
+
|
|
235
|
+
**Performance**
|
|
236
|
+
- In-process communication (no network overhead)
|
|
237
|
+
- Shared memory access
|
|
238
|
+
- ACID transactions
|
|
239
|
+
- Lower latency
|
|
240
|
+
|
|
241
|
+
**Development Velocity (Initially)**
|
|
242
|
+
- Faster initial development
|
|
243
|
+
- No service boundaries to negotiate
|
|
244
|
+
- Shared code reuse
|
|
245
|
+
- Simpler refactoring
|
|
246
|
+
|
|
247
|
+
### Disadvantages and Challenges
|
|
248
|
+
|
|
249
|
+
**Scalability Limitations**
|
|
250
|
+
- Must scale entire application
|
|
251
|
+
- Cannot scale components independently
|
|
252
|
+
- Resource inefficiency
|
|
253
|
+
- Vertical scaling limits
|
|
254
|
+
|
|
255
|
+
**Deployment Risks**
|
|
256
|
+
- Single point of failure
|
|
257
|
+
- All-or-nothing deployments
|
|
258
|
+
- Longer deployment times
|
|
259
|
+
- Higher risk of breaking changes
|
|
260
|
+
|
|
261
|
+
**Technology Lock-in**
|
|
262
|
+
- Single technology stack
|
|
263
|
+
- Difficult to adopt new technologies
|
|
264
|
+
- Framework upgrades affect entire app
|
|
265
|
+
- Limited experimentation
|
|
266
|
+
|
|
267
|
+
**Team Coordination**
|
|
268
|
+
- Code conflicts increase with team size
|
|
269
|
+
- Merge conflicts
|
|
270
|
+
- Coordination overhead
|
|
271
|
+
- Slower release cycles
|
|
272
|
+
|
|
273
|
+
**Maintenance Challenges**
|
|
274
|
+
- Growing complexity over time
|
|
275
|
+
- Tight coupling increases
|
|
276
|
+
- Technical debt accumulation
|
|
277
|
+
- Difficult to understand (large codebases)
|
|
278
|
+
|
|
279
|
+
### Best Practices
|
|
280
|
+
|
|
281
|
+
**Keep It Modular**
|
|
282
|
+
- Enforce module boundaries
|
|
283
|
+
- Use package-private visibility
|
|
284
|
+
- Avoid circular dependencies
|
|
285
|
+
- Regular architecture reviews
|
|
286
|
+
|
|
287
|
+
**Maintain Clean Architecture**
|
|
288
|
+
- Separate concerns (layers)
|
|
289
|
+
- Dependency inversion
|
|
290
|
+
- Domain-driven design
|
|
291
|
+
- SOLID principles
|
|
292
|
+
|
|
293
|
+
**Automated Testing**
|
|
294
|
+
- Unit tests for business logic
|
|
295
|
+
- Integration tests for workflows
|
|
296
|
+
- End-to-end tests for critical paths
|
|
297
|
+
- Test coverage monitoring
|
|
298
|
+
|
|
299
|
+
**Continuous Integration/Deployment**
|
|
300
|
+
- Automated builds
|
|
301
|
+
- Automated testing
|
|
302
|
+
- Feature flags for gradual rollouts
|
|
303
|
+
- Blue-green deployments
|
|
304
|
+
|
|
305
|
+
**Monitoring and Observability**
|
|
306
|
+
- Application performance monitoring
|
|
307
|
+
- Error tracking
|
|
308
|
+
- Logging (structured logs)
|
|
309
|
+
- Health checks
|
|
310
|
+
|
|
311
|
+
### Migration Strategies
|
|
312
|
+
|
|
313
|
+
**When to Consider Migration**
|
|
314
|
+
- Team size exceeds 10-15 developers
|
|
315
|
+
- Deployment frequency bottleneck
|
|
316
|
+
- Scaling requirements differ by component
|
|
317
|
+
- Technology diversity needed
|
|
318
|
+
|
|
319
|
+
**Strangler Fig Pattern**
|
|
320
|
+
1. Identify bounded context to extract
|
|
321
|
+
2. Build new microservice alongside monolith
|
|
322
|
+
3. Route new traffic to microservice
|
|
323
|
+
4. Migrate existing data gradually
|
|
324
|
+
5. Decommission monolith code
|
|
325
|
+
|
|
326
|
+
**Branch by Abstraction**
|
|
327
|
+
1. Create abstraction layer
|
|
328
|
+
2. Implement new service behind abstraction
|
|
329
|
+
3. Gradually migrate callers
|
|
330
|
+
4. Remove old implementation
|
|
331
|
+
5. Remove abstraction
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## References
|
|
336
|
+
|
|
337
|
+
- **Books**
|
|
338
|
+
- "Monolith to Microservices" by Sam Newman
|
|
339
|
+
- "Building Evolutionary Architectures" by Neal Ford
|
|
340
|
+
- "Clean Architecture" by Robert C. Martin
|
|
341
|
+
|
|
342
|
+
- **Patterns**
|
|
343
|
+
- Modular Monolith Pattern
|
|
344
|
+
- Layered Architecture Pattern
|
|
345
|
+
- Strangler Fig Pattern
|
|
346
|
+
|
|
347
|
+
- **Standards**
|
|
348
|
+
- ISO/IEC 42010 (Architecture Description)
|
|
349
|
+
- Twelve-Factor App Methodology
|
|
350
|
+
|
|
351
|
+
|