Index
<-Назад

Примеры реализации архитектурных стилей

Event-Driven Architecture

Producer → [Event Bus] → Consumer

Пример на Node.js (Kafka)

// Producer
const { Kafka } = require('kafkajs');
const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092'] });
const producer = kafka.producer();

await producer.send({
  topic: 'order-created',
  messages: [{ value: JSON.stringify({ orderId: 123 })}]
});

// Consumer
const consumer = kafka.consumer({ groupId: 'notifications' });
await consumer.subscribe({ topic: 'order-created' });
await consumer.run({
  eachMessage: async ({ message }) => {
    console.log('Received:', message.value.toString());
  }
});
Когда использовать Транзакционные системы, реальные обновления данных
Сложность Высокая (требует настройки брокера сообщений)

Microservices

[API Gateway] → [Auth Service] → [Order Service] → [Payment Service]

Пример на Java (Spring Boot)

// OrderServiceApplication.java
@SpringBootApplication
@EnableDiscoveryClient
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

// OrderController.java
@RestController
@RequestMapping("/orders")
public class OrderController {
    @Autowired
    private PaymentServiceClient paymentClient;
    
    @PostMapping
    public Order createOrder(@RequestBody Order order) {
        // Взаимодействие с другим сервисом через Feign
        Payment payment = paymentClient.processPayment(order);
        return orderRepository.save(order);
    }
}
Важно: Для связи между сервисами используйте gRPC или REST с Circuit Breaker.

Serverless (AWS Lambda)

Пример обработки файлов в S3

// index.js (Lambda Function)
const AWS = require('aws-sdk');
const s3 = new AWS.S3();

exports.handler = async (event) => {
    const bucket = event.Records[0].s3.bucket.name;
    const key = event.Records[0].s3.object.key;
    
    // Обработка файла
    const data = await s3.getObject({ Bucket: bucket, Key: key }).promise();
    console.log('File content:', data.Body.toString());
    
    return { statusCode: 200 };
};
Триггеры S3 Upload, API Gateway, CloudWatch Events
Лимиты 15 мин время выполнения, 10GB RAM

CQRS + Event Sourcing

Пример на C#

// Command Handler
public class CreateOrderHandler : ICommandHandler<CreateOrderCommand>
{
    private readonly EventStore _eventStore;
    
    public async Task Handle(CreateOrderCommand command)
    {
        var events = new List<IEvent> {
            new OrderCreatedEvent(command.OrderId, command.Items)
        };
        await _eventStore.AppendEvents(events);
    }
}

// Query Service
public class OrderQueryService
{
    public Order GetOrder(Guid orderId)
    {
        // Чтение из оптимизированной для запросов БД
        return _readDatabase.Orders.Find(orderId);
    }
}
<- Архитектурные стили и инструменты