关于phpthriftserver的信息
- 建站教程
- 2024-09-26 05:04:02
本文目录一览:
thrift server timed out超时
写于2024-01-13
一、故障描述
时间是2017年的某天:
有个服务,Python+Thrift做的Server;
对应库及版本:Cython==0.23.5,thriftpy==0.3.7。
相关配置: 服务超时时间3s
线上使用Supervisor管理进程。
一直跑着没问题,有天运维同学提问题,该服务日志出现大量time out(那时候Kibana还没搭起来,日志只能在服务器上看)。日志如下:
二、排查过程
猜测:
验证:
三、沟通问题
四、收获
Thrift server比较和使用
Thrift提供了多种服务器实现。
TSimplerServer在while循环中每次接受一个连接,处理连接请求,直到客户端关闭了连接,它才会去接受一个新的连接。由于它只在一个单独的线程中以阻塞I/O的方式完成这些工作,所以它只能服务一个客户端连接,其他所有客户端在被服务器端接受之前都只能等待。其使用方法如下:
TNonblockingServer 使用非阻塞的 I/O 解决了TSimpleServer一个客户端阻塞其他所有客户端的问题。它使用了java.nio.channels.Selector,通过调用select(),它使得你阻塞在多个连接上,而不是阻塞在单一的连接上。当一或多个连接准备好被接受/读/写时,select()调用便会返回。TNonblockingServer处理这些连接的时候,要么接受它,要么从它那读数据,要么把数据写到它那里,然后再次调用select()来等待下一个可用的连接。通用这种方式,server可同时服务多个客户端,而不会出现一个客户端把其他客户端全部“饿死”的情况。
使用方法:
ThreadedSelectorServer允许你用多个线程来处理网络 I/O。它维护了两个线程池,一个用来处理网络 I/O,另一个用来进行请求的处理。使用方法:
TThreadPoolServer有一个专用的线程用来接受连接旦接受了一个连接,它就会被放入ThreadPoolExecutor中的一个 worker 线程里处理。worker 线程被绑定到特定的客户端连接上,直到它关闭。一旦连接关闭,该worker线程就又回到了线程池中。你可以配置线程池的最小、最大线程数,默认值分别是5(最小)和Integer.MAX_VALUE(最大)。使用方法:
如何设置php thrift 超时时间
最近需要用到Thrift接口,
是Facebook开发的apache开源项目,公司要用,研究了一下
所以写了个PHP调用Thrift的方法事例
以下是代码,以免以后别人再走弯路
我是在Yii框架中实现的,和原生代码应该是一样的
官方下载包里也有PHP调用Thrift的例子
?php
/**
* @author fzxa
* @create 2012/05/22
Thrift推荐职位相关接口
注:详细说明文档在 protectedcomponentsthrift推荐系统API.docx
@desc 说明Thrift接口数据格式:
EntityType接口数据格式
enum EntityType {
POSITION = 0,
RESUME = 1
}
EntityInfo接口数据格式
struct EntityInfo {
1: EntityType type,
2: string id, // 实体id
3: double rank, // rank值
4: string address, // 工作地点
5: i32 salary, // 薪水
6: string industry, // 行业类别
7: string profession, // 职业类别
8: i32 workingage, // 工作年限
9: i32 degree, // 学历
10: string time, // 过期时间或更新时间
11: mapstring,string descriptions, // 文字描述,其中key为字段名,value为字段内容
12: mapstring,i32 tags, // 技能标签
}
ResultInfo接口数据格式
struct ResultInfo {
1: EntityType type,
2: string id, // 实体id
3: i32 score, // 推荐分数,取值范围:[0, 100]
}
*/
$GLOBALS['THRIFT_ROOT'] = $_SERVER['DOCUMENT_ROOT'].'/p/protected/components/thrift';
require_once( $GLOBALS['THRIFT_ROOT'] . '/Thrift.php' );
require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php' );
require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TBufferedTransport.php' );
require_once( $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php' );
//生成的文件 RecommendService.php
require_once( $GLOBALS['THRIFT_ROOT'] . '/RecommendService.php' );
//ini_set('display_errors', E_ALL);
class ThriftInterface
{
private static $thriftHost = '*.*.*.*'; //Thrift接口服务器IP
private static $thriftPort = 8080; //Thrift端口
/**
* 建立Thrift连接
* @return boolean
*/
private static function client(){
$socket = new TSocket(self::$thriftHost, self::$thriftPort);
$socket-setSendTimeout(10000);
$socket-setRecvTimeout(20000);
$transport = new TBufferedTransport($socket);
$protocol = new TBinaryProtocol($transport);
$client = new RecommendServiceClient($protocol);
$transport-open();
$socket-setDebug(TRUE);
return $client;
}
/**
* 获取职位推荐列表ById
*
* @param Number $type 0:代表职位,1:代表简历
* @param Number $id 实体ID
* @param Array 推荐结果列表
* @example: $Recommend = ThriftInterface::getRecommendedResultById('1','1982');
*/
public static function getRecommendedResultById($type,$id){
$client = self::client();
$ResultById = $client-getRecommendedResultById($type, $id);
return $ResultById;
}
/**
* 获取推荐列表ByEntity
* @param EntityInfo $entity 职位或简历实体信息
*/
public static function getRecommendedResultByEntity($entity){
$client = self::client();
$EntityInfo = new EntityInfo();
$EntityInfo-type = (string)$entity['type'];
$EntityInfo-id = (string)$entity['id'];
$EntityInfo-rank = (float)$entity['rank'];
$EntityInfo-address = (string)$entity['address'];
$EntityInfo-salary = (int)$entity['salary'];
$EntityInfo-industry = (string)$entity['industry'];
$EntityInfo-profession = (string)$entity['profession'];
$EntityInfo-workingage = (int)$entity['workingage'];
$EntityInfo-degree = (int)$entity['degree'];
$EntityInfo-time = (string)$entity['time'];
$EntityInfo-descriptions = (array)$entity['descriptions'];
$EntityInfo-tags = (array)$entity['tags'];
$ResultByEntity = $client-getRecommendedResultByEntity($EntityInfo);
return $ResultByEntity;
}
/**
* 计算任一简历与职位的匹配分数ById
*
* @param Number $type1 0:代表职位,1:代表简历
* @param Number $id1 实体ID
* @param Number $type2 0:代表职位,1:代表简历
* @param Number $id2 实体ID
* @example Number
*/
public static function getRecommendedScoreById($type1, $id1, $type2, $id2){
$client = self::client();
$ScoreById = $client-getRecommendedScoreById($type1, $id1, $type2, $id2);
return $ScoreById;
}
/**
* 计算任一简历与职位的匹配分数ByEntity
*
* @param EntityInfo $entity 实体的所有信息
* @param EntityType $type2
* @param string $id2 实体ID2
* @return i32 简历与职位的推荐分数,取值范围:[0, 100]
*/
public static function getRecommendedScoreByEntity($entity, $type2, $id2){
$client = self::client();
$EntityInfo = new EntityInfo();
$EntityInfo-type = (string)$entity['type'];
$EntityInfo-id = (string)$entity['id'];
$EntityInfo-rank = (float)$entity['rank'];
$EntityInfo-address = (string)$entity['address'];
$EntityInfo-salary = (int)$entity['salary'];
$EntityInfo-industry = (string)$entity['industry'];
$EntityInfo-profession = (string)$entity['profession'];
$EntityInfo-workingage = (int)$entity['workingage'];
$EntityInfo-degree = (int)$entity['degree'];
$EntityInfo-time = (string)$entity['time'];
$EntityInfo-descriptions = (array)$entity['descriptions'];
$EntityInfo-tags = (array)$entity['tags'];
$ResultInfo = new ResultInfo();
$ResultInfo-type = (string)$type2['type'];
$ResultInfo-id = (string)$type2['id'];
$ResultInfo-score = (int)$type2['score'];
$ScoreByEntity = $client-getRecommendedScoreByEntity($EntityInfo, $type2, $id2);
return $ScoreByEntity;
}
}
转载
关于phpthriftserver的信息由讯客互联建站教程栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“关于phpthriftserver的信息”