System Design trong Java Enterprise

1. Nguyên tắc Thiết kế Hệ thống

1.1 Scalability (Khả năng mở rộng)

  • Vertical Scaling (Scale Up)
  • Tăng tài nguyên cho server hiện có
  • Ưu điểm: Đơn giản, dễ quản lý
  • Nhược điểm: Giới hạn về phần cứng, chi phí cao

  • Horizontal Scaling (Scale Out)

  • Thêm nhiều server/instance
  • Load balancing giữa các instance
  • Stateless design để dễ scale java @Configuration public class LoadBalancerConfig { @Bean public LoadBalancerClient loadBalancer() { return LoadBalancerBuilder.newBuilder() .round_robin() .build(); } }

1.2 Availability (Tính sẵn sàng)

  • High Availability Design
  • Active-Active configuration
  • Active-Passive configuration
  • Failover mechanisms ```java @CircuitBreaker(name = "userService", fallbackMethod = "fallbackMethod") public User getUser(Long id) { // Primary logic }

public User fallbackMethod(Long id, Exception ex) { // Fallback logic } ```

1.3 Reliability (Độ tin cậy)

  • Fault Tolerance
  • Circuit Breaker Pattern
  • Bulkhead Pattern
  • Retry Pattern java @Retry(maxAttempts = 3, backoff = @Backoff(delay = 1000)) public Response callExternalService() { // Service call logic }

2. Distributed Systems Design

2.1 Consistency Models

  • Strong Consistency java @Transactional(propagation = Propagation.REQUIRED) public void updateWithStrongConsistency() { // Transaction logic }

  • Eventual Consistency java @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void handleEventualConsistency(DomainEvent event) { // Async update logic }

2.2 Distributed Caching

@Configuration
@EnableCaching
public class DistributedCacheConfig {
    @Bean
    public CacheManager cacheManager() {
        RedisCacheManager.RedisCacheManagerBuilder builder = 
            RedisCacheManager.RedisCacheManagerBuilder
                .fromConnectionFactory(redisConnectionFactory());

        return builder
            .cacheDefaults(defaultConfig())
            .withInitialCacheConfigurations(customConfigs())
            .build();
    }

    private RedisCacheConfiguration defaultConfig() {
        return RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(10))
            .serializeKeysWith(
                RedisSerializationContext.SerializationPair.fromSerializer(
                    new StringRedisSerializer()))
            .serializeValuesWith(
                RedisSerializationContext.SerializationPair.fromSerializer(
                    new GenericJackson2JsonRedisSerializer()));
    }
}

3. Data Architecture

3.1 Database Design

  • Sharding Strategies ```java @Configuration public class ShardingConfig { @Bean public ShardingDataSource shardingDataSource() { Map dataSourceMap = new HashMap<>(); dataSourceMap.put("shard0", shard0DataSource()); dataSourceMap.put("shard1", shard1DataSource());

      ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
      // Configure sharding rules
    
      return new ShardingDataSource(dataSourceMap, shardingRuleConfig);
    

    } } ```

  • Partitioning ```sql CREATE TABLE orders ( id BIGINT, order_date DATE, customer_id BIGINT ) PARTITION BY RANGE (EXTRACT(YEAR FROM order_date));

CREATE TABLE orders_2023 PARTITION OF orders FOR VALUES FROM (2023) TO (2024); ```

3.2 Data Flow Architecture

@Configuration
public class DataFlowConfig {
    @Bean
    public StreamsBuilder streamsBuilder() {
        StreamsBuilder builder = new StreamsBuilder();

        builder.stream("input-topic")
            .groupByKey()
            .aggregate(
                () -> new Aggregate(),
                (key, value, aggregate) -> aggregate.add(value),
                Materialized.as("aggregated-store")
            )
            .toStream()
            .to("output-topic");

        return builder;
    }
}

4. Security Architecture

4.1 Authentication & Authorization

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .oauth2ResourceServer()
                .jwt()
            .and()
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .antMatchers("/api/**").authenticated()
            .and()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

4.2 Data Encryption

@Service
public class EncryptionService {
    @Value("${encryption.key}")
    private String secretKey;

    public String encrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
        SecretKey key = new SecretKeySpec(secretKey.getBytes(), "AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }
}

5. Performance Architecture

5.1 Caching Strategies

@Service
public class UserService {
    @Cacheable(
        value = "users",
        key = "#id",
        unless = "#result == null",
        cacheManager = "redisCacheManager"
    )
    public User getUser(Long id) {
        return userRepository.findById(id)
            .orElseThrow(() -> new UserNotFoundException(id));
    }

    @CacheEvict(value = "users", key = "#user.id")
    public User updateUser(User user) {
        return userRepository.save(user);
    }
}

5.2 Async Processing

@Service
public class AsyncService {
    @Async
    public CompletableFuture<Result> processAsync() {
        return CompletableFuture.supplyAsync(() -> {
            // Long running task
            return new Result();
        }).thenApply(result -> {
            // Post processing
            return result;
        }).exceptionally(ex -> {
            // Error handling
            return new Result();
        });
    }
}

6. Monitoring và Observability

6.1 Metrics Collection

@Component
public class MetricsCollector {
    private final MeterRegistry registry;

    public MetricsCollector(MeterRegistry registry) {
        this.registry = registry;
    }

    public void recordOperation(String name, long duration) {
        Timer timer = Timer.builder("app.operation")
            .tag("name", name)
            .register(registry);

        timer.record(duration, TimeUnit.MILLISECONDS);
    }
}

6.2 Distributed Tracing

@Configuration
public class TracingConfig {
    @Bean
    public Tracer jaegerTracer() {
        return new Configuration("my-service")
            .withSampler(new Configuration.SamplerConfiguration()
                .withType("const").withParam(1))
            .withReporter(new Configuration.ReporterConfiguration()
                .withLogSpans(true))
            .getTracer();
    }
}

7. Best Practices và Guidelines

7.1 Design Principles

  • SOLID Principles
  • DRY (Don't Repeat Yourself)
  • KISS (Keep It Simple, Stupid)
  • YAGNI (You Aren't Gonna Need It)

7.2 Architecture Patterns

  • Microservices Architecture
  • Event-Driven Architecture
  • Domain-Driven Design
  • Clean Architecture

7.3 Design Reviews

  • Performance Impact Analysis
  • Security Review
  • Scalability Assessment
  • Maintainability Evaluation

8. Common Pitfalls và Solutions

8.1 Performance Issues

  • N+1 Query Problem
  • Memory Leaks
  • Thread Pool Exhaustion
  • Connection Pool Saturation

8.2 Scalability Issues

  • Single Points of Failure
  • Bottlenecks
  • Data Consistency
  • Cache Coherence

9. Case Studies

9.1 E-commerce Platform

  • Microservices Architecture
  • Event-Driven Design
  • Distributed Caching
  • Search Engine Integration

9.2 Payment System

  • High Availability Design
  • Security Measures
  • Transaction Management
  • Audit Logging

10. References và Resources

  • Clean Architecture by Robert C. Martin
  • Designing Data-Intensive Applications by Martin Kleppmann
  • System Design Interview by Alex Xu
  • Microservices Patterns by Chris Richardson