我目前正在努力寻找在Golang中发布HTTP帖子时重用连接的方法.
我创建了一个像这样的传输和客户端:
// Create a new transport and HTTP client
tr := &http.Transport{}
client := &http.Client{Transport: tr}
Run Code Online (Sandbox Code Playgroud)
然后我将这个客户端指针传递给一个goroutine,它会向同一个端点发送多个帖子,如下所示:
r, err := client.Post(url, "application/json", post)
Run Code Online (Sandbox Code Playgroud)
查看netstat,这似乎导致每个帖子的新连接导致大量并发连接被打开.
在这种情况下重用连接的正确方法是什么?
我正在尝试使用MongoDb创建副本集,服务器主机名是:
hostname hostname-1 hostname-2
其中每个都有/ etc/hosts文件中详细说明的所有相关主机名(它们都是运行Ubuntu 10.04 64位)
当我在一个节点上执行rs.initiate时,一切似乎都开始好了.运行rs.status(); 说明:
{
"set" : "vega",
"date" : ISODate("2012-01-22T19:15:55Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "hostname:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"optime" : {
"t" : 1327254848000,
"i" : 1
},
"optimeDate" : ISODate("2012-01-22T17:54:08Z"),
"self" : true
}
],
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将新成员添加到副本集时,问题就出现了.我使用命令rs.add(hostname-1); 我收到以下错误:
{
"assertion" : "need most members up to reconfigure, not ok : vega-1:27017",
"assertionCode" : 13144,
"errmsg" …Run Code Online (Sandbox Code Playgroud) 我在Go中处理一个json POST,它包含一个包含64位整数的对象数组.当使用json.Unmarshal时,这些值似乎被转换为float64,这不是很有用.
body := []byte(`{"tags":[{"id":4418489049307132905},{"id":4418489049307132906}]}`)
var dat map[string]interface{}
if err := json.Unmarshal(body, &dat); err != nil {
panic(err)
}
tags := dat["tags"].([]interface{})
for i, tag := range tags {
fmt.Println("tag: ", i, " id: ", tag.(map[string]interface{})["id"].(int64))
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在json.Unmarshal的输出中保留原始的int64?
我已经实现了一个使用TCP套接字进行通信的客户端/服务器.我正在写入套接字的数据是字符串化的JSON.最初一切都按预期工作,但是,随着我提高写入速率,我最终遇到JSON解析错误,其中客户端的开头在旧的结尾处接收到新写入的开始.
这是服务器代码:
var data = {};
data.type = 'req';
data.id = 1;
data.size = 2;
var string = JSON.stringify(data);
client.write(string, callback());
Run Code Online (Sandbox Code Playgroud)
以下是我在客户端服务器上接收此代码的方式:
client.on('data', function(req) {
var data = req.toString();
try {
json = JSON.parse(data);
} catch (err) {
console.log("JSON parse error:" + err);
}
});
Run Code Online (Sandbox Code Playgroud)
随着费率的增加,我收到的错误是:
SyntaxError: Unexpected token {
Run Code Online (Sandbox Code Playgroud)
这似乎是下一个请求被标记到当前请求结尾的开始.
我试过用过; 作为每个JSON请求结束时的分隔符,然后使用:
var data = req.toString().substring(0,req.toString().indexOf(';'));
Run Code Online (Sandbox Code Playgroud)
然而,这种方法,而不是导致JSON解析错误似乎导致在客户端完全丢失一些请求,因为我增加了超过300每秒的写入速率.
是否有通过TCP套接字划分传入请求的最佳实践或更有效的方法?
谢谢!
我无法弄清楚如何处理我想在页面上运行的一些javascript函数的多个实例.它是我正在开发的自定义分析项目的一部分.
我有一个名为initData()的函数; 该函数使用setInterval调用另一个函数,该函数每1000毫秒向我的服务器发送一次ping.
问题是我希望能够在一个页面上拥有多个此函数的实例.我目前的问题是,只要调用第二个实例,它就会覆盖第一个实例中的所有变量.
什么是最好的解决方法?有没有办法使函数分离和/或私有实例,以便它们不会相互干扰?
我目前正在使用子进程,以便以非阻塞方式运行某些计算功能。
我遇到了一个问题,即我需要能够将计算结果绑定回父进程中的正确回调。例如:
var cp = require('child_process');
var n = cp.fork(__dirname + '/child.js');
exports.evaluate = function(data, callback) {
n.send({ data : data});
n.once('message', function(result) {
callback(result);
}
}
Run Code Online (Sandbox Code Playgroud)
这个例子的问题是,如果一个计算在另一个计算之前返回,那么它将不会收到正确的结果。
有什么方法可以使用自定义事件名称来代替“消息”,以确保每次调用评估函数时,都会创建一个唯一的侦听器,该侦听器在调用后将被删除?
如何通过子进程发出自定义事件?
提前致谢!
go ×2
json ×2
node.js ×2
database ×1
javascript ×1
master-slave ×1
mongodb ×1
parsing ×1
sockets ×1