Google Cloud Pub/Sub — это полностью управляемая служба обмена сообщениями, которая позволяет отделять и масштабировать микросервисы, распределенные системы и бессерверные приложения. Он позволяет отправлять и получать сообщения между независимыми приложениями, независимо от их местоположения или языка программирования.

Pub/Sub предназначен для решения проблемы надежной асинхронной связи между службами или приложениями в распределенной системе. Он предоставляет масштабируемый, безопасный и отказоустойчивый механизм обмена сообщениями между производителями и потребителями.

Вот некоторые из ключевых проблем, которые может помочь решить Pub/Sub:

  • Разделение служб: Pub/Sub позволяет разделить различные части распределенной системы, чтобы каждая служба могла развиваться независимо, не затрагивая другие службы.
  • Услуги масштабирования: Pub/Sub может обрабатывать сообщения с высокой пропускной способностью и автоматически масштабироваться в соответствии с изменениями трафика.
  • Интеграция систем: Pub/Sub может интегрировать системы, построенные на разных языках программирования или платформах, что позволяет подключать службы независимо от стека технологий.
  • Обеспечение доставки сообщений: Pub/Sub обеспечивает надежную доставку сообщений в том порядке, в котором они были отправлены, даже в случае сбоев или сбоев в работе сети.

Чтобы использовать Google Cloud Pub/Sub, вам потребуются следующие требования:

  • Учетная запись Google Cloud и проект: Pub/Sub является частью Google Cloud Platform (GCP), поэтому для ее использования вам потребуется создать учетную запись GCP и проект.
  • Тема Pub/Sub. Тема — это именованный ресурс, на который издатели отправляют сообщения.
  • Подписка Pub/Sub: подписка — это именованный ресурс, представляющий поток сообщений из одной конкретной темы, которые должны быть доставлены подписавшемуся приложению.
  • Учетные данные для аутентификации: вам потребуется создать и настроить учетные данные для аутентификации вашего приложения, чтобы получить доступ к Pub/Sub API.
  • Клиентская библиотека Pub/Sub: вам потребуется использовать клиентскую библиотеку Pub/Sub на выбранном вами языке программирования для взаимодействия со службой Pub/Sub. Google предоставляет клиентские библиотеки для нескольких языков программирования, включая Go, Python, Java и другие.

Вот пример кода для публикации данных JSON в теме Google Pub/Sub под названием «my-topic»:

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"

    "cloud.google.com/go/pubsub"
    "google.golang.org/api/option"
)

type Message struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    ctx := context.Background()

    // Set up the Pub/Sub client
    client, err := pubsub.NewClient(ctx, "your-project-id", option.WithCredentialsFile("path/to/your/credentials.json"))
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }

    // Create the topic if it does not exist
    topicName := "my-topic"
    topic := client.Topic(topicName)
    ok, err := topic.Exists(ctx)
    if err != nil {
        log.Fatalf("Error checking if topic exists: %v", err)
    }
    if !ok {
        if _, err := client.CreateTopic(ctx, topicName); err != nil {
            log.Fatalf("Failed to create topic: %v", err)
        }
    }

    // Publish a message to the topic
    message := Message{Name: "Alice", Age: 30}
    data, err := json.Marshal(message)
    if err != nil {
        log.Fatalf("Failed to marshal message: %v", err)
    }
    result := topic.Publish(ctx, &pubsub.Message{
        Data: data,
    })
    id, err := result.Get(ctx)
    if err != nil {
        log.Fatalf("Failed to publish message: %v", err)
    }
    fmt.Printf("Published message with ID %s\n", id)
}

В этом примере мы сначала создаем клиент Pub/Sub с соответствующими учетными данными. Затем мы создаем клиент Topic для темы tests, используя метод Topic объекта Client.

Затем мы создаем структуру Message, которая представляет данные JSON, которые мы хотим опубликовать. Мы создаем экземпляр этой структуры с некоторыми данными и кодируем его как массив байтов с помощью функции json.Marshal.

Затем мы создаем объект pubsub.Message и устанавливаем его поле Data в массив байтов JSON. Мы вызываем метод Publish клиента Topic, чтобы опубликовать сообщение в теме, и распечатываем идентификатор опубликованного сообщения в консоль, как и раньше.

Вот пример реализации в Go о том, как использовать сообщения из подписки в Google Cloud Pub/Sub:

package main

import (
 "context"
 "fmt"
 "log"
 "time"

 "cloud.google.com/go/pubsub"
 "google.golang.org/api/option"
)

