Java事件驱动的发布/订阅系统订阅者比生产者慢

时间:2017-11-29 19:03:09

标签: java guava publish-subscribe

我必须设计一个订阅者比生产者慢的系统。我不能使用任何MQ解决方案(由于预算限制)。我可以使用内存中队列,生产者将数据放入队列,订阅者将在特定时间间隔内轮询吗?如何使用Java 7实现。

我可以使用Google Guava EventBus吗?

如果是其中任何一种情况,那么如何实施解决方案或任何其他低成本替代解决方案。

1 个答案:

答案 0 :(得分:0)

EventBus适用于解耦系统的各个部分,因此生产者只知道EventBus并且消费者通过@Subscribe间接地知道它(某些代码必须知道消费者和EventBus,因此可以调用register)。

您可能需要也可能不需要这样的去耦。 EventBus可以在同一个线程(默认)或使用提供的Executor同步传递事件。如果您不希望订阅者减慢生产者的速度,那么您可以使用异步版本。

如果您希望生产者不会放慢速度,那么您可以使用BlockingQueue中的一些java.util.concurrent。如果您想应用背压(例如,如果队列变大则减慢产量),请查看LinkedBlockingQueueArrayBlockingQueue

如果您不关心生产者和消费者都必须看到您的队列,那么您不需要EventBus。如果你这样做,那么你就可以使用它,例如,生成器发布一个填充队列的线程订阅的事件。或者可能有一个线程轮询队列并发布到总线。

或者两者兼而有之,但不要过度设计,只需KISS

AFAICT,在单个Java进程内部工作时,正确的消息队列是overkill

您应该添加更多详细信息以获得推荐。