我必须设计一个订阅者比生产者慢的系统。我不能使用任何MQ解决方案(由于预算限制)。我可以使用内存中队列,生产者将数据放入队列,订阅者将在特定时间间隔内轮询吗?如何使用Java 7实现。
我可以使用Google Guava EventBus吗?
如果是其中任何一种情况,那么如何实施解决方案或任何其他低成本替代解决方案。
答案 0 :(得分:0)
EventBus
适用于解耦系统的各个部分,因此生产者只知道EventBus
并且消费者通过@Subscribe
间接地知道它(某些代码必须知道消费者和EventBus
,因此可以调用register
)。
您可能需要也可能不需要这样的去耦。 EventBus
可以在同一个线程(默认)或使用提供的Executor
同步传递事件。如果您不希望订阅者减慢生产者的速度,那么您可以使用异步版本。
如果您希望生产者不会放慢速度,那么您可以使用BlockingQueue
中的一些java.util.concurrent
。如果您想应用背压(例如,如果队列变大则减慢产量),请查看LinkedBlockingQueue
和ArrayBlockingQueue
。
如果您不关心生产者和消费者都必须看到您的队列,那么您不需要EventBus
。如果你这样做,那么你就可以使用它,例如,生成器发布一个填充队列的线程订阅的事件。或者可能有一个线程轮询队列并发布到总线。
或者两者兼而有之,但不要过度设计,只需KISS。
AFAICT,在单个Java进程内部工作时,正确的消息队列是overkill。
您应该添加更多详细信息以获得推荐。