下午好。我想问一下使用 QuickFix/n 库的 ThreadSocketAcceptor 运行的接受器如何处理负载?我没有看到任何异步方法。如果来自不同会话的发起者的许多消息经过接受者,会发生什么情况?使用 QUickFix/n 创建接受方服务的最佳实践有哪些?我只熟悉这个标准实现。
try
{
SessionSettings settings = new SessionSettings(args[0]);
IApplication app = new SimpleAcceptorApp();
IMessageStoreFactory storeFactory = new FileStoreFactory(settings);
ILogFactory logFactory = new FileLogFactory(settings);
IAcceptor acceptor = new ThreadedSocketAcceptor(app, storeFactory, settings, logFactory);
acceptor.Start();
Console.WriteLine("press <enter> to quit");
Console.Read();
acceptor.Stop();
}
catch (System.Exception e)
{
Console.WriteLine("==FATAL ERROR==");
Console.WriteLine(e.ToString());
}
我还尝试使用 DI 通过 BaskgroundService (WorkerService) 创建。但所有服务都注册为Singleton。恐怕如果所有内容都通过一个对象在一个线程中执行,那么接收、处理和转发数据的某些逻辑可能会发生得很慢。
当只有一个 ThreadSocketAcceptor 对象并且没有异步版本时,如何避免延迟?
所有 QF 中的传入消息都是串行处理的。这是有意为之,以保证消息按顺序接收和处理。需要注意的是,QF/n 回调实现(即您的
OnMessage()
函数)应该相当快地运行和返回,否则消息队列最终可能会被备份,并且您的应用程序将因延迟而崩溃。
对于可能需要更长时间的消息处理,常见的策略是 OnMessage 回调将其消息推送到工作队列中,另一个工作线程将消费并处理这些消息。
(我必须承认,我还没有编写商业级的 QF/n Acceptor 应用程序。我所有认真的 QF/n 项目都使用了 Initiator 应用程序;我的 Acceptors 都是用于演示或测试上述 Initiator 的。)