异步 ThreadSocketAcceptor,通过 DI 实现

Asynchronous ThreadSocketAcceptor, implementation via DI

提问人:rapetum228 提问时间:11/2/2023 更新时间:11/2/2023 访问量:25

问:

下午好。我想问一下使用 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 对象而没有异步版本时,如何避免延迟?

.NET 套接字异 修复协议 quickfixn

评论


答:

1赞 Grant Birchmeier 11/2/2023 #1

所有 QF 中的传入消息都是按顺序处理的。这是有意为之的,以保证按顺序接收和处理消息。需要注意的是,QF/n 回调实现(即函数)应该相当快地运行和返回,否则消息队列最终可能会被备份,并且您的应用程序将因延迟而崩溃。OnMessage()

对于可能需要更长时间的消息处理,常见的策略是让 OnMessage 回调将其消息推送到工作队列中,另一个工作线程将使用和处理这些消息。

(我必须承认,我还没有写过商业级的 QF/n 受体应用程序。我所有严肃的 QF/n 项目都与 Initiator 应用程序有关;我的接受者都用于上述启动器的演示或测试。