ET服务器框架学习笔记(二十)

ET服务器框架学习笔记(二十)

文章目录


前言

本篇简单介绍一下ET中得压测模块


提示:ET5.0中的压测示例比较简单,实际上针对不同业务逻辑需要写不同的压测模块,但是使用方式是几本相同的。

一、BenchmarkComponent

BenchmarkComponent组件的内容相对简单,大体流程:模拟多个客户端,每个客户端向固定端口发送一个消息,然后记录耗费时长等信息。

public static void Awake(this BenchmarkComponent self, string address)
		{
			try
			{
				IPEndPoint ipEndPoint = NetworkHelper.ToIPEndPoint(address);
				NetOuterComponent networkComponent = Game.Scene.GetComponent<NetOuterComponent>();
				for (int i = 0; i < 2000; i++)
				{
					self.TestAsync(networkComponent, ipEndPoint, i);
				}
			}
			catch (Exception e)
			{
				Log.Error(e);
			}
		}

获取地址,外网组件,然后调用2000次循环(模拟2000个客户端同时发送数据),内部调用TestAsync

public static async void TestAsync(this BenchmarkComponent self, NetOuterComponent networkComponent, IPEndPoint ipEndPoint, int j)
		{
			try
			{
				using (Session session = networkComponent.Create(ipEndPoint))
				{
					int i = 0;
					while (i < 100000000)
					{
						++i;
						await self.Send(session, j);
					}
				}
			}
			catch (Exception e)
			{
				Log.Error(e);
			}
		}

每调用一次TestAsync,都通过外网组件创建一次Session。然后内部循环异步调用100000000次发送。

public static async Task Send(this BenchmarkComponent self, Session session, int j)
		{
			try
			{
				await session.Call(new C2R_Ping());
				++self.k;

				if (self.k % 100000 != 0)
				{
					return;
				}

				long time2 = TimeHelper.ClientNow();
				long time = time2 - self.time1;
				self.time1 = time2;
				Log.Info($"Benchmark k: {self.k} 每10W次耗时: {time} ms {session.Network.Count}");
			}
			catch (Exception e)
			{
				Log.Error(e);
			}
		}

每次发送完毕后唤醒异步,进行记录,这里记录了每10W次处理的耗费时间,简单的估算了处理能力,当然也可以在这里用其他指标来进行测试。服务器得处理方式也比较简单,收到Ping直接回复,没有其他处理。

至此,一个外网组件的最简单的测试,也可以测试actor等等其他消息,看响应速度等。

**备注:**对于webSocket的压力测试组件WebSocketBenchmarkComponent,与普通的测试基本一样,这里就不做过多解释了,只是一个socket类型与地址不同而已。

二、ET中另外两个服务方式UDP,WebSocket

  • WebSocket的实现方式与TCP差别不多,唯一的几个差别就是在开启服务,新建Socket的地方不一样,Tcp中交给Channel,WebSocket交给了Service处理。
  • UDP在ET中使用了KCP的方式进行使用,即可靠UDP。UDP处理相对TCP来说更加复杂一点。内部封装了很多状态消息,因为消息接收时可能是无序的,所以还要对这些消息进行二次消息的拼接处理,这样能保证消息的可靠性。
    UDP的具体处理我就不仔细说了,对于延时要求较高,可靠性要求较低的游戏可以使用这种通信方式。在一般的MOBA类,或者竞技类游戏中用的比较多,因为节省了握手以及错误重发等机制,所以在不稳定网络中有很好的响应表现。

总结

自此,ET5.0服务器框架中所有的服务模块基本上都简单的梳理了一遍,个人理解可能会有错误的地方,希望后面在具体使用过程中进行纠正。
后续会真正开始使用ET5.0作为框架基础进行开发,当然如果6.0正式版本在我开发初期的话,估计我会马上转战6.0了。毕竟6.0里面的思想更加先进,对理解,使用,以及合作开发上都提供了更加强大的能力。
这里再次感谢ET作者,开源这款强大的C#语言基础的服务器框架,里面很多思想都值得学习。
最后希望在这款框架的帮助下,实现人生价值!!!!!!

上一篇:ET服务端分布式部署


下一篇:ET框架服务端--升级3.1