C# -- 高性能RPC框架:Socean.RPC

匿名 (未验证) 提交于 2019-12-02 22:09:29

简介

Socean.RPC是一个.Net下的高性能RPC框架,框架以高性能、高稳定性为目标,底层基于socket,无第三方库引用,代码简洁,总代码量大约在2000行,框架性能较高,在双核i5笔记本上可达10w+每秒的处理量,支持10000+长连接消息处理(客户端每秒发10个短消息至server端),内存和cpu占有率偏低

开发背景

好用的轮子太少,只能自己弄个了,希望能促进.Net社区的发展

使用介绍

server sample :

1.定义实体

public class Book {   public string Name { get; set; } }

public class DefaultMessageProcessor : IMessageProcessor {    public ResponseBase Process(string title, byte[] contentBytes)   {      if (title == "book/name/change")     {       var content = Encoding.UTF8.GetString(contentBytes);        //here we use newtonsoft.Json serializer        //you need add refer "newtonsoft.Json.dll"       var book = JsonConvert.DeserializeObject<Book>(content);       book.Name = "new name";        var responseContent = JsonConvert.SerializeObject(book);       return new BytesResponse(Encoding.UTF8.GetBytes(responseContent));     }      if (title == "empty")     {       return new EmptyResponse();     }      return new ErrorResponse(ResponseErrorCode.SERVICE_NOT_FOUND);   } }

2.启动服务

var server = new KeepAliveRpcServer(); server.Bind(IPAddress.Any, 11111); server.AutoReconnect = true; server.MessageProcessor = new DefaultMessageProcessor();  server.Start(); 

client sample:

1.定义实体

public class Book {   public string Name { get; set; } }

2.执行调用

public Book ChangeBookName(Book book) {   using (var rpcClient = ShortConnectionRpcClientFactory.Create(IPAddress.Parse("127.0.0.1"), 11111))   {     var requestContent = JsonConvert.SerializeObject(book);     var response = rpcClient.Query("book/name/change", Encoding.UTF8.GetBytes(requestContent));     var content = Encoding.UTF8.GetString(response.ContentBytes);     return JsonConvert.DeserializeObject<Book>(content);   } }

其他

NetworkSettings类可修改连接超时时间等参数

在某些低响应时间的场景需求下,可以将NetworkSettings.ClientDetectReceiveInterval设置成0,但线程不能多,否则会占满CPU

server端的最高并发处理量应该在30w以上,谁要是有30核服务器,可以帮我测试下(其实20核也行)

项目地址

https://github.com/ch00486259/Socean.Rpc

性能测试建议(load test):

压力测试时客户端需将NetworkSettings.ClientDetectReceiveInterval设置成1,可提高客户端的收发效率

提升线程优先级至ThreadPriority.Highest

客户端并发线程数最好是100至200之间

压力测试的客户端最好用win7系统,因为win7的时间片精度有时能达到1ms

最好是多机测试

文章来源: https://www.cnblogs.com/ch00486259/archive/2019/08/22/11383686.html
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!