FastDFS
最近业务需要了解了一下FastDFS。
紧接是基于nginx的FastDFS第三方模块。
FastDFS存非常高效,但是取却不高效。同时nginx拥有高效的直接读取磁盘文件的能力,但是却没有FastDFS的tracker-storage的优势。
故而需要来扩展FastDFS的nginx第三方模块来丰富业务需求。比如任意剪裁图片(ImageMagick的resize)。转换音频(ffmpeg)。
不过值得注意的是,这个操作消耗的是服务器的CPU和存储。
这个过程从6月30号开始搭FastDFS环境,到7月1号下午开会明确上面的需求,到今天7月3号阅读源码尝试着修改。
虽然到现在21:13分没有成功。但是还是有很多收获。
比如安装FastDFS的时候需要配置的storage.conf, tracker.conf, 以及fastdfs-ngx模块的conf,nginx自己的启动配置conf,以上配置文件都需要一个一个地过,加深了理解。
比如ubuntu下安装nginx需要修改objs文件夹下面的Makefile,于'-llua'后面添加'-ldl',还有其他一些问题的解决,让自己面对问题不是无能为力而是明确错误的一个大致范围,逐步来确定问题。
最主要的是从大学毕业之后就很久没碰过的C代码的大量阅读。比如宏定义一些“过程”,
FDFS_SPLIT_GROUP_NAME_AND_FILENAME(file_id)
#define FDFS_SPLIT_GROUP_NAME_AND_FILENAME(file_id) \ char new_file_id[FDFS_GROUP_NAME_MAX_LEN + 128]; \ char *group_name; \ char *filename; \ char *pSeperator; \ \ snprintf(new_file_id, sizeof(new_file_id), "%s", file_id); \ pSeperator = strchr(new_file_id, FDFS_FILE_ID_SEPERATOR); \ if (pSeperator == NULL) \ { \ return EINVAL; \ } \ \ *pSeperator = '\0'; \ group_name = new_file_id; \ filename = pSeperator + 1; \
以及一些库函数的调用:
if (strncasecmp(pContext->url, "http://", 7) == 0) { p = strchr(pContext->url + 7, '/'); if (p == NULL) { logError("file: "__FILE__", line: %d, " \ "invalid url: %s", __LINE__, pContext->url); OUTPUT_HEADERS(pContext, (&response), HTTP_BADREQUEST) return HTTP_BADREQUEST; } uri_len = url_len - (p - pContext->url); url = p; } else { uri_len = url_len; url = pContext->url; }
还有就是memcpy,memcmp等的调用实例,
if (group_count == 0) { bSameGroup = (group_name_len == my_group_name_len) && \ (memcmp(file_id, my_group_name, \ group_name_len) == 0); } else { int i; bSameGroup = false; for (i=0; i<group_count; i++) { if (group_store_paths[i].group_name_len == \ group_name_len && memcmp(file_id, \ group_store_paths[i].group_name, \ group_name_len) == 0) { the_storage_port = group_store_paths[i]. \ storage_server_port; bSameGroup = true; pStorePaths = &group_store_paths[i].store_paths; break; } } }
新京报有一个微博,说是如果重新走回一条路的话,那么,首先最好是面对一个真实的自己。
我知道需要努力的地方有很多。但是容纳复杂度,循序渐进是最好的成长道路。勉励自己。又踏入服务器开发3个月了。