我遇到了可扩展性和处理方面的问题,我希望得到堆栈溢出社区的意见。
我基本上将XML数据放在套接字上,我想处理这些数据。对于每个XML行,发送的处理可以包括写入文本文件,打开另一个服务器的套接字并使用各种数据库查询;所有这些都需要时间。
我的解决方案涉及以下主题: 线程1 接受传入的套接字,从而生成处理每个套接字的子线程(只有来自客户端的几个传入套接字)。当XML行出现时(StreamReader上的ReadLine()方法)我基本上将这一行放入一个Queue,它可以通过类上的静态方法访问。这个静态方法包含锁定逻辑,以确保程序是线程安全的(我当然可以使用Concurrent Queue而不是手动锁定)。
主题2-5 不断从队列中获取XML行并一次处理一行(数据库查询,文件写入等)。
这种方法似乎有效,但我很好奇是否有更好的做事方式,因为这看起来很粗糙。如果我将线程2-5执行的处理带入线程1,这会导致性能极慢,这是我所期望的,所以我创建了我的工作线程(2-5)。
我很欣赏我可以用线程池替换线程2-5,但线程池仍然会从XML行的同一队列中读取,所以如果有更有效的方法来处理这些事件而不是使用队列,我就会徘徊?
答案 0 :(得分:0)
队列 1 是正确的方法。但我肯定会从手动线程控制转移到线程池(因此我不需要进行线程管理)并让它管理线程数。 2
但最终只有一台计算机(无论多贵)可以做多少处理。在某些时候,内存大小,CPU内存带宽,存储IO,网络IO ......之一将会饱和。此时使用外部排队系统(MSMQ,WebSphere * MQ,Rabbit-MQ,...),每个任务都是一个单独的消息,允许许多计算机上的许多工作人员处理数据(“竞争消费者”模式)。
1 我会立即转向ConcurrentQueue
:锁定权利很难,你越不需要自己做得越好。
2 在某些时候,您可能会发现需要比线程池提供程序更多的控制权,即切换到自定义线程池的时间。但是原型和测试:你的实现很可能实际上更糟糕:见第2段。