Erro intermitente de consulta ao Bucket


#1

Pessoal estou com o seguinte problema. Estou utilizando o bucket para guardar o status de minha conversa, mas o comando get as vezes falha conforme imagem anexa. A falha até então é totalmente aleatória.

Adicionei também o trecho do index.js e do module utilizado para fazer essa gravação, agradeço se puderem me ajudar nesta questão.

***** index.js *****

/* Message Receiver para plain/text */
clientManager.client.addMessageReceiver(‘text/plain’, async function (message) {

const status = await statusController.getStatus(message.from, clientManager.client);

switch (status) {
    case 0:
        var msg = {
            type: "text/plain",
            content: "Mensagem 1",
            to: message.from,
            id: Lime.Guid()
        };
        clientManager.client.sendMessage(msg);
        await statusController.setStatus(message.from, 1, clientManager.client);
        break;

**** status-controller ****

let Lime = require(“lime-js”);

var status = 0;

async function setStatus(from, pstatus, client) {

await client.sendCommand({
        'id': Lime.Guid(),
        'method': 'set',
        'uri': `/buckets/${from}?expiration=300000`,
        'type': 'application/json',
        'resource': {
            'status': pstatus
        }
    }).then(function(res) {;
        console.log(`${from} - Status setado: ` + pstatus);
    })
    .catch(function(err) {
        console.log(`${from} - Erro ao setar status: ` + err);
    });

}

async function getStatus(from, client) {

var status = 0;

await client.sendCommand({
        'id': Lime.Guid(),
        'method': 'get',
        'uri': `/buckets/${from}`
    }).then(function(resStatus) {
        status = resStatus.resource.status;
        console.log(`${from} - Status atual: ` + status);
    })
    .catch(function(err) {
        status = 999;
        console.log(`${from} -Erro ao recuperar status: ` + err);
    });
return status;

}

module.exports.getStatus = getStatus;
module.exports.setStatus = setStatus;


#2

Francisco, caso não exista nenhum document gravado para essa chave a promessa é negada.

Não é esse o caso?!?


#3

Obrigado pelo retorno Breno. Fiz chamadas em sequência setando numa iteração e na outra somente consultando, usando o await para sincronizar, mas ainda de sim, de forma intermitente ocorre falha no get.

Ainda coloquei o expiration 30000 pra ver se era isso e ainda sim tive algumas chamadas com falha. De qualquer forma vou revisar minha implementação. Mais uma vez obrigado.


#4

@Francisco_Freitas

O acesso é do BlipChat web?

Se for talvez o from venha da seguinte forma por exemplo ‘05574338-1234-34-b74b-b2c07dafce84_u.blip.ai/web’ e notei em algum lugar que se mandar com o /web junto não dá certo, tente fazer algo pra remover o /web pra ver se ajuda…

Se tiver usando JS talvez ajude

if (from.includes('/web')) {
    from = from.replace('/web', '');
} 

await client.sendCommand({
    id: Lime.Guid(),
    method: "get",
    uri: `/buckets/${from}`
})
.then( async res => {

    // res

}).catch(err => {
    console.log(err);
});

#5

Obrigado pela informação, mas estou usando o messenge do facebook. Testei aqui minha implelentação e o from é sempre o mesmo ainda assim o error ocorre. É preciso setar umas 4 ou 5 vezes e só depois disso é que o get começa a funcionar.

Acho que existe uma latência entre o set e o get. Talvez o commit ainda não tenha ocorrido mesmo após o set ter retornado sucesso.


#6

Já tentou usar um setTimeout() com uns 2 segundos pra dar o tempo de gravar?

  1. Você grava
  2. SetTimeout 2 segundos
  3. Faz a consulta ao Bucket

#7

Obrigado pelo retorno Odirlei, o problema [e quando a aplicacao escalar e os dois segundos na forem suficientes. Ajustei meu codigo, antes eu colocava a funcao num arquivo separado usando module.exports. Alterei a implementacao paraque aconsulta do status acontecesse no chamando na mesma funcao do receiver.

Na teoria chamando em module exports ou dentro da funcao deveria dar o mesmo resultado, mas em meus testes o comportamento varia.


#8

Francisco, no final o comportamento continuou variando ou você encontrou uma forma de contornar o problema?


#9

Tirei as functions do module.exports e deixei no index.js mesmo e parou de dar o erro.

Mas eu gostaria de modularizar melhor, depois qaundo for refatorar vou tentar modularizar novamente para ver se o comprotamento persiste.

Obrigado pelo retorno