Ответ
Межпроцессное взаимодействие (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, позволяющий клиентам запрашивать только те данные, которые им нужны.
- REST: Архитектурный стиль, использующий стандартные HTTP-методы (
- Очереди сообщений (Message Queues): Системы вроде NATS, RabbitMQ, Kafka. Обеспечивают асинхронное, отказоустойчивое взаимодействие между компонентами системы. Идеально подходят для событийно-ориентированной архитектуры.