【优化】优化Luban.ClientServer性能,GenServer使用LocalAgent直接读取本地文件,而不是通过网络从GenClient获得。
parent
2685a4d5d4
commit
f6e4f6377a
|
|
@ -162,7 +162,7 @@ Options:
|
|||
}
|
||||
StringTemplateUtil.AddTemplateSearchPath(FileUtil.GetPathRelateApplicationDirectory("Templates"));
|
||||
|
||||
GenServer.Ins.Start(options.Port, ProtocolStub.Factories);
|
||||
GenServer.Ins.Start(true, options.Port, ProtocolStub.Factories);
|
||||
|
||||
GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController());
|
||||
GenServer.Ins.RegisterJob("proto", new Luban.Job.Proto.JobController());
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
using Luban.Common.Protos;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Luban.Server.Common
|
||||
{
|
||||
public interface IAgent
|
||||
{
|
||||
Task<byte[]> GetFromCacheOrReadAllBytesAsync(string file, string md5);
|
||||
|
||||
Task<byte[]> ReadAllBytesAsync(string file);
|
||||
|
||||
Task<GetImportFileOrDirectoryRes> GetFileOrDirectoryAsync(string file, params string[] searchPatterns);
|
||||
|
||||
Task<QueryFilesExistsRes> QueryFileExistsAsync(QueryFilesExistsArg arg);
|
||||
|
||||
Task<XElement> OpenXmlAsync(string xmlFile);
|
||||
|
||||
void Error(string fmt, params object[] objs);
|
||||
|
||||
void Info(string fmt, params object[] objs);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
using Bright.Net.ServiceModes.Managers;
|
||||
using Luban.Common.Protos;
|
||||
using Luban.Common.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace Luban.Server.Common
|
||||
{
|
||||
public class LocalAgent : RemoteAgent
|
||||
{
|
||||
public LocalAgent(SessionBase session) : base(session)
|
||||
{
|
||||
}
|
||||
|
||||
public override Task<byte[]> ReadAllBytesAsync(string file)
|
||||
{
|
||||
return FileUtil.ReadAllBytesAsync(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -31,22 +31,19 @@ namespace Luban.Server.Common
|
|||
}
|
||||
}
|
||||
|
||||
public class RemoteAgent
|
||||
public class RemoteAgent : IAgent
|
||||
{
|
||||
private static readonly NLog.Logger s_logger = NLog.LogManager.GetCurrentClassLogger();
|
||||
|
||||
public SessionBase Session { get; }
|
||||
|
||||
private readonly bool _trace;
|
||||
|
||||
private readonly ConcurrentDictionary<string, Task<byte[]>> _remoteReadAllBytesTasks = new();
|
||||
|
||||
private readonly ConcurrentDictionary<string, Task<GetImportFileOrDirectoryRes>> _getImportFileOrDirTasks = new();
|
||||
|
||||
public RemoteAgent(SessionBase session, bool trace)
|
||||
public RemoteAgent(SessionBase session)
|
||||
{
|
||||
Session = session;
|
||||
_trace = trace;
|
||||
}
|
||||
|
||||
private const int GET_INPUT_FILE_TIMEOUT = 10;
|
||||
|
|
@ -63,7 +60,7 @@ namespace Luban.Server.Common
|
|||
return content;
|
||||
}
|
||||
|
||||
public Task<byte[]> ReadAllBytesAsync(string file)
|
||||
public virtual Task<byte[]> ReadAllBytesAsync(string file)
|
||||
{
|
||||
return _remoteReadAllBytesTasks.GetOrAdd(file, f =>
|
||||
{
|
||||
|
|
@ -129,7 +126,6 @@ namespace Luban.Server.Common
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#region log
|
||||
|
||||
public void Error(string fmt, params object[] objs)
|
||||
|
|
@ -137,43 +133,15 @@ namespace Luban.Server.Common
|
|||
Log("error", string.Format(fmt, objs));
|
||||
}
|
||||
|
||||
public void Error(Exception e, string s)
|
||||
{
|
||||
LogException(e, s);
|
||||
}
|
||||
|
||||
public void Error(Exception e, string fmt, params object[] objs)
|
||||
{
|
||||
LogException(e, string.Format(fmt, objs));
|
||||
}
|
||||
|
||||
public void Info(string fmt, params object[] objs)
|
||||
{
|
||||
Log("info", string.Format(fmt, objs));
|
||||
}
|
||||
|
||||
public void Info(string s)
|
||||
{
|
||||
Log("info", s);
|
||||
}
|
||||
|
||||
public void Trace(string fmt, params object[] objs)
|
||||
{
|
||||
if (_trace)
|
||||
{
|
||||
Log("trace", string.Format(fmt, objs));
|
||||
}
|
||||
}
|
||||
|
||||
private void Log(string level, string content)
|
||||
{
|
||||
Session.Send(new PushLog() { Level = level, LogContent = content });
|
||||
}
|
||||
|
||||
private void LogException(Exception e, string content)
|
||||
{
|
||||
Session.Send(new PushException() { LogContent = content, Message = e.Message, StackTrace = e.StackTrace });
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,15 +33,18 @@ namespace Luban.Server
|
|||
|
||||
private readonly Dictionary<string, IJobController> _jobs = new Dictionary<string, IJobController>();
|
||||
|
||||
public void Start(int port, Dictionary<int, ProtocolCreator> factories)
|
||||
private bool _localServer;
|
||||
|
||||
public void Start(bool localhost, int port, Dictionary<int, ProtocolCreator> factories)
|
||||
{
|
||||
_localServer = localhost;
|
||||
_handlers.Add(GetOutputFile.ID, (s, p) => OnGetOutputFile(s, (GetOutputFile)p));
|
||||
_handlers.Add(GenJob.ID, (s, p) => OnGenJob(s, (GenJob)p));
|
||||
|
||||
var worker = new EventLoopGroup(4, 16);
|
||||
var server = new TcpServerBootstrap
|
||||
{
|
||||
LocalAddress = new IPEndPoint(IPAddress.Any, port),
|
||||
LocalAddress = new IPEndPoint(localhost ? IPAddress.Loopback : IPAddress.Any, port),
|
||||
|
||||
ChildrenEventLoopGroup = worker,
|
||||
EventLoop = worker.ChooseEventLoop(),
|
||||
|
|
@ -102,7 +105,7 @@ namespace Luban.Server
|
|||
|
||||
if (_jobs.TryGetValue(rpc.Arg.JobType, out var jobController))
|
||||
{
|
||||
_ = jobController.GenAsync(new RemoteAgent(session, rpc.Arg.Verbose), rpc);
|
||||
_ = jobController.GenAsync(_localServer ? new LocalAgent(session) : new RemoteAgent(session), rpc);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ namespace Luban.Server
|
|||
|
||||
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
|
||||
|
||||
GenServer.Ins.Start(options.Port, ProtocolStub.Factories);
|
||||
GenServer.Ins.Start(false, options.Port, ProtocolStub.Factories);
|
||||
|
||||
GenServer.Ins.RegisterJob("cfg", new Luban.Job.Cfg.JobController());
|
||||
GenServer.Ins.RegisterJob("proto", new Luban.Job.Proto.JobController());
|
||||
|
|
|
|||
Loading…
Reference in New Issue