提问人:rapetum228 提问时间:11/2/2023 更新时间:11/2/2023 访问量:25
异步 ThreadSocketAcceptor,通过 DI 实现
Asynchronous ThreadSocketAcceptor, implementation via DI
问:
下午好。我想问一下使用 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 对象而没有异步版本时,如何避免延迟?
答:
1赞
Grant Birchmeier
11/2/2023
#1
所有 QF 中的传入消息都是按顺序处理的。这是有意为之的,以保证按顺序接收和处理消息。需要注意的是,QF/n 回调实现(即函数)应该相当快地运行和返回,否则消息队列最终可能会被备份,并且您的应用程序将因延迟而崩溃。OnMessage()
对于可能需要更长时间的消息处理,常见的策略是让 OnMessage 回调将其消息推送到工作队列中,另一个工作线程将使用和处理这些消息。
(我必须承认,我还没有写过商业级的 QF/n 受体应用程序。我所有严肃的 QF/n 项目都与 Initiator 应用程序有关;我的接受者都用于上述启动器的演示或测试。
评论