清除或者读写多机房缓存
遇到一个问题(多机房,每个机房的缓存在不同的memcache服务器组):
1 我们有几个机房,每个机房的mc都不一样,我想提前给接口预热(在用户访问前加上缓存),前端肯定用到了负载均衡。如果我从后端机器上直接请求接口的话,只会落到某个机房的一台服务器上去。其他机房的数据不会变化
2 我不想读mc的配置,因为这个接口可能的实现里面本身需要去处理一些逻辑,读写几个mc的key,mc的key本书设计的不合理还内嵌在代码里面,比较繁琐。
我们可以使用http协议的特性。当然不限于php,其他语言也可以这么干。
我的流程:
1 通过ip访问接口 http://192.168.1.12/api http://111.123.13.12/api
2 在头部加上你需要反问的接口的域名 Host:i.api.com
具体的代码
function get($url, array $get = array(), array $options = array()) {
$defaults = array(
CURLOPT_URL => $url . (strpos($url, '?') === FALSE ? '?' : '') . http_build_query($get, '', '&'),
CURLOPT_TIMEOUT => 20,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => TRUE,
);
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$id = trim($argv[1]);
$cleanFunction = "api";
$params = array("page_id"=>$id);
$res2 = get('192.168.1.12/'.$cleanFunction,$params,array(CURLOPT_HTTPHEADER => array('Host:i.api.com')) );
$res3 = get('111.123.13.12/'.$cleanFunction,$params,array(CURLOPT_HTTPHEADER => array('Host:i.api.com')) );
原理:
我的请求会先打到这台服务器,在根据host访问对应的虚拟主机
虚拟主机
是在网络服务器上划分出一定的磁盘空间供用户放置站点、应用组件等,提供必要的站点功能与数据存放、传输功能。
虚拟主机的实现原理
虚拟主机是用同一个WEB服务器,为不同域名网站提供服务的技术。Apache、Tomcat等均可通过配置实现这个功能。
相关的HTTP消息头:Host。
例如:Host: www.baidu.com
客户端发送HTTP请求的时候,会携带Host头,Host头记录的是客户端输入的域名。
这样服务器可以根据Host头确认客户要访问的是哪一个域名。
推荐一篇关于http的文字写得很清晰http详解