func main() {
 ctx := context.Background()

 // Set up the Pub/Sub client
 client, err := pubsub.NewClient(ctx, "your-project-id", option.WithCredentialsFile("path/to/your/credentials.json"))
 if err != nil {
  log.Fatalf("Failed to create client: %v", err)
 }

 // Create a subscription client for the "tests" subscription
 subscriptionName := "tests"
 sub := client.Subscription(subscriptionName)

 // Create a channel to receive messages
 msgs := make(chan *pubsub.Message)

 // Start a goroutine to receive messages
 go func() {
  ctx := context.Background()
  err := sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
   // Send the message to the channel
   msgs <- msg
  })
  if err != nil {
   log.Fatalf("Failed to receive messages: %v", err)
  }
 }()

 // Consume messages from the channel
 for msg := range msgs {
  // Process the message
  fmt.Printf("Received message with ID %s: %s\n", msg.ID, string(msg.Data))

  // Acknowledge the message
  msg.Ack()
 }
}

В этом примере кода мы создаем клиент Pub/Sub с соответствующими учетными данными. Затем мы создаем клиент Subscription для подписки tests, используя метод Subscription объекта Client.

Создаем канал для получения сообщений. В Go канал — это типизированный канал, через который вы можете отправлять и получать значения с помощью оператора канала <-. Мы используем функцию make() для создания канала, который может получать указатели на pubsub.Message объектов. * в *pubsub.Message указывает, что мы работаем с указателями на pubsub.Message объектов.

Затем мы запускаем горутину для получения сообщений, используя метод Receive клиента подписки. Горутина — это облегченный поток выполнения, которым управляет среда выполнения Go. Горутины допускают параллелизм в программах Go, что означает, что несколько задач могут выполняться одновременно в одной и той же программе. Используя отдельную горутину для вызова Receive, мы избегаем блокировки основной горутины и позволяем ей продолжать выполнение других задач.

Метод Receive принимает функцию обратного вызова, которая вызывается для каждого полученного сообщения, и мы используем эту функцию обратного вызова для отправки сообщения в канал. Поскольку метод Receive блокируется до тех пор, пока не произойдет ошибка или контекст не будет отменен, его нельзя вызвать непосредственно в основной горутине программы.

Затем мы используем сообщения из канала, используя цикл for. Цикл for с ключевым словом range будет перебирать канал до тех пор, пока канал не будет закрыт или пока контекст, в котором был создан канал, не будет отменен. В этом случае канал msgs не закрыт явно, поэтому он будет закрыт только тогда, когда горутина, которая записывает в него, остановлена.

Горутина, считывающая сообщения из подписки и отправляющая их на канал msgs, работает в фоновом режиме до тех пор, пока не произойдет ошибка или контекст не будет отменен. Пока горутина работает и отправляет сообщения в канал, цикл for будет продолжать получать и обрабатывать сообщения.

Если вы хотите выйти из цикла for после получения определенного количества сообщений, вы можете использовать переменную счетчика для отслеживания количества полученных сообщений и выйти из цикла, когда счетчик достигнет определенного значения.

Цикл for блокируется до тех пор, пока не будет получено сообщение из канала, а затем обрабатывает сообщение по желанию. В этом случае мы выводим идентификатор сообщения и данные на консоль, а затем вызываем метод Ack объекта Message, чтобы подтвердить получение сообщения.

Поскольку метод Receive выполняется в отдельной горутине, сообщения можно получать и обрабатывать одновременно с другими задачами в программе. Это обеспечивает эффективную и масштабируемую обработку сообщений из подписки Pub/Sub.

Таким образом, Google Cloud Pub/Sub — это мощная служба обмена сообщениями, которая обеспечивает надежную, масштабируемую и асинхронную связь между приложениями. Благодаря надежному API и интеграции с другими сервисами Google Cloud, Pub/Sub представляет собой гибкое и эффективное решение для обработки сообщений в распределенных системах. Используя функции параллелизма Go, такие как горутины и каналы, разработчики могут легко создавать приложения, которые могут получать сообщения из подписок Pub/Sub и обрабатывать их одновременно с другими задачами. Благодаря способности обрабатывать сложные полезные нагрузки сообщений, автоматической балансировке нагрузки и расширенным гарантиям доставки сообщений Google Cloud Pub/Sub является отличным выбором для создания высокопроизводительных и надежных приложений.

Если вы найдете эту информацию полезной, поддержите меня и следите за обновлениями.🙂