Erro intermitente de consulta ao Bucket


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;


8 comentários

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


Não é esse o caso?!?

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.

@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);
});

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.

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

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.

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

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

Comente