我只有一个生产者,可以将消息插入BlockingCollection。
集合中的每个消息都有一个groupId。不同groupId的计数是动态的。每个组的消息必须按FIFO顺序处理。 消费者所做的工作是一个小的计算和一个数据库插入,有时是一个附加的http请求。
我尝试为每个groupId创建一个新的使用者线程-但是线程过多会带来问题。
当我创建50个消费者线程时,消息的处理速度要快得多:
for (int i = 0; i < 50; i++)
{
Task.Factory.StartNew(() =>
{
foreach (var item in _queue.GetConsumingEnumerable())
{
var group = item.groupId;
// do work
}
}
}
但是使用此代码,不会按序列顺序处理每个groupId的消息。
是否有一种简单的方法可以使用户对每个groupId保持“粘性”?
例如:当使用者3处理了具有groupId 7的消息时,使用者3必须处理所有其他具有groupId 7的消息。