【发布时间】:2009-07-04 10:24:12
【问题描述】:
我需要帮助设计一个消息分发系统。到目前为止,我有 2 个进程,一个监听远程客户端的传递消息,然后 写入数据库表。
然后我有第二个进程每隔 [n] 秒从同一个表中读取一次,一次读取最多可获取 100 条消息,如果有任何新记录,则将每条记录排队以在其自己的 ThreadPool 发出的 backgorund 线程上发送.
如果可用的消息多于线程,线程池会将所有超出其最大线程数的消息排队。如果没有消息,则返回睡眠状态并等待下一个 Timer 事件将其唤醒以再次检查 db 表。
问题是我可能在一个时间间隔内有很多消息到达:最好将它们留在 Db 中直到需要,而不是留在内存中,在 ThreadPool 中排队等待。
换句话说,我正在寻找一种优雅的方式来知道何时可以添加更多排队的线程,而不是简单地等到下一个计时器间隔......
我的一个想法是计算我排队的 Worker 线程数(例如:500,等于我首先设置的最大线程数),并在它们完成时计算它们。如果它们低于 1/2(例如:250),则重新进行 Db 检查。如果找到记录,很好,一次获取 100 个,直到完全读取 db 表,或者再次达到 500 个最大值。
换句话说,使出队的主要焦点是线程本身,自我启动自身的连续性,而不是计时器(计时器间隔只是因为在管道干涸的情况下重新启动进程的机制)。
有人对这样的系统有建议/cmets/经验吗?方法可靠吗?还是有严重缺陷?
【问题讨论】:
-
您正在讨论“生产者/消费者”场景,其中包含一个生产者和多个消费者。这是一种常见的设计模式,周围有很多类似devpinoy.org/blogs/jakelite/archive/2009/01/12/… 的引用。稍后我会尝试收集更多链接,并发布更好的回复,但我想我暂时将一些条款留给谷歌。 :-) HTH。
-
好奇:我们在谈论什么数据库?它是否像 SQL Server、Oracle 和 DB2 那样提供开箱即用的消息传递功能?
标签: c# multithreading