【问题标题】:C# processing received socket data via threadsC# 通过线程处理接收到的套接字数据
【发布时间】:2013-09-08 22:42:11
【问题描述】:

我在可扩展性和处理方面遇到问题,我想征求堆栈溢出社区的意见。

我基本上有来自套接字的 XML 数据,我想处理这些数据。对于发送的每个 XML 行,处理可以包括写入文本文件、打开到另一个服务器的套接字以及使用各种数据库查询;所有这些都需要时间。

目前我的解决方案涉及以下线程: 线程 1 接受传入的套接字,从而生成处理每个套接字的子线程(只有几个来自客户端的传入套接字)。当一条 XML 行通过(StreamReader 上的 ReadLine() 方法)时,我基本上将这条线放入一个队列中,该队列可通过类上的静态方法访问。这个静态方法包含锁定逻辑以确保程序是线程安全的(我当然可以使用并发队列来代替手动锁定)。

线程 2-5 不断地从队列中取出 XML 行并一次处理一个(数据库查询、文件写入等)。

这种方法似乎有效,但我很好奇是否有更好的处理方法,因为这看起来很粗糙。如果我将线程 2-5 执行的处理放到线程 1 中,则会导致性能极慢,这是我所预料的,因此我创建了我的工作线程 (2-5)。

我很感激我可以用线程池替换线程 2-5,但线程池仍会从同一个 XML 行队列中读取,所以我想知道是否有更有效的方法来处理这些事件而不是使用队列?

【问题讨论】:

    标签: c# xml multithreading sockets multitasking


    【解决方案1】:

    队列1 是正确的方法。但是我肯定会从手动线程控制转移到线程池(因此我不需要进行线程管理)并让它管理线程数。2

    但是最终只有一台计算机(无论多么昂贵)可以完成这么多的处理。在某个时刻,内存大小、CPU 内存带宽、存储 IO、网络 IO ……将会饱和。那时,使用外部队列系统(MSMQ、WebSphere*MQ、Rabbit-MQ 等),每个任务都是一条单独的消息,允许多台计算机上的许多工作人员处理数据(“竞争消费者”模式)。


    1我会立即转至ConcurrentQueue:正确锁定很难,您不需要自己做的越多越好。

    2 在某些时候,您可能会发现您需要比线程池提供者更多的控制权,那就是切换到自定义线程池的时候了。但是原型和测试:很可能你的实现实际上会更糟:见第 2 段。

    【讨论】:

    • 嗨,理查德,感谢您的回复。无论如何,我打算转移到线程池和 ConcurrentQueue。在发布我的初始消息大约半小时后,我发现了消息队列并开始研究 AMQP、STOMP、MSMQ 等以及各种程序,如 RabbitMQ 和 ActiveMQ。您使用过任何消息队列程序吗?你会特别推荐吗?
    • @user1593436 我已经使用了(或者更确切地说使用了其他的包装器......)几个。但是最近没有。鉴于它的集成,我将从 MSMQ 开始,但希望构建抽象以避免锁定到任何一个(这也将允许通过使用假输入队列进行单元测试)。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多