最近我们用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#写了一个。
答案 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;
}
}