Pubblicare messaggi per argomenti

Questo documento fornisce informazioni sulla pubblicazione dei messaggi.

Un'applicazione publisher crea e invia messaggi a un argomento. Pub/Sub offre la consegna "at-least-once" dei messaggi e l'ordinamento con il massimo impegno ai sottoscrittori esistenti.

Il flusso generale per una richiesta di publisher è il seguente:

  1. Crea un messaggio contenente i tuoi dati.
  2. Invia una richiesta al server Pub/Sub per pubblicare il messaggio nell'argomento specificato.

Prima di iniziare

Prima di configurare il flusso di lavoro di pubblicazione, assicurati di aver completato le seguenti attività:

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per pubblicare messaggi in un argomento, chiedi all'amministratore di concederti il ruolo IAM Pub/Sub Publisher (roles/pubsub.publisher) nell'argomento. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Devi disporre di autorizzazioni aggiuntive per creare o aggiornare argomenti e abbonamenti.

Formato del messaggio

Un messaggio è composto da campi con i dati e i metadati del messaggio. Specifica almeno uno dei seguenti elementi nel messaggio:

Il servizio Pub/Sub aggiunge i seguenti campi al messaggio:

  • Un ID messaggio univoco per l'argomento
  • Un timestamp di ricezione del messaggio da parte del servizio Pub/Sub

Per saperne di più sui messaggi, consulta Formato dei messaggi.

pubblica dei messaggi

Puoi pubblicare messaggi con la console Google Cloud , Google Cloud CLI, l'API Pub/Sub e le librerie client. Le librerie client possono pubblicare i messaggi in modo asincrono.

Gli esempi riportati di seguito mostrano come pubblicare un messaggio in un argomento.

Console

Per pubblicare un messaggio:

  1. Nella console Google Cloud , vai alla pagina Argomenti Pub/Sub.

    Vai alla pagina degli argomenti Pub/Sub

  2. Fai clic sull'ID argomento.

  3. Nella pagina Dettagli dell'argomento, in Messaggi, fai clic su Pubblica messaggio.

  4. Nel campo Corpo del messaggio, inserisci i dati del messaggio.

  5. Fai clic su Pubblica.

gcloud

Per pubblicare un messaggio, utilizza il comando gcloud pubsub topics publish:

gcloud pubsub topics publish TOPIC_ID \
  --message=MESSAGE_DATA \
  [--attribute=KEY="VALUE",...]

Sostituisci quanto segue:

  • TOPIC_ID: l'ID dell'argomento
  • MESSAGE_DATA: una stringa con i dati del messaggio
  • KEY: la chiave di un attributo del messaggio
  • VALUE: il valore della chiave dell'attributo del messaggio

REST

Per pubblicare un messaggio, invia una richiesta POST come la seguente:

POST  https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID:publish
Content-Type: application/json
Authorization: Bearer $(gcloud auth application-default print-access-token)

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto del progetto con l'argomento
  • TOPIC_ID: l'ID dell'argomento

Specifica i seguenti campi nel corpo della richiesta:

{
  "messages": [
    {
      "attributes": {
        "KEY": "VALUE",
        ...
      },
      "data": "MESSAGE_DATA",
    }
  ]
}

Sostituisci quanto segue:

  • KEY: la chiave di un attributo del messaggio
  • VALUE: il valore della chiave dell'attributo del messaggio
  • MESSAGE_DATA: una stringa codificata in base64 con i dati del messaggio

Il messaggio deve contenere un campo dati non vuoto o almeno un attributo.

Se la richiesta riesce, la risposta è un oggetto JSON con l'ID messaggio. Il seguente esempio è una risposta con un ID messaggio:

{
  "messageIds": [
    "19916711285",
  ]
}

C++

Prima di provare questo esempio, segui le istruzioni di configurazione di C++ nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub C++.

namespace pubsub = ::google::cloud::pubsub;
using ::google::cloud::future;
using ::google::cloud::StatusOr;
[](pubsub::Publisher publisher) {
  auto message_id = publisher.Publish(
      pubsub::MessageBuilder{}.SetData("Hello World!").Build());
  auto done = message_id.then([](future<StatusOr<std::string>> f) {
    auto id = f.get();
    if (!id) throw std::move(id).status();
    std::cout << "Hello World! published with id=" << *id << "\n";
  });
  // Block until the message is published
  done.get();
}

C#

Prima di provare questo esempio, segui le istruzioni di configurazione di C# nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub C#.


using Google.Cloud.PubSub.V1;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

public class PublishMessagesAsyncSample
{
    public async Task<int> PublishMessagesAsync(string projectId, string topicId, IEnumerable<string> messageTexts)
    {
        TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
        PublisherClient publisher = await PublisherClient.CreateAsync(topicName);

        int publishedMessageCount = 0;
        var publishTasks = messageTexts.Select(async text =>
        {
            try
            {
                string message = await publisher.PublishAsync(text);
                Console.WriteLine($"Published message {message}");
                Interlocked.Increment(ref publishedMessageCount);
            }
            catch (Exception exception)
            {
                Console.WriteLine($"An error occurred when publishing message {text}: {exception.Message}");
            }
        });
        await Task.WhenAll(publishTasks);
        // PublisherClient instance should be shutdown after use.
        // The TimeSpan specifies for how long to attempt to publish locally queued messages.
        await publisher.ShutdownAsync(TimeSpan.FromSeconds(15));
        return publishedMessageCount;
    }
}

Vai

L'esempio seguente utilizza la versione principale della libreria client Go Pub/Sub (v2). Se utilizzi ancora la libreria v1, consulta la guida alla migrazione alla v2. Per visualizzare un elenco di esempi di codice della versione 1, consulta gli esempi di codice deprecati.

Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Pub/Sub Go.

import (
	"context"
	"fmt"
	"io"
	"strconv"
	"sync"
	"sync/atomic"

	"cloud.google.com/go/pubsub/v2"
)

func publishThatScales(w io.Writer, projectID, topicID string, n int) error {
	// projectID := "my-project-id"
	// topicID := "my-topic"
	ctx := context.Background()
	client, err := pubsub.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %w", err)
	}
	defer client.Close()

	var wg sync.WaitGroup
	var totalErrors uint64

	// client.Publisher can be passed a topic ID (e.g. "my-topic") or
	// a fully qualified name (e.g. "projects/my-project/topics/my-topic").
	// If a topic ID is provided, the project ID from the client is used.
	// Reuse this publisher for all publish calls to send messages in batches.
	publisher := client.Publisher(topicID)

	for i := 0; i < n; i++ {
		result := publisher.Publish(ctx, &pubsub.Message{
			Data: []byte("Message " + strconv.Itoa(i)),
		})

		wg.Add(1)
		go func(i int, res *pubsub.PublishResult) {
			defer wg.Done()
			// The Get method blocks until a server-generated ID or
			// an error is returned for the published message.
			id, err := res.Get(ctx)
			if err != nil {
				// Error handling code can be added here.
				fmt.Fprintf(w, "Failed to publish: %v", err)
				atomic.AddUint64(&totalErrors, 1)
				return
			}
			fmt.Fprintf(w, "Published message %d; msg ID: %v\n", i, id)
		}(i, result)
	}

	wg.Wait()

	if totalErrors > 0 {
		return fmt.Errorf("%d of %d messages did not publish successfully", totalErrors, n)
	}
	return nil
}

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella guida rapida all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Java di Pub/Sub.


import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.rpc.ApiException;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.PubsubMessage;
import com.google.pubsub.v1.TopicName;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import