内存缓存响应:"bad command line format" 在 Google Cloud Platform 上使用 node.js 具有较大的值
Memcache response: "bad command line format" on Google Cloud Platform with large values using node.js
修改找到的示例 on the Google App Engine Documentation 以存储大字符串导致响应 Error: bad command line format
通常随后的请求会遇到 Error: Server at <IP>:11211 not available
,就好像 set 函数中的某些东西短暂地使服务器离线。
在 GAE 的共享 Memcache 和专用 1GB(每秒 10,000 个 MCU/GB)中尝试 运行 没有区别。
多个 nodejs memcached 库以及大型缓冲区和 JSON 格式化值都 return 相同的错误。我的所有研究似乎都表明此错误往往来自 'key' 大于 250 个字符,但不是来自大值(因为下面的尝试远远低于 Memcache 配额和每个值 1MiB 的限制) .
这里有一个完整的 app.js 来演示:
'use strict';
var express = require('express');
var Memcached = require('memcached');
var app = express();
// The environment variables are automatically set by App Engine when running
// on GAE. When running locally, you should have a local instance of the
// memcached daemon running.
var memcachedAddr = process.env.MEMCACHE_PORT_11211_TCP_ADDR || 'localhost';
var memcachedPort = process.env.MEMCACHE_PORT_11211_TCP_PORT || '11211';
var memcached = new Memcached(memcachedAddr + ':' + memcachedPort);
app.get('/', function(req, res, next) {
memcached.get('foo', function(err, value) {
if (err) { return next(err); }
if (value) {
console.log('Exists');
return res.status(200).send('Value: ' + value);
}
var str = "";
// Make a big string
var loops = 1000;
// works with loops = 10, fails with loops = 1000
for(var i = 0; i < loops; i++){
str += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
}
memcached.set('foo', str, 60, function(err) {
if (err) { return next(err); }
console.log('Created');
return res.redirect('/');
});
});
});
var server = app.listen(process.env.PORT || 8080, '0.0.0.0', function() {
console.log('App listening at http://%s:%s', server.address().address,
server.address().port);
console.log('Press Ctrl+C to quit.');
});
可以使用 Google 云控制台表单在 Memcache 中手动设置相同的大字符串。检索值的后续调用也有效。我是否根据价值大小严重错误地计算了 MCU?
当 运行 在本地 (OSX) 时,我遇到零问题并且能够存储非常大的值。错误仅发生在已部署的代码中。非常感谢任何建议或指导。
Memcache 代理中目前存在一个错误,阻止写入超过 4kb 的值。中间有一个缓冲区正在截断混淆内存缓存服务器的数据包。目前,任何超过 4kb 的数据都应该存储在某种数据库中(cookie 也不起作用,因为 cookie 也不能存储超过 4kb)。问题解决后我会更新这个问题。
编辑:问题现在应该已修复。
修改找到的示例 on the Google App Engine Documentation 以存储大字符串导致响应 Error: bad command line format
通常随后的请求会遇到 Error: Server at <IP>:11211 not available
,就好像 set 函数中的某些东西短暂地使服务器离线。
在 GAE 的共享 Memcache 和专用 1GB(每秒 10,000 个 MCU/GB)中尝试 运行 没有区别。
多个 nodejs memcached 库以及大型缓冲区和 JSON 格式化值都 return 相同的错误。我的所有研究似乎都表明此错误往往来自 'key' 大于 250 个字符,但不是来自大值(因为下面的尝试远远低于 Memcache 配额和每个值 1MiB 的限制) .
这里有一个完整的 app.js 来演示:
'use strict';
var express = require('express');
var Memcached = require('memcached');
var app = express();
// The environment variables are automatically set by App Engine when running
// on GAE. When running locally, you should have a local instance of the
// memcached daemon running.
var memcachedAddr = process.env.MEMCACHE_PORT_11211_TCP_ADDR || 'localhost';
var memcachedPort = process.env.MEMCACHE_PORT_11211_TCP_PORT || '11211';
var memcached = new Memcached(memcachedAddr + ':' + memcachedPort);
app.get('/', function(req, res, next) {
memcached.get('foo', function(err, value) {
if (err) { return next(err); }
if (value) {
console.log('Exists');
return res.status(200).send('Value: ' + value);
}
var str = "";
// Make a big string
var loops = 1000;
// works with loops = 10, fails with loops = 1000
for(var i = 0; i < loops; i++){
str += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
}
memcached.set('foo', str, 60, function(err) {
if (err) { return next(err); }
console.log('Created');
return res.redirect('/');
});
});
});
var server = app.listen(process.env.PORT || 8080, '0.0.0.0', function() {
console.log('App listening at http://%s:%s', server.address().address,
server.address().port);
console.log('Press Ctrl+C to quit.');
});
可以使用 Google 云控制台表单在 Memcache 中手动设置相同的大字符串。检索值的后续调用也有效。我是否根据价值大小严重错误地计算了 MCU?
当 运行 在本地 (OSX) 时,我遇到零问题并且能够存储非常大的值。错误仅发生在已部署的代码中。非常感谢任何建议或指导。
Memcache 代理中目前存在一个错误,阻止写入超过 4kb 的值。中间有一个缓冲区正在截断混淆内存缓存服务器的数据包。目前,任何超过 4kb 的数据都应该存储在某种数据库中(cookie 也不起作用,因为 cookie 也不能存储超过 4kb)。问题解决后我会更新这个问题。
编辑:问题现在应该已修复。