`
LIMIMGJIE
  • 浏览: 171862 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于Nginx构建高并发协议解析服务[原创]

阅读更多
正文:

视频播放协议请求应用于多个业务产品,为了提供一个稳定的解析服务,当CMS、媒资、聚合平台等产品对视频信息发生的增、删、改操作时,通过监控DB服务将变化实时写入高性能简单消息队列服务,及时更新多个对外视频服务产品的视频信息更新.

1.Nginx服务通过内嵌的perl脚本动态解析URL参数.提取key信息.
perl_set $storm_key_new '
                use MIME::Base64::Perl;
                use URI::Escape;
                sub{
                        my $r = shift;//request请求对象
                        my $request_uri = $r->variable("request_uri");//提取uri
                        my $query_uri = $r->unescape($request_uri);

                        my $buffer = $query_uri;
                        if($buffer =~/&/){//判定uri中是否包含&符号
                                my @pairs = split(/&/, $buffer);//根据&符号分割数组
                                foreach $pair (@pairs)
                                {
                                        if($pair =~ /c=storm/i){//提取"c=storm"的字符串
                                                $pair =~ s/c=//g;//将"c="剔除
                                                return $pair;
                                        }
                                }
                        }
                        
                }
        ';



2.设置storm_perl的负载均衡服务
upstream storm_perl {
        server   192.168.1.87:8000 weight=1 max_fails=2 fail_timeout=30s;
        server   192.168.1.110:8000 weight=1 max_fails=2 fail_timeout=30s;
}


3.Nginx服务通过key信息查找本地是否存在对应的缓存数据,如果存在直接返回给客户端.
设置nginx开启本地缓存,并指定缓存存放位置及相关信息.
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path   /opt/data/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
proxy_cache_path  /opt/data/proxy_cache_dir  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g;

设置后端请求的header信息,缓存时间,
location / {
        #定义客户端缓存一小时        
        expires 1h;
        #后端服务请求返回的状态码为502,504,error,超时等,自动转入下个后端服务器
	proxy_next_upstream http_502 http_504 error timeout invalid_header;
        #进行缓存,使用Web缓存区cache_one
        proxy_cache cache_one;
        #对不同的HTTP状态码设置不同的缓存时间
        proxy_cache_valid  200 304 30d;
        proxy_cache_valid  404 1m;
        #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
        
        proxy_cache_key $storm_key_new;
        #设置后端服务请求的host信息
        proxy_set_header Host  $host;
        #设置客户端的真实IP地址
        proxy_set_header X-Forwarded-For  $remote_addr;
        #将请求转向upstream
        proxy_pass http://storm_perl;

        error_log  /opt/modules/nginx/logs/error.log crit;
        access_log  /opt/modules/nginx/logs/access.log main;
                }


4..Nginx服务通过内嵌的perl脚本动态读取memcache服务的数据,读取失败后,直接将请求转向后端的apache服务器
#设置memcache服务的IP和端口
set $memd 0;
set $memcached_server "127.0.0.1:11211";

location ~ .*\.(php|jsp|cgi)?
{
        perl 'sub {
                use Cache::Memcached;
                my $r = shift;
                if($r->variable("memd")){
                        my $memd = $r->variable("memd");
                }
                if(!$memd){
                        $memd = new Cache::Memcached {"servers" => [$r->variable("memcached_server")],"debug" => 0,"compress_threshold" => 10_000};
                        $r->variable("memd",$memd);
                }

                my $realkey = 0;
                $realkey = $r->variable("storm_key_new");
                my $stormbox = $memd->get($realkey);

                if($stormbox){
                        $r->send_http_header;
                        $r->print($stormbox);
                        return 200;
                }else{
                        return 404;
                }
        }';
        error_page      404 500 502 503 504 =[color=red] @get_storm;[/color]
        access_log  /opt/modules/nginx/logs/log_mm.log count;
}

当读取memcache的请求返回404时,直接转向另外一个location
location @get_storm {
        proxy_set_header Host  $host;
        proxy_set_header X-Forwarded-For  $remote_addr;
        proxy_pass http://backend_server;
        access_log  /opt/modules/nginx/logs/log_db.log count;
}





  • 大小: 282.1 KB
分享到:
评论
2 楼 LIMIMGJIE 2010-09-11  
tedeyang 写道
两个问题:
1,mysql的数据变动用什么方式进行监听的?触发器?
2,用的什么消息队列?



1。对mysql的数据变动做了一层外部的封装,所有的数据操作均通过封装代码进行调用,我们实验过mysql触发器的特性,性能很低,不是很好用,一些复杂的表级联动还需要用到存储过程,所以干脆自己写了一个外部封装代码(用的是jar调用的方式)

2.目前用的是activeMQ队列。有些性能问题,不过数据量比较小的情况下,还是满足应用的。
1 楼 tedeyang 2010-09-07  
两个问题:
1,mysql的数据变动用什么方式进行监听的?触发器?
2,用的什么消息队列?

相关推荐

Global site tag (gtag.js) - Google Analytics