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个月了。

                                        

 

posted on 2015-07-03 21:31  dotdog  阅读(407)  评论(0编辑  收藏  举报

导航