异步ThreadSocketAcceptor,通过DI实现

问题描述 投票:0回答:1

下午好。我想问一下使用 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 sockets asynchronous fix-protocol quickfixn
1个回答
0
投票

所有 QF 中的传入消息都是串行处理的。这是有意为之,以保证消息按顺序接收和处理。需要注意的是,QF/n 回调实现(即您的

OnMessage()
函数)应该相当快地运行和返回,否则消息队列最终可能会被备份,并且您的应用程序将因延迟而崩溃。

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

(我必须承认,我还没有编写商业级的 QF/n Acceptor 应用程序。我所有认真的 QF/n 项目都使用了 Initiator 应用程序;我的 Acceptors 都是用于演示或测试上述 Initiator 的。)

© www.soinside.com 2019 - 2024. All rights reserved.