gpt4 book ai didi

multithreading - 多线程处理具有极高消息率的应用程序(我应该使用哪种方法?)

转载 作者:行者123 更新时间:2023-12-03 12:49:51 24 4
gpt4 key购买 nike

我正在为对冲基金创建一个交易平台,我需要能够在单独的线程上处理市场数据,并且我正在尝试找出我应该使用哪种方法。
最终目标是能够尽可能快地每秒处理多达 1000 条消息。
到目前为止,这是我的想法:
方法一:使用 ConcurrentQueue 的线程
此方法创建一个线程,并且基本上让线程不断地从队列中取出消息(线程将保持事件状态)。

public class MessageQueue
{
private ConcurrentQueue<Message> MessageQueue;
private Thread QueueThread;

public MessageQueue()
{
MessageQueue = new ConcurrentQueue<Message>();
QueueThread = new Thread(ProcessQueue);
QueueThread.Start();
}

public void ProcessQueue()
{
Message OrderMessage;

while (IsRunning)
{
if (MessageQueue.TryDequeue(out OrderMessage)
{
ProcessMessage(OrderMessage);
}
}
}

public static void OnInboundMessage(Message MarketMessage)
{
MessageQueue.Enqueue(DataMessage);
}

public static void ProcessMessage(Message MarketMessage)
{
// Process Message Here
}
}
问题:为什么人们在创建新线程时使用 'ThreadStart' 方法?如果您不使用它,它似乎也能正常工作 - 它有什么用?
问题:使用 ConcurrentQueue 有什么好处?常规队列何时会出现并发问题?似乎只要您在出队之前检查队列中是否已经存在某些内容,就不应该存在任何并发问题,但我可能不理解某些内容。
问题:我应该设置线程的任何属性,如“ApartmentState”或“IsBackground”吗?
方法二:线程池
这个方法简单地使用每个新消息调用 ThreadPool。
public class MessagePool
{
public static void OnInboundMessage(Message MarketMessage)
{
ThreadPool.QueueUserWorkItem(obj => ProcessMessage(MarketMessage);
}

public static void ProcessMessage(Message MarketMessage)
{
// Process Message here
}
}
问题:是否有任何 ThreadPool 设置可能使其成为更合适的解决方案?
问题:我也不太“得到” Lambda 表达式,但它们似乎可以工作 - 是否有更好的方法来调用 ThreadPools?使用 Lambda 有什么缺点(性能等)吗?
方法三:消息任务
此方法以与 ThreadPool 类似的方式使用 Task。
public class MessageTasks
{
public static void OnInboundMessage(Message MarketMessage)
{
Task.Factory.StartNew(() => ProcessMessage(MarketMessage));
}

public static void ProcessMessage(Message MarketMessage)
{
// Process Message here
}
}
问题:创建我自己的 TaskFactory 和 TaskScheduler 会提高它的性能吗?
我的性能测试
看来方法 I 是迄今为止处理消息的最快方法。似乎 ThreadPool 需要大约 9 微秒来添加一个新的工作项,而 Task.Factory 方法大约需要 12 微秒。有没有人有类似的结果?
提前感谢您的帮助 - 如果您认为我以完全错误的方式解决这个问题,请不要犹豫让我知道!
威廉

最佳答案

一个每秒有几千个请求的公共(public)交易平台写了http://code.google.com/p/disruptor/支持该用例。它是用 Java 编写的,并且已经构建了一个类似工作的姊妹项目 http://code.google.com/p/disruptor-net/对于.NET 平台。

他们在 http://www.infoq.com/presentations/LMAX 上有一个很好的介绍。它解释了性能(比 ConcurrentQueue 快 10-100 倍)和可靠性方面的好处,并讨论了对程序架构其余部分的必要更改。

关于multithreading - 多线程处理具有极高消息率的应用程序(我应该使用哪种方法?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7917946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com