【问题标题】:Thrift Nonblocking Server c#Thrift 非阻塞服务器 c#
【发布时间】:2015-04-25 09:20:03
【问题描述】:

最近我们用 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# 编写了一个。

【问题讨论】:

    标签: c# multithreading tcp thrift


    【解决方案1】:

    这是一个使用标准thrift协议的RPC框架,和使用thrift IDL定义服务的效果是一样的,即thrify可以兼容使用thrift IDL的代码,非常有助于跨-平台。

    [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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多