Какие существуют основные способы передачи идентификаторов (ID) между микросервисами

«Какие существуют основные способы передачи идентификаторов (ID) между микросервисами» — вопрос из категории Архитектура, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Передача ID между микросервисами — ключевая задача в распределенных системах. Выбор способа зависит от протокола взаимодействия и архитектурных требований.

Основные подходы:

  1. REST API — Параметры URL

    • В пути (Path Parameter): Для идентификации конкретного ресурса. GET /users/123
    • В строке запроса (Query Parameter): Для фильтрации или указания связанных сущностей. GET /orders?user_id=123
    # Пример на FastAPI
    from fastapi import FastAPI
    
    app = FastAPI()
    
    @app.get("/items/{item_id}")
    async def read_item(item_id: int):
        # item_id получен из пути
        return {"item_id": item_id}
  2. REST API / GraphQL — Тело запроса (Request Body) Используется в POST, PUT, PATCH запросах для передачи ID в составе объекта данных.

    {
      "user_id": 123,
      "product_id": 456,
      "quantity": 2
    }
  3. Брокеры сообщений (RabbitMQ, Kafka) ID передается как часть сообщения (события). Это основной способ для асинхронного взаимодействия.

    # Пример отправки с Pika (RabbitMQ)
    import json
    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='order_created')
    
    message_body = json.dumps({'order_id': 'a1b2-c3d4-e5f6', 'user_id': 123})
    
    channel.basic_publish(exchange='',
                          routing_key='order_created',
                          body=message_body)
    connection.close()
  4. gRPC ID является полем в строго типизированном сообщении, определенном в .proto файле.

    syntax = "proto3";
    
    message GetUserRequest {
      string user_id = 1;
    }
    
    service UserService {
      rpc GetUser(GetUserRequest) returns (User);
    }

Ключевые рекомендации:

  • Тип ID: Используйте UUID для публичных идентификаторов, чтобы избежать перебора и утечки информации о количестве сущностей. Внутренние ID могут быть целочисленными (int/bigint).
  • Валидация: Всегда валидируйте формат и права доступа для полученного ID на стороне принимающего сервиса.
  • Контекст: Для отслеживания запросов в распределенной системе (трассировки) используйте сквозные идентификаторы (Correlation ID), передаваемые в HTTP-заголовках (X-Request-ID) или метаданных сообщения.