У нас идет основная служба. Он может принимать запросы и обрабатывать их. Обработка некоторых запросов, в зависимости от того, как вы их спроектируете, может занять много времени. Обычно для подобных длительных задач мы оставляем их за кулисами, и над ними работает кто-то другой. В начале мы возвращаем подтверждение пользователям, обещая, что результат в конечном итоге придет.

Сейчас мы имеем дело с асинхронными задачами, важной темой для веб-сервиса (или любого другого).

Хотя go предлагает горутину для асинхронных процессов, мы хотим изолировать основной сервис от этих асинхронных задач. Эти задачи могут даже выполняться на отдельном сервере, поэтому нам не нужно выделять оборудование для рабочих. Для этого нам понадобится какая-то очередь для размещения этих задач. С другой стороны, нам нужны слушатели/потребители, чтобы переваривать эти задачи.

Одной из часто используемых очередей является RabbitMQ. Я не буду здесь вдаваться в плюсы и минусы использования RabbitMQ. Мы просто хотим знать, как подключиться к экземпляру RMQ.

Кроме того, мы предполагаем, что у нас уже настроен RabbitMQ, работающий на localhost:5672.

Сначала нам нужно получить пакет rabbitmq для Go. Я использую официальный пакет (https://github.com/rabbitmq/amqp091-go).

Подобно тому, как мы создаем эти репозитории, мы хотим иметь экземпляр для RMQ вместе с методом для его запуска.

package rabbitmq

import {
  amqp "github.com/rabbitmq/ampq091-go"
}

// some basic attributes for an MQ instance
type RabbitMQInstance struct {
  name stirng
  connection *amqp.Connection
  channel *amqp.Channel
  isConnected bool
  done chan error
  exchange string
  routingKey string
}

func InitiateRabbit(exchange string, routingKey string) (*RabbitMQInstance, error) {
  var rmqInstance RabbitMQInstance
  // these should be in some sort of config instead of hardcoded here.
  // For the sake of simplicity (and the fact that I'm not really connecting to RMQ), I'll just define them here
  username := "rmquser"
  password := "rmqpassword"
  port := 6379
  vertualHost := "vh"
  conn, err := amqp.Dial(fmt.Sprintf("amqp://%s:%s@%s:%s/%s", username, password, port, vertualHost)
  if err != nil {
    return nil, err
  }
  channelRMQ, err :=…