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 является отличным выбором для создания высокопроизводительных и надежных приложений.
Если вы найдете эту информацию полезной, поддержите меня и следите за обновлениями.🙂