一个奇怪的崩溃堆栈
24 Jan 2022
|
|
看tag知内容
看tag知内容 尴尬,每月总结也有todo了,todo越欠越多
这是一个redis的http代理,简单看下怎么做的
主流程就是一个libevent
server_can_accept accept worker_add_client 然后通过pipe来传给worker
创建若干个worker接受客户端连接
worker主要动作
简单说这个逻辑还是比较简单的,主要命令逻辑就是worker_process_client
这个按照http的消息类型来分类
struct worker *w = c->w;
cmd_response_t ret = CMD_PARAM_ERROR;
switch(c->parser.method) {
case HTTP_GET:
if(c->path_sz == 16 && memcmp(c->path, "/crossdomain.xml", 16) == 0) {
http_crossdomain(c);
return;
}
slog(w->s, WEBDIS_DEBUG, c->path, c->path_sz);
ret = cmd_run(c->w, c, 1+c->path, c->path_sz-1, NULL, 0);
break;
case HTTP_POST:
slog(w->s, WEBDIS_DEBUG, c->path, c->path_sz);
ret = cmd_run(c->w, c, c->body, c->body_sz, NULL, 0);
break;
case HTTP_PUT:
slog(w->s, WEBDIS_DEBUG, c->path, c->path_sz);
ret = cmd_run(c->w, c, 1+c->path, c->path_sz-1,
c->body, c->body_sz);
break;
case HTTP_OPTIONS:
http_send_options(c);
return;
default:
slog(w->s, WEBDIS_DEBUG, "405", 3);
http_send_error(c, 405, "Method Not Allowed");
return;
}
内部还要解析具体的命令来分,其实可以直接写死,直接写死就省掉发送命令解析结果的流程了
cmd_run执行中会指定Content-Type,cmd_select_format
cmd_select_format也会设置回复的回调函数
比如json_reply,raw_reply,custom_type_reply
用cmd_setup设置http response信息
这里的ACL是wedis内部的ACL控制,不是redis那侧的控制
redis只支持见到AUTH
在连接的时候就直接auth
if(p->cfg->redis_auth) { /* authenticate. */
if(p->cfg->redis_auth->use_legacy_auth) {
redisAsyncCommand(ac, pool_on_auth_complete, p, "AUTH %s",
p->cfg->redis_auth->password);
} else {
redisAsyncCommand(ac, pool_on_auth_complete, p, "AUTH %s %s",
p->cfg->redis_auth->username,
p->cfg->redis_auth->password);
}
}
http_client单独有个标记记录是不是subcribe,一直保持连接
看tag知内容 尴尬,每月总结也有todo了,todo越欠越多
[toc]
[toc]
主要关注点
看tag知内容
https://wizardforcel.gitbooks.io/gainlo-interview-guide/content/sd1.html
https://github.com/checkcheckzz/system-design-interview 有很多别的公司的博客
这本书很多段落紧凑有张理,把人刻画的很好,小邓施圆非常鲜活,主人公更不多说。这里简单摘抄几个段落