Итак, у меня есть значения, которые необходимо обновить в моем хранилище данных. Я использую транзакцию, как показано ниже. После того, как обновление было совершено, я отправляю результат обратно клиенту, давая им знать, что обновление прошло. Затем клиент отправляет другой запрос для обновленного списка элементов. Насколько мне известно, весь код выполняется правильно, никаких ошибок не было, и в итоге я получаю требуемое обновление, как и ожидалось.Google App Engine Datastore, возвращаясь до его обновления в течение нескольких секунд
Моя проблема даже после совершения иногда иногда занимает несколько секунд, прежде чем обновление отобразится в возвращенном списке. Если бы это была просто задержка, которая была бы дрянной, но это хуже, чем это. Список возвращает неправильные/не обновленные значения в течение этого периода времени. Я понимаю, что с этой архитектурой могут возникнуть задержки, но я думал, что вся транзакция была такой, что если бы что-то было обновлено, как ничто не могло бы прочитать старое значение после того, как транзакция захватила нужный элемент? Чтобы увидеть старое значение в течение долгого, долгого времени, кажется неправильным. Гораздо меньше ожидания, пока транзакция не сообщит, что она была совершена, и имеет весь 300 мс + RTT и все еще получает плохие значения в течение нескольких секунд после того, как это якобы было совершено. Что мне здесь не хватает?
/*
We don't actually delete a post, we simply replace it with a [removed]
version of itself.
*/
router.delete('/', function (req, res) {
//Check our parameters
if (req.body == null || req.body["Thread"] == null || typeof req.body["Thread"] !== "string") {
res.json({ success: false, message: "Thread name was not included as a parameter.", data: null});
return;
}
if (req.body == null || req.body["PostNumber"] == null) {
res.json({ success: false, message: "Post Number was not included as a parameter.", data: null });
return;
}
if ((parseInt(req.body["PostNumber"]) || 0) < 1) {
res.json({ success: false, message: "Post Number was not a valid numeric value.", data: null });
return;
}
var transaction = datastore.transaction();
transaction.get(datastore.key(['Post', PostName(req.body["Thread"], 6, parseInt(req.body["PostNumber"]))]), function (err, value) {
if (err)
{
res.json({ success: false, message: "Transaction failed.", data: null });
return;
}
if (value === null)
{
res.json({ success: false, message: "Post and thread combination does not exist.", data: null });
return;
}
value.data.CreatorName = "[removed]";
value.data.CreatorFooter = "";
value.data.Contents = "[removed]";
transaction.save(value);
transaction.commit(function (err) {
if (err)
{
res.json({ success: false, message: "Transaction failed.", data: null });
}
else
{
res.json({ success: true, message: "Erased post information from table", data: null });
}
});
});
});
Это очень раздражает, если вы не знаете, как это преодолеть. Возможно, эти документы помогают. https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/ - https://dzone.com/articles/better-explaining-cap -теореме –