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

Publique e consuma mensagens no serviço Streaming usando o OCI SDK para JavaScript.

Este início rápido mostra como usar o OCI (Oracle Cloud Infrastructure) SDK for TypeScript e JavaScript 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 TypeScript e JavaScript, 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 Conceitos Básicos.
  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. Node.js versão 8.x ou posterior. Faça download da última versão com suporte de longo prazo (LTS).
  4. Visual Code Studio (recomendado) ou qualquer outro ambiente de desenvolvimento integrado (IDE).
  5. Abra um prompt de comando que tenha npm em seu caminho, vá para o diretório no qual você deseja manter seu código para esse início rápido (wd, por exemplo) e execute o seguinte comando para instalar o OCI SDK for JavaScript:

    npm install oci-sdk
  6. 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 wd. Você já deverá ter pacotes oci-sdk para JavaScript instalados neste diretório após ter atendido aos pré-requisitos.
  2. Crie um arquivo chamado Producer.js no diretório wd com o código a seguir. Substitua os valores das variáveis ociConfigFile, ociProfileName,ociStreamOcid e ociMessageEndpointForStream no trecho de código a seguir pelos valores aplicáveis à sua tenancy.

    const common = require("oci-common");
    const st = require("oci-streaming"); // OCI SDK package for OSS
    
    const ociConfigFile = "<config_file_path>";
    const ociProfileName = "<config_file_profile_name>";
    const ociMessageEndpointForStream = "<stream_message_endpoint>";
    const ociStreamOcid = "<stream_OCID>";
    
    // provide authentication for OCI and OSS
    const provider = new common.ConfigFileAuthenticationDetailsProvider(ociConfigFile, ociProfileName);
      
    async function main() {
      // OSS client to produce and consume messages from a Stream in OSS
      const client = new st.StreamClient({ authenticationDetailsProvider: provider });
    
      client.endpoint = ociMessageEndpointForStream;
    
      // build up a putRequest and publish some messages to the stream
      let messages = [];
      for (let i = 1; i <= 3; i++) {
        let entry = {
          key: Buffer.from("messageKey" + i).toString("base64"),
          value: Buffer.from("messageValue" + i).toString("base64")
        };
        messages.push(entry);
      }
    
      console.log("Publishing %s messages to stream %s.", messages.length, ociStreamOcid);
      const putMessageDetails = { messages: messages };
      const putMessagesRequest = {
        putMessagesDetails: putMessageDetails,
        streamId: ociStreamOcid
      };
      const putMessageResponse = await client.putMessages(putMessagesRequest);
      for (var entry of putMessageResponse.putMessagesResult.entries)
        console.log("Published messages to parition %s, offset %s", entry.partition, entry.offset);
    
    }
    
    main().catch((err) => {
      console.log("Error occurred: ", err);
    });
  3. No diretório wd, execute o seguinte comando:

    node run Producer.js
  4. 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. Abra seu editor favorito, como o Visual Studio Code, no diretório wd. Você já deverá ter os pacotes oci-sdk para JavaScript instalados neste diretório após atender aos pré-requisitos.
  3. Crie um arquivo chamado Consumer.js no diretório wd com o código a seguir. Substitua os valores das variáveis ociConfigFile, ociProfileName,ociStreamOcid e ociMessageEndpointForStream no trecho de código a seguir pelos valores aplicáveis à sua tenancy.

    const common = require("oci-common");
    const st = require("oci-streaming"); // OCI SDK package for OSS
    
    const ociConfigFile = "<config_file_path>";
    const ociProfileName = "<config_file_profile_name>";
    const ociMessageEndpointForStream = "<stream_message_endpoint>";
    const ociStreamOcid = "<stream_OCID>";
    
    // provide authentication for OCI and OSS
    const provider = new common.ConfigFileAuthenticationDetailsProvider(ociConfigFile, ociProfileName);
      
    const consumerGroupName = "exampleGroup";
    const consumerGroupInstanceName = "exampleInstance-1";
    
    async function main() {
      // OSS client to produce and consume messages from a Stream in OSS
      const client = new st.StreamClient({ authenticationDetailsProvider: provider });
      client.endpoint = ociMessageEndpointForStream;
    
      // A cursor can be created as part of a consumer group.
      // Committed offsets are managed for the group, and partitions
      // are dynamically balanced amongst consumers in the group.
      console.log("Starting a simple message loop with a group cursor");
      const groupCursor = await getCursorByGroup(client, ociStreamOcid, consumerGroupName, consumerGroupInstanceName);
      await consumerMsgLoop(client, ociStreamOcid, groupCursor);
    }
    
    main().catch((err) => {
        console.log("Error occurred: ", err);
    }); 
    
    async function consumerMsgLoop(client, streamId, initialCursor) {
        let cursor = initialCursor;
        for (var i = 0; i < 10; i++) {
          const getRequest = {
            streamId: streamId,
            cursor: cursor,
            limit: 2
          };
          const response = await client.getMessages(getRequest);
          console.log("Read %s messages.", response.items.length);
          for (var message of response.items) {
            if (message.key !== null)  {         
                console.log("%s: %s",
                Buffer.from(message.key, "base64").toString(),
                Buffer.from(message.value, "base64").toString());
            }
           else{
                console.log("Null: %s",
                    Buffer.from(message.value, "base64").toString() );
           }
          }
          // getMessages is a throttled method; clients should retrieve sufficiently large message
          // batches, as to avoid too many http requests.
          await delay(2);
          cursor = response.opcNextCursor;
        }
      }
      
    
    async function getCursorByGroup(client, streamId, groupName, instanceName) {
        console.log("Creating a cursor for group %s, instance %s.", groupName, instanceName);
        const cursorDetails = {
          groupName: groupName,
          instanceName: instanceName,
          type: st.models.CreateGroupCursorDetails.Type.TrimHorizon,
          commitOnGet: true
        };
        const createCursorRequest = {
          createGroupCursorDetails: cursorDetails,
          streamId: streamId
        };
        const response = await client.createGroupCursor(createCursorRequest);
        return response.cursor.value;
    }
    
    async function delay(s) {
        return new Promise(resolve => setTimeout(resolve, s * 1000));
    }
  4. No diretório wd, execute o seguinte comando:

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

    Starting a simple message loop with a group cursor
    Creating a cursor for group exampleGroup, instance exampleInstance-1.
    Read 1 messages.
    Null: Example Test Message 0
    Read 1 messages.
    Null: Example Test Message 0
    Read 1 messages.
    Null: Example Test Message 0
    Read 2 messages.
    Null: Example Test Message 0
    Null: Example Test Message 0
    Read 2 messages.
    Null: Example Test Message 0
    Null: Example Test Message 0
    Observação

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