Démarrage rapide du kit SDK pour JavaScript avec Streaming

Publiez et utilisez des messages dans le service Streaming à l'aide du kit SDK OCI pour JavaScript.

Ce démarrage rapide vous explique comment utiliser le kit SDK Oracle Cloud Infrastructure (OCI) pour TypeScript et JavaScript et Oracle Cloud Infrastructure Streaming afin de publier et d'utiliser des messages.

Pour plus d'informations sur les concepts clés et Streaming, reportez-vous à Présentation de Streaming. Pour plus d'informations sur l'utilisation des kits SDK OCI, reportez-vous aux guides SDK.

Prérequis

  1. Afin d'utiliser le kit SDK pour TypeScript et JavaScript, vous devez disposer des éléments suivants :

    • Un compte Oracle Cloud Infrastructure.
    • Un utilisateur créé dans ce compte, dans un groupe avec une stratégie qui octroie les droits d'accès requis. Cet utilisateur peut être vous-même, ou une autre personne/un autre système devant appeler l'API. Pour obtenir un exemple de configuration d'un nouvel utilisateur, d'un nouveau groupe, d'un nouveau compartiment et d'une nouvelle stratégie, reportez-vous à Ajout d'utilisateurs. Pour obtenir la liste des stratégies standard que vous pouvez utiliser, reportez-vous à Stratégies courantes.
    • Une paire de clés utilisée lors de la signature des demandes d'API, avec la clé publique téléchargée vers Oracle. Seul l'utilisateur appelant l'API doit disposer de la clé privée. Pour plus d'informations, reportez-vous à Introduction.
  2. Collectez l'adresse des messages et l'OCID d'un flux de données. Pour connaître les étapes d'obtention des détails d'un flux de données, reportez-vous à Obtention des détails d'un flux de données. Dans le cadre de ce démarrage rapide, le flux de données doit utiliser une adresse publique et laisser Oracle gérer le cryptage. Si vous n'avez pas de flux existant, reportez-vous à Création d'un flux de données et à Création d'un pool de flux de données.
  3. Node.js version 8.x ou ultérieure. Téléchargez la dernière version avec prise en charge à long terme.
  4. Visual Code Studio (recommandé) ou tout autre environnement de développement intégré (IDE).
  5. Ouvrez une invite de commande dont le chemin comporte npm, accédez au répertoire dans lequel conserver votre code pour ce démarrage rapide (wd, par exemple), puis exécutez la commande suivante afin d'installer le kit SDK OCI pour JavaScript :

    npm install oci-sdk
  6. Assurez-vous que vous disposez d'un fichier de configuration de kit SDK valide. Pour les environnements de production, vous devez utiliser l'autorisation de principal d'instance.

Production de messages

  1. Ouvrez votre éditeur favori, tel que Visual Studio Code, à partir du répertoire wd. Vous devez déjà disposer de packages oci-sdk pour JavaScript installés dans ce répertoire si les prérequis ont été respectés.
  2. Créez un fichier nommé Producer.js dans le répertoire wd avec le code suivant. Remplacez les valeurs des variables ociConfigFile, ociProfileName, ociStreamOcid et ociMessageEndpointForStream du fragment de code suivant par les valeurs applicables à votre location.

    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. A partir du répertoire wd, exécutez la commande suivante :

    node run Producer.js
  4. Afficher les derniers messages envoyés au flux de données : affichez les derniers messages envoyés au flux de données pour vérifier que la production a réussi.

Utilisation des messages

  1. Tout d'abord, assurez-vous que le flux de données dont vous souhaitez utiliser des messages en contient. Vous pouvez utiliser la console pour produire un message de test, ou vous servir du flux de données et des messages créés dans ce démarrage rapide.
  2. Ouvrez votre éditeur favori, tel que Visual Studio Code, à partir du répertoire wd. Vous devez déjà disposer des packages oci-sdk pour JavaScript installés dans ce répertoire si les prérequis ont été respectés.
  3. Créez un fichier nommé Consumer.js dans le répertoire wd avec le code suivant. Remplacez les valeurs des variables ociConfigFile, ociProfileName, ociStreamOcid et ociMessageEndpointForStream du fragment de code suivant par les valeurs applicables à votre location.

    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. A partir du répertoire wd, exécutez la commande suivante :

    node run Consumer.js
  5. Des messages semblables à celui qui suit s'affichent :

    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
    Remarque

    Si vous avez utilisé la console pour produire un message de test, la clé de chaque message est Null.