Расскажите о способах межпроцессного взаимодействия (IPC). Какие из них и для каких задач используются в Go?

Ответ

Межпроцессное взаимодействие (IPC) — это набор механизмов, позволяющих процессам обмениваться данными и синхронизировать свои действия. В контексте Go и бэкенда их можно разделить на несколько категорий.

1. Взаимодействие в рамках одного приложения (между горутинами)

Хотя это не является IPC в строгом смысле (т.к. происходит внутри одного процесса), это ключевой аспект конкурентности в Go.

  • Каналы (Channels): Идиоматичный и безопасный способ общения между горутинами. Реализует принцип "не общайтесь через разделяемую память; разделяйте память через общение".

2. Взаимодействие между процессами на одной машине

  • Unix-сокеты (Unix Domain Sockets): Работают как TCP-сокеты, но используют файловую систему вместо сетевого стека. Более быстрые и безопасные для локального IPC.
  • Пайпы (Pipes):
    • Анонимные (os.Pipe): Однонаправленный канал данных между родительским и дочерним процессами.
    • Именованные (FIFO): Позволяют общаться несвязанным процессам через специальный файл в файловой системе.
  • Разделяемая память (Shared Memory): Самый быстрый способ, так как процессы работают с одной и той же областью памяти. Требует сложной ручной синхронизации (например, с помощью мьютексов). В Go реализуется через системные вызовы (mmap).
  • Сигналы (Signals): Простой способ отправки уведомлений процессам (например, syscall.SIGTERM, syscall.SIGINT). Не подходят для передачи данных.

3. Взаимодействие между процессами по сети (распределенные системы)

Это наиболее частый сценарий в бэкенд-разработке.

  • TCP/UDP сокеты (net): Фундаментальный механизм для любого сетевого взаимодействия. TCP обеспечивает надежную доставку с установкой соединения, UDP — быструю доставку датаграмм без гарантий.
  • RPC (Remote Procedure Call):
    • net/rpc: Встроенный в стандартную библиотеку пакет для создания простых RPC-сервисов.
    • gRPC: Современный высокопроизводительный фреймворк от Google. Использует HTTP/2, Protocol Buffers для сериализации и поддерживает стриминг. Де-факто стандарт для коммуникации между микросервисами в Go.
  • Веб-сервисы (HTTP API):
    • REST: Архитектурный стиль, использующий стандартные HTTP-методы (GET, POST, PUT, DELETE) для взаимодействия с ресурсами. Очень распространен.
    • GraphQL: Язык запросов для API, позволяющий клиентам запрашивать только те данные, которые им нужны.
  • Очереди сообщений (Message Queues): Системы вроде NATS, RabbitMQ, Kafka. Обеспечивают асинхронное, отказоустойчивое взаимодействие между компонентами системы. Идеально подходят для событийно-ориентированной архитектуры.