【发布时间】:2011-10-16 19:30:06
【问题描述】:
关于处理以下场景的模式建议:
将事件分派给消费者的单个线程。每个事件和消费者之间存在 1:1 的关系(每个事件根据事件/消费者 id 匹配分派给单个消费者)。
消费者以不同的速度处理事件,并且可以以可配置的批量大小来消费事件(例如,消费者一次可以消费 20 个事件)。
生产者线程应该始终能够将事件分派给能够消费的消费者。每个消费者维护一个它已经消费的事件队列(可能是批量)并在自己的线程上处理这些事件,因此从生产者到消费者的切换是异步的。
如果任何时候都没有消费者可以消费,调度线程应该怎么办?
-
yield()它 -
wait()并强制消费者拨打notify()就可以了 -
sleep()固定时间段 - 自旋
有任何理由偏爱其中一个吗?
一些优点和缺点:
- 收益很简单
- 强制消费者调用 notify 会增加复杂性
- 固定时间的睡眠将适合对时间不敏感的要求
- 自旋会占用 CPU,除非我们需要尽可能快的事件传递,否则这是不必要的
还有其他注意事项吗?
【问题讨论】:
-
完全清楚:您说的是从调度程序直接移交给消费者,中间没有事件队列?
-
抱歉,不清楚。从调度程序到消费者的切换是异步的,每个消费者都维护自己的事件队列。
-
完整的句子有助于理解场景。此外,如果一个消费者可以消费多个事件,那不是“1:1”。
-
消费者可以批量消费事件,并且只有一个消费者可以消费任何一个事件(调度线程根据ID为每个事件查找正确的消费者)
-
事件是如何产生的?有没有等待下一个事件生成的方法?如果您需要做的就是在生产者线程上创建一个循环,该循环调用此方法并在生成事件时将每个事件分派给正确的消费者。这样可以确保消费者总是在事件到达后立即收到事件,并且由于生产者线程在其余时间等待,因此没有不必要的 CPU 负载。
标签: java multithreading concurrency producer-consumer