SDK para Início Rápido de Streaming do Go

Publique e consuma mensagens no serviço Streaming usando o OCI SDK for Go.

Esse início rápido mostra como usar o OCI (Oracle Cloud Infrastructure) SDK for Go e o Oracle Cloud Infrastructure Streaming para publicar e consumir mensagens.

Para obter os principais conceitos e mais detalhes do Streaming, consulte Visão Geral do Streaming. Para obter mais informações sobre como usar os SDKs do OCI, consulte os Guias SDK.

Pré-requisitos

  1. Para usar o SDK para Go, você deve ter o seguinte:

    • Uma conta do Oracle Cloud Infrastructure.
    • Um usuário criado nessa conta, em um grupo com uma política que conceda as permissões necessárias. Esse usuário pode ser você mesmo ou outra pessoa/sistema que precise chamar a API. Para obter um exemplo de como configurar um novo usuário, um novo grupo, um novo compartimento e uma nova política, consulte Adicionando Usuários. Para obter uma lista de políticas típicas que você pode usar, consulte Políticas Comuns.
    • Um par de chaves usado para assinar solicitações de API, com a chave pública carregada por upload no sistema Oracle. Somente o usuário que chama a API deve possuir a chave privada. Para obter mais informações, consulte o arquivo de configuração do SDK.
  2. Colete o ponto final e o OCID das Mensagens de um stream. Para obter etapas para obter detalhes de um stream, consulte Obtendo Detalhes de um Stream. Para os fins deste início rápido, o stream deve usar um ponto final público e permitir que a Oracle gerencie a criptografia. Consulte Criando um Stream e Criando um Pool de Streams se você não tiver um stream existente.
  3. Go instalado localmente. Siga estas instruções, se necessário. Certifique-se de que go esteja em seu PATH.
  4. Visual Studio Code (recomendado) ou qualquer outro ambiente de desenvolvimento integrado (IDE) ou editor de texto.

  5. Verifique se você tem um arquivo de configuração do SDK válido. Para ambientes de produção, você deve usar a autorização do controlador de instâncias.

Produzindo Mensagens

  1. Abra seu editor favorito, como o Visual Studio Code, no diretório de trabalho vazio wd.
  2. Crie um arquivo chamado Producer.go neste diretório.
  3. Adicione o código a seguir a Producer.go. Substitua os valores das variáveis ociConfigFilePath, ociProfileName,ociStreamOcid e ociMessageEndpoint no trecho de código a seguir pelos valores aplicáveis à sua tenancy.

    package main
    
    import (
    	"context"
    	"fmt"
    	"strconv"
    
    	"github.com/oracle/oci-go-sdk/v36/common"
    	"github.com/oracle/oci-go-sdk/v36/example/helpers"
    	"github.com/oracle/oci-go-sdk/v36/streaming"
    )
    
    const ociMessageEndpoint = "<stream_message_endpoint>"
    const ociStreamOcid = "<stream_OCID>"
    const ociConfigFilePath = "<config_file_path>"
    const ociProfileName = "<config_file_profile_name>"
    
    func main() {
    	fmt.Println("Go oci oss sdk example producer")
    	putMsgInStream(ociMessageEndpoint, ociStreamOcid)
    }
    
    func putMsgInStream(streamEndpoint string, streamOcid string) {
    	fmt.Println("Stream endpoint for put msg api is: " + streamEndpoint)
    
    	provider, err := common.ConfigurationProviderFromFileWithProfile(ociConfigFilePath, ociProfileName, "")
    	helpers.FatalIfError(err)
    
    	streamClient, err := streaming.NewStreamClientWithConfigurationProvider(provider, streamEndpoint)
    	helpers.FatalIfError(err)
    
    	// Create a request and dependent object(s).
    	for i := 0; i < 5; i++ {
    		putMsgReq := streaming.PutMessagesRequest{StreamId: common.String(streamOcid),
    			PutMessagesDetails: streaming.PutMessagesDetails{
    				// we are batching 2 messages for each Put Request
    				Messages: []streaming.PutMessagesDetailsEntry{
    					{Key: []byte("key dummy-0-" + strconv.Itoa(i)),
    						Value: []byte("value dummy-" + strconv.Itoa(i))},
    					{Key: []byte("key dummy-1-" + strconv.Itoa(i)),
    						Value: []byte("value dummy-" + strconv.Itoa(i))}}},
    		}
    
    		// Send the request using the service client
    		putMsgResp, err := streamClient.PutMessages(context.Background(), putMsgReq)
    		helpers.FatalIfError(err)
    
    		// Retrieve value from the response.
    		fmt.Println(putMsgResp)
    	}
    
    }
  4. Salve Producer.go.
  5. Abra o terminal e cd no diretório wd, e execute os seguintes comandos, em ordem:

    1. Esse comando cria o arquivo go.mod no diretório wd:

      go mod init oss_producer_example/v0
    2. Esse comando instala o OCI SDK for Go e para o serviço Streaming:

      go mod tidy
    3. Esse comando executa o exemplo:

      go run Producer.go
  6. Mostrar as mensagens mais recentes enviadas ao stream para ver as mensagens mais recentes enviadas ao stream para verificar se a produção foi bem-sucedida.

