Какие способы взаимодействия между микросервисами вы знаете?

Ответ

Микросервисы взаимодействуют через два основных паттерна: синхронное и асинхронное общение.

1. Синхронное взаимодействие (HTTP/REST, gRPC)

Используется, когда требуется немедленный ответ.

  • REST/HTTP API — стандартный подход, основанный на JSON/XML. Простота, но больше накладных расходов.
    import requests
    # Запрос к сервису пользователей
    response = requests.get('http://user-service/api/v1/users/123', timeout=5)
    user_data = response.json()
  • gRPC — высокопроизводительный RPC-фреймворк от Google, использует бинарный протокол Protocol Buffers.
    // Определение сервиса в .proto-файле
    service ProductService {
    rpc GetProduct (ProductId) returns (Product);
    }

2. Асинхронное взаимодействие (Message Brokers)

Используется для декаплингования сервисов и повышения отказоустойчивости.

  • Брокеры сообщений (RabbitMQ, Apache Kafka): Сервис-отправитель публикует событие в очередь/топик, не ожидая немедленной обработки.
    from kafka import KafkaProducer
    # Сервис заказов публикует событие "заказ создан"
    producer = KafkaProducer(bootstrap_servers='kafka-broker:9092')
    producer.send('order-created', key=b'order_456', value=order_data_json)

Выбор технологии зависит от требований к задержке, надежности доставки, порядку сообщений и сложности инфраструктуры.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня творится в мире микросервисов! Два главных способа, как эти кусочки системы друг с другом общаются, аж волосы дыбом встают.

1. Синхронное общение — типа «эй, ты, ответь сейчас же, блядь!»

Используется, когда тебе срочно нужен ответ, прямо сейчас, иначе всё, пиздец, дальше работать не можешь.

  • REST/HTTP API — это как старый, проверенный дедовский способ. Всё на JSON, всё понятно, но, блядь, столько лишнего говна тащит с собой, что овердохуища накладных расходов.
    import requests
    # Тыкаемся в сервис пользователей, как слепой кот
    response = requests.get('http://user-service/api/v1/users/123', timeout=5)
    user_data = response.json() # А вдруг он там сдох и не ответит? Жопа.
  • gRPC — это уже штука посерьёзнее, от Гугла. Тут всё бинарное, быстрее, но, ёпта, надо с этими .proto файлами возиться, мозги выносит.
    // Тут ты описываешь, кто и что может делать, как в контракте
    service ProductService {
    rpc GetProduct (ProductId) returns (Product); // «Дай продукт!» — «На, получай!»
    }

2. Асинхронное общение — «кинул сообщение и пошёл по своим делам, ебать»

Идеально, чтобы сервисы не зависели друг от друга как наркоманы от дозы. Один упал — остальные даже не чихнули.

  • Брокеры сообщений (RabbitMQ, Apache Kafka): Это, блядь, центральная почта. Один сервис крикнул событие в очередь — «заказ создан, ёпта!» — и забыл. Другой подхватит, когда проснётся.
    from kafka import KafkaProducer
    # Сервис заказов, такой довольный, швыряет событие в топик
    producer = KafkaProducer(bootstrap_servers='kafka-broker:9092')
    producer.send('order-created', key=b'order_456', value=order_data_json) # Отправил и свободен!

Так что же выбрать, ёпта? А это, сука, от задачи зависит. Надо быстро и прямо сейчас — синхронно. Хочешь, чтобы система не развалилась от одного чиха и могла переварить овердохуища запросов — асинхронно с брокером. Всё просто, как три копейки, только инфраструктуру под это дело настроить — тот ещё пиздец.