Ответ
Передача ID между микросервисами — ключевая задача в распределенных системах. Выбор способа зависит от протокола взаимодействия и архитектурных требований.
Основные подходы:
-
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} - В пути (Path Parameter): Для идентификации конкретного ресурса.
-
REST API / GraphQL — Тело запроса (Request Body) Используется в
POST,PUT,PATCHзапросах для передачи ID в составе объекта данных.{ "user_id": 123, "product_id": 456, "quantity": 2 } -
Брокеры сообщений (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() -
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) или метаданных сообщения.