Thrift非阻塞服务器c#

时间:2015-02-23 21:49:30

标签: c# multithreading tcp thrift

最近我们用Apache Thrift取代了我们的内部消息库。在我们的设置中,我们有几个c#服务和几个连接到它们的c ++'客户'。在开始时,我们使用 TThreadPoolServer 来实现服务器。

_server = new TThreadPoolServer(processor, serverTransport);

因为它运作良好,我们也更换了我们的最后一台服务器。此服务器需要与400多个客户端通信。我们看到的问题是,一旦客户端号码100连接我们的服务器就停止接受新连接,它甚至没有调用c#定时器。在第一批客户断开连接之前,似乎有点窒息。

通过阅读此SO Large number of simulteneous connections in thrift,我们决定更改为 TThreadedServer 并将最大线程数增加到500,我们有一个可行的解决方案。

_server = new TThreadedServer(processor
    , serverTransport
    , new TTransportFactory()
    , new TTransportFactory()
    , new TBinaryProtocol.Factory()
    , new TBinaryProtocol.Factory()
    , 500
    , DebugLogThriftServer);

我还想拥有 TNonblockingServer ,因为它在Thrift c ++库中实现了。我想知道是否有人已经为c#写了一个。

1 个答案:

答案 0 :(得分:0)

这是一个使用标准thrift协议的RPC框架,它与使用thrift IDL定义服务的效果相同,也就是说,thrify可以与使用thrift IDL的代码兼容,这对于交叉非常有帮助-platform。

[ThriftStruct]
public class LogEntry
{

    [ThriftConstructor]
    public LogEntry([ThriftField(1)]String category, [ThriftField(2)]String message)
    {
        this.Category = category;
        this.Message = message;
    }

    [ThriftField(1)]
    public String Category { get; }

    [ThriftField(2)]
    public String Message { get; }
}

[ThriftService("scribe")]
public interface IScribe
{
    [ThriftMethod("getMessages")]
    List<LogEntry> GetMessages();

    [ThriftMethod]
    ResultCode Log(List<LogEntry> messages);
}

public class Scribe : IScribe
{
    public List<LogEntry> GetMessages()
    {
        return new List<LogEntry>
        {
            new LogEntry { Category = "c1", Message = Guid.NewGuid().ToString() },
            new LogEntry { Category = "c2", Message = Guid.NewGuid().ToString() },
            new LogEntry { Category = "c3", Message = Guid.NewGuid().ToString() }
        };
    }

    public ResultCode Log(List<LogEntry> messages)
    {
        return ResultCode.TRY_LATER;
    }
}

你可以尝试一下:https://github.com/endink/Thrifty