首页 > 互联资讯 > 建站教程  > 

关于phpthriftserver的信息

本文目录一览:

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的信息