Consumindo Mensagens

  1. Primeiro, certifique-se de que o stream cujas mensagens você deseja consumir contenha mensagens. Você pode usar a Console para produzir uma mensagem de teste ou usar o stream e as mensagens que criamos neste início rápido.
  2. Adicione o código a seguir a Consumer.go. Substitua os valores das variáveis ociConfigFilePath, ociProfileName,ociStreamOcid e ociMessageEndpoint no trecho de código a seguir pelos valores aplicáveis à sua tenancy.

    package main
    
    import (
    	"context"
    	"fmt"
    
    	"github.com/oracle/oci-go-sdk/v36/common"
    	"github.com/oracle/oci-go-sdk/v36/example/helpers"
    	"github.com/oracle/oci-go-sdk/v36/streaming"
    )
    
    const ociMessageEndpoint = "<stream_message_endpoint>"
    const ociStreamOcid = "<stream_OCID>"
    const ociConfigFilePath = "<config_file_path>"
    const ociProfileName = "<config_file_profile_name>"
    
    func main() {
    	fmt.Println("Go oci oss sdk example for consumer")
    	getMsgWithGroupCursor(ociMessageEndpoint, ociStreamOcid)
    }
    
    func getMsgWithGroupCursor(streamEndpoint string, streamOcid string) {
    	client, err := streaming.NewStreamClientWithConfigurationProvider(common.DefaultConfigProvider(), streamEndpoint)
    	helpers.FatalIfError(err)
    
    	grpCursorCreateReq0 := streaming.CreateGroupCursorRequest{
    		StreamId: common.String(streamOcid),
    		CreateGroupCursorDetails: streaming.CreateGroupCursorDetails{Type: streaming.CreateGroupCursorDetailsTypeTrimHorizon,
    			CommitOnGet:  common.Bool(true),
    			GroupName:    common.String("Go-groupname-0"),
    			InstanceName: common.String("Go-groupname-0-instancename-0"),
    			TimeoutInMs:  common.Int(1000),
    		}}
    
    	// Send the request using the service client
    	grpCursorResp0, err := client.CreateGroupCursor(context.Background(), grpCursorCreateReq0)
    	helpers.FatalIfError(err)
    	// Retrieve value from the response.
    	fmt.Println(grpCursorResp0)
    
    	simpleGetMsgLoop(client, streamOcid, *grpCursorResp0.Value)
    }
    
    func simpleGetMsgLoop(streamClient streaming.StreamClient, streamOcid string, cursorValue string) {
    
    	for i := 0; i < 5; i++ {
    		getMsgReq := streaming.GetMessagesRequest{Limit: common.Int(3),
    			StreamId: common.String(streamOcid),
    			Cursor:   common.String(cursorValue)}
    
    		// Send the request using the service client
    		getMsgResp, err := streamClient.GetMessages(context.Background(), getMsgReq)
    		helpers.FatalIfError(err)
    
    		// Retrieve value from the response.
    		if len(getMsgResp.Items) > 0 {
    			fmt.Println("Key : " + string(getMsgResp.Items[0].Key) + ", value : " + string(getMsgResp.Items[0].Value) + ", Partition " + *getMsgResp.Items[0].Partition)
    		}
    		if len(getMsgResp.Items) > 1 {
    			fmt.Println("Key : " + string(getMsgResp.Items[1].Key) + ", value : " + string(getMsgResp.Items[1].Value) + ", Partition " + *getMsgResp.Items[1].Partition)
    		}
    		cursorValue = *getMsgResp.OpcNextCursor
    
    	}
    }
  3. Salve Consumer.go.
  4. Abra o terminal e cd no diretório wd, e execute os seguintes comandos, em ordem:

    1. Esse comando cria o arquivo go.mod no diretório wd:

      go mod init oss_consumer_example/v0
    2. Esse comando instala o OCI SDK for Go e para o serviço Streaming:

      go mod tidy
    3. Esse comando executa o exemplo:

      go run Consumer.go
  5. Você deverá ver mensagens semelhantes a esta:

    Go oci oss sdk example for consumer
    { RawResponse={200 OK 200 HTTP/1.1 1 1 map[Access-Control-Allow-Credentials:[true] ... }
    Key : , value : Example Test Message 0, Partition 0
    Key : , value : Example Test Message 0, Partition 0
    Key : , value : Example Test Message 0, Partition 0
    Key : , value : Example Test Message 0, Partition 0
    Key : , value : Example Test Message 0, Partition 0
    Observação

    Se você usou a Console para produzir uma mensagem de teste, a chave de cada mensagem será Null