Feed de alterações no Azure Cosmos DB para Apache Cassandra

APLICA-SE A: Cassandra

O suporte de feed de alterações no Azure Cosmos DB para Apache Cassandra está disponível por meio dos predicados de consulta na CQL (Cassandra Query Language). Usando essas condições de predicado, você pode consultar a API do feed de alterações. Os aplicativos podem obter as alterações feitas em uma tabela usando a chave primária (também conhecida como chave de partição), conforme exigido no CQL. Você pode então tomar outras ações com base nos resultados. As alterações nas linhas da tabela são capturadas na ordem de seu tempo de modificação e na ordem de classificação por chave de partição.

O exemplo a seguir mostra como obter um feed de alteração em todas as linhas em uma tabela API for Cassandra Keyspace usando .NET. O predicado COSMOS_CHANGEFEED_START_TIME() é usado diretamente no CQL para consultar itens no feed de alterações a partir de uma hora de início especificada (neste caso, datetime atual). Você pode baixar o exemplo completo, para C# aqui e para Java aqui.

Em cada iteração, as retomadas de consulta no último ponto em que as alterações foram lidas, usando o estado de paginação. Podemos ver um fluxo contínuo de novas alterações na tabela no Keyspace. Veremos alterações nas linhas inseridas ou atualizadas. Atualmente, não há suporte para operações de exclusão usando o feed de alterações na API para Cassandra.

Nota

Reutilizar um token depois de descartar uma coleção e, em seguida, recriá-lo com o mesmo nome resulta em um erro. Recomendamos que você defina o pageState como null ao criar uma nova coleção e reutilizar o nome da coleção.

    Session cassandraSession = utils.getSession();

    try {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  
        LocalDateTime now = LocalDateTime.now().minusHours(6).minusMinutes(30);  
        String query="SELECT * FROM uprofile.user where COSMOS_CHANGEFEED_START_TIME()='" 
            + dtf.format(now)+ "'";
        
        byte[] token=null; 
        System.out.println(query); 
        while(true)
        {
            SimpleStatement st=new  SimpleStatement(query);
            st.setFetchSize(100);
            if(token!=null)
                st.setPagingStateUnsafe(token);
            
            ResultSet result=cassandraSession.execute(st) ;
            token=result.getExecutionInfo().getPagingState().toBytes();
            
            for(Row row:result)
            {
                System.out.println(row.getString("user_name"));
            }
        }
    } finally {
        utils.close();
        LOGGER.info("Please delete your table after verifying the presence of the data in portal or from CQL");
    }

Para obter as alterações em uma única linha por chave primária, você pode adicionar a chave primária na consulta. O exemplo a seguir mostra como controlar alterações para a linha onde "user_id = 1"

    String query="SELECT * FROM uprofile.user where user_id=1 and COSMOS_CHANGEFEED_START_TIME()='" 
                       + dtf.format(now)+ "'";
    SimpleStatement st=new  SimpleStatement(query);

Limitações atuais

As seguintes limitações são aplicáveis ao usar o feed de alterações com a API para Cassandra:

  • Atualmente, há suporte para inserções e atualizações. A operação de exclusão ainda não é suportada. Como solução alternativa, você pode adicionar um marcador suave nas linhas que estão sendo excluídas. Por exemplo, adicione um campo na linha chamado "excluído" e defina-o como "true".
  • A última atualização é persistida como na API principal para NoSQL e as atualizações intermediárias para a entidade não estão disponíveis.

Processamento de erros

Os seguintes códigos de erro e mensagens são suportados ao usar o feed de alterações na API para Cassandra:

  • Código de erro HTTP 429 - Quando o feed de alteração é limitado à taxa, ele retorna uma página vazia.

Próximos passos