c - Kubernetes 中发送消息的 TCP 套接字连接干扰
问题描述
我正在用 C 语言创建一个应用程序,用于中间和管理计划的应用程序 (NodeJs) 以将信息收集到 MongoDB 中。
这使得应用程序的可伸缩性成为可能并避免重复值。
问题
- 本地测试:OK
- 容器测试:好的
- K8s Minikube 测试:bson 解析中的计划应用程序错误
- EKS 生产测试:bson 解析中的计划应用程序错误
C 应用程序发送套接字消息的代码:
static void
ssq_connection_server_handler()
{
...
for (i = 0; i < ssq_max_sockets; i++) {
sd = ssq_connection->clients[i];
if (FD_ISSET(sd, &master)) {
if ((ret = ssq_connection->recv(sd, buffer, SSQ_SERVER_MAX_BUFFER_SIZE)) <= 0) {
continue;
}
buffer[ret] = '\0';
token = ssq_strtok(buffer, ":");
opts = ssq_strtok(NULL, ":");
limit = ssq_atoi(opts, ssq_strlen(opts));
if (limit == SSQ_ERROR) {
limit = 10;
}
if (ssq_strcmp("next", token) == 0) {
u_char *tasks;
size_t len;
tasks = ssq_mongo_collection_find(limit, ssq_mongo->collection, &len);
ssq_connection->send(sd, tasks, len);
}
}
}
...
}
static ssize_t
ssq_connection_send_handler(int fd, u_char *buf, size_t size)
{
ssize_t n;
ssq_err_t err;
for (;;) {
n = send(fd, buf, size, 0);
ssq_log_debug("send: fd:%d %z of %uz", fd, n, size);
if (n > 0) {
return n;
}
err = ssq_socket_errno;
if (n == 0) {
ssq_log_error(SSQ_LOG_ALERT, err, "send() returned zero");
return n;
}
if (err == SSQ_EAGAIN || err == SSQ_EINTR) {
ssq_log_debug_error(err, "send() not ready");
if (err == SSQ_EAGAIN) {
return SSQ_AGAIN;
}
} else {
return SSQ_ERROR;
}
}
}
NodeJs 中接收消息的代码:
const net = require('net');
const { EJSON } = require('bson');
const sock = new net.Socket();
sock.connect(process.env.SSQ_PORT || 3145, process.env.SSQ_HOST || '127.0.0.1', () => {
console.log('socket connection established');
});
sock.on('data', (data) => {
try {
const tasks = EJSON.parse(data);
console.log(tasks);
process.exit(0);
} catch (err) {
console.error(err);
process.exit(1);
}
});
sock.on('error', () => {
/* void */
});
sock.on('close', () => {
console.warn('socket connection has been closed');
});
sock.write(Buffer.from('next:10'));
我认为来自 K8s 的东西正在拦截和修改消息。
解决方案
推荐阅读
- random - 有谁知道任何基于分形几何定律的prng?
- parsing - Log Parser Studio 查询 - 最近访问的 IP 地址?
- java - 在“一对多映射”场景中对子实体的 findById 操作返回递归子实体。需要解决方案
- php - PHP:如何将变量值更改为另一个类
- css - 如何扩展绝对放置的伪元素,直到页面内容变得最好?
- d3.js - 使用 D3.js 构建平面日历
- python - 将csv中的字符串解析为字典
- javascript - TamperMonkey 可以创建书签吗?
- google-cloud-run - 如何在 Google Cloud Run 上运行 WordPress?
- python - numpy总和比字符串计数慢