Thrift调试:我的finagle服务器出现问题

时间:2016-05-25 02:41:51

标签: scala thrift thrift-protocol finagle

我有一个简单的Thrift服务器,使用finagle在scala中实现:

    import com.twitter.util.{ Await, Future }
    import com.jakiku.thriftscala.{ RealTimeDatabasePageImpressions, PageImpressions }
    import com.twitter.finagle.Thrift
    import com.twitter.finagle.thrift.ThriftServerFramedCodec
    import com.twitter.finagle.builder.{ ServerBuilder, Server }

    object ThriftServer {

      def main(args: Array[String]) {
        val server = Thrift.serveIface("localhost:9090", new RealTimeDatabasePageImpressions[Future] {
          def getByTrackIdAndDay(trackId: Int, day: Int) = {
            Future(Seq(PageImpressions.apply(123, 3, 4,  3,  2000L, 2000L)))
          }
        })
        Await.ready(server)
      }
    }

这是我的Thrift文件:

    namespace   java com.jakiku.thriftjava
    #@namespace scala com.jakiku.thriftscala

    typedef i64 long
    typedef i32 int

    struct PageImpressionsSum{
        1: required int         trackId;
        2: required int         day;
        3: required int         hour;
        4: required int         minute;
        5: required string      pageId;
        6: required long        uniqueImpressions;
        7: required long        sumImpressions;
    }

    struct PageImpressions{
        1: required int         trackId;
        2: required int         day;
        3: required int         hour;
        4: required int         minute;
        6: required long        uniqueImpressions;
        7: required long        sumImpressions;
    }

    service RealTimeDatabase_pageImpressions{
      list<PageImpressions> getByTrackIdAndDay(1:int trackId, 2:int day);
    }

    service RealTimeDatabase_pageImpressionsSum {
      list<PageImpressionsSum> getByTrackIdAndDay(1:int trackId, 2:int day);
    }

我用scrooge生成了scala thrift类。添加了thriftlib,scrooge-core,scrooge-generator等作为依赖。我还添加了scrooge sbt插件:

 addSbtPlugin("com.twitter" % "scrooge-sbt-plugin" % "4.5.0")

我用sudo sbt'run'启动了服务器。控制台的输出:

[info]运行ThriftServer Mai 25,2016 4:18:39 AM com.twitter.finagle.Init $$ anonfun $ 1申请$ mcV $ sp 信息:Finagle版本6.34.0(rev = 44f444f606b10582c2da8d5770b7879ddd961211)建于20160310-155158

此刻一切都很好看。我在nodejs中测试了服务器。不行。我还使用了thrift python测试套件。每次检查都会超时。

这是nodejs客户端:

    var thrift = require('thrift');
    var Realtime_pageImpressions = require('./gen-nodejs/RealTimeDatabase_pageImpressions.js');
    var ttypes = require('./gen-nodejs/RealTimeDatabase_types.js');


    var connection = thrift.createConnection("localhost", 9090);

    connection.on('error', function(err) {
        console.log(err);
    });

    var client = thrift.createClient(Realtime_pageImpressions, connection);

    client.getByTrackIdAndDay(123124, 4, function(err, response) {
        if (err) {
        console.error(err);
        } else {
        console.log(response);
        }
    });

我真的不知道我做错了什么。

2 个答案:

答案 0 :(得分:1)

不确定这是不是问题(特别是因为我不熟悉scrooge或finagle)但看起来你在服务器上使用的是Framed传输,而且可能不在客户端上。

查看node.js Thrift库代码,似乎TBufferedTransport是默认代码,您可能需要TFramedTransport代替。

node.js Thrift tutorial page上,它们展示了如何使用重写选项初始化连接:

var thrift = require('thrift');
var ThriftTransports = require('thrift/transport');
var ThriftProtocols = require('thrift/protocol');
var Calculator = require('./gen-nodejs/Calculator');
var ttypes = require('./gen-nodejs/tutorial_types');

transport = ThriftTransports.TBufferedTransport()
protocol = ThriftProtocols.TBinaryProtocol()

var connection = thrift.createConnection("localhost", 9090, {
  transport : transport,
  protocol : protocol
});

您可以尝试按上述方式实现node.js客户端,但用TFramedTransport替换,看看是否有帮助。

答案 1 :(得分:0)

好的,我修好了。两件事:@BCG给了我一个提示。这是TFramedTransport。但Apache Docu有点太老了。

 var ThriftTransports = require('thrift/transport');
 var ThriftProtocols = require('thrift/protocol');

thrift / transport和thrift / protocol不再存在。你只需要Thrift。我还删除了函数执行的两个括号。

    var thrift = require('thrift');
    var Int64 = require('node-int64');
    var Realtime_pageImpressions = require('./gen-nodejs/RealTimeDatabase_pageImpressions.js');
    var ttypes = require('./gen-nodejs/RealTimeDatabase_types.js');

    transport   = thrift.TFramedTransport;
    protocol    = thrift.TBinaryProtocol;

    var connection = thrift.createConnection("localhost", 9090, {
        transport : transport,
        protocol : protocol
    });

    connection.on('error', function(err) {
        console.log(err);
    });

    // Create a Calculator client with the connection
    var client = thrift.createClient(Realtime_pageImpressions, connection);

    client.getByTrackIdAndDay(123124, 4, function(err, response) {
        if (err) {
        console.error(err);
        } else {
        console.log(response);
        console.log(response[0].uniqueImpressions[0]);
        }
    });