beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列。除了队列上的支持组件还提供Buffer缓冲池和基于Buffer的DataWriter,DataReader对象,从而达到消息可以灵活地分布在多个Buffer中,实现更好的内存利率.为了使处理更高效组件使用多个SocketAsyncEventArgs对数据进行处理,可以同时进行接收和发送操作.经测试beetle可以在一些比较旧的电脑上(core e4300 1.8g)的电脑每秒可以进行6W个以上的send或receive操作,并包括数据包分析、对象写入缓冲或从缓冲中读取;就是说每秒可以处理3W个请求并进行数据流分析反序列化对象的同时重新写入缓冲发送出去;组件在内存使用方面也非常出色,对象在写入流或从流中读取信息不会再产生任何新的byte[]分配,包括字符集的编码处理;这些都表明组件提供非常好的性能支持。
为了更好地利用Socket IO来处理数据,组件提供智能合并消息机制,自动根据当前负载情况进行数据合并处理减少IO的操作数量;结合2.4.2提供的可复用消息对象,组件可以轻易应付500或更多的同场景物体状态信息广播,其信息转发广播量可达到每秒上百万的同时还能保证良好的延时[实现原理]。
在使用上传统Socket编写tcp应虽然不是复杂但写起来也是件麻烦的事情,还要处理分包和粘包上的问题。但beetle都解决了以上问题,所有操作都是基于方法和事件来实现,只需要在创建一个对象简单的绑定一个事件就能完成工作。组件还提供基于分隔符和头描述大小的方式数据流分包功能,从而让开发人员有更多的时候专注于逻辑功能的编写。
虽然beetle基于对象描述数据处理,但其生成的数据协议是标准的基础类型存储方式,没有在协议添加多余的数据.所以即使用c++,java,flash等平台都非常方便地实现相关协议转换.
2.4.x 内容
优化BufferWriter数据写入过程,使对象写入流的效率提高30%;优化后除了数据成员分布在两个buffer中才会存在buffer.copy操作
提供Uint16,uint32,uint64等方法
提供WriteString方法,用于写一个不带头长度描述的string值
提供WriteShortString方法,用于写入一个带UInt16长度标识的string值
修复由优化Buffer读取时导致Varint数值解码错误,此问题只会影响启用了Varint编码
提供计数消息对象,用于处理转发消息导致的重复写入流的工作,避免海量数据转发引起的消息写入流产生的损耗
给TcpChannel的Send提供返回值用于描述当前发送的消息是否正常写入到队列中。公开IsDisposed用于判断当前TcpChannel的状态是否已经释放。
添加ObjectFormatter对象,可以把消息序列化到ByteArraySegment或从ByteArraySegment数据中反序列化对象。
给ByteArraySegment添加DES加解密方法。
2.3.x 内容
修改Package数据让其支持自定义消息类型标识,不再以类型名称的固定方式作为消息类型标记.
添加Package一些事件信息参数,方便实现消息可复用机制,从而达到在高并发下不停创建结构比较大的消息所带来的内存开销。
更低的内存使用率,初始化可供1W连接请求并发组件开启占用内存只需要60MB
添加发送完成事件开启属性,默认不开启消息发送完成通知
添加支持可变长度写入int32,int64,float,double ,从而使大多数传输数值型数据使用更低的带宽
修复设置可变长度写入 int32,int64,float,double 时导致读取消息头4字节长度错误
2.2.x 内容
添加延时释放资源,用于解决当资源释放时接收队列中等待的消息掉弃没被处理
公开TickCount属性,此属性是记录最近通道接收消息或发送的时间
给Channel释放事件提供还在队列中没被发送出去的消息信息
添加Task对象用于统一执行一些任务,如Channel释放检测,连接有效性检测等.
给ByteArraySegment添加一些字符编码方法和数据导入方法
给Channel添加接收数据和发送数据计数
给连接创建Channel前提供事件,通过此事件可以取消Channel的创建
修改BufferWriter创建后分配Buffer问题,通过构建参数来确定是否分配一个Buffer,修改BufferReader在消息读取完成后马上释放占用的buffer不等到下次数据导入.
修改发送消息完成事件信息,提供这次发送的信息成功或失败
修改Buffer处理机制,在大量连接的时候有着更好的Buffer利用率(特别是几万同时在线的时候)
给TcpServer添加暂停和恢复接入连接功能.
2.1.3 内容
添加消息发送完成事件
添加可使用异步方式创建Client连接
2.1.2 内容
修复读取ByteArraySegment时SetCount的错误
2.1 修改内容
修正Buffer.ReadList获取为空的问题
给Writer和Reader添加ByteArraySegment方法, 主要用于代替大的byte[]和string读取和写入用. 避免存在大量这些数据操作的时候会有大量的byte[]创建和销毁
消息处理队列对象由于没有设置Channel属性,导致错误不会触Channel.Error事件.
修正有些导致Channel释放的错误没有正常触发Error事件
性能和稳定性测试
在新版本的beetle中经常大量的性能和稳定性测试,4000连接15亿次的请求处理中没有任何内存出现异常性上涨,通过2千W的连接接入和断开测试也保持良好的内存使用率.
以下是2.0版本的性能测试情况
class GetResponse : IMessage
{
public User User;
}
class User : IMessage
{
public string Name;
public string EMail;
public string City;
public string Counrty;
}
class Response : Beetle.IMessage
{
private IList<Order> mOrders = new List<Order>();
public IList<Order> Orders
{
get
{
return mOrders;
}
}
}
class Order : Beetle.IMessage
{
public int OrderID;
public string CustomerID;
public int EmployeeID;
public long OrderDate;
public long RequiredDate;
public string ShipName;
public string ShipAddress;
public string ShipCity;
public string ShipRegion;
public string ShipPostalCode;
public string ShipCountry;
}
获取不同对象请求应答情况

不同连接性能对比

高连接并发测试
