【问题标题】:Java Event driven Pub/Sub system Subscriber is slower than ProducersJava 事件驱动的 Pub/Sub 系统订阅者比生产者慢
【发布时间】:2018-05-13 14:03:14
【问题描述】:

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

我可以使用 Google Guava EventBus 做同样的事情吗?

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

【问题讨论】:

  • 使用 BlockingQueue 来施加背压。
  • 你能解释一下吗?
  • 我可以将它与 Google Guava EventBus 一起使用吗?

标签: java guava publish-subscribe


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的建议。我的要求是生产者和订阅者不应该互相认识。给定的输入类型可以有多个订阅者。生产者将推送消息,订阅者将按照自己的节奏一一阅读。如果您有任何其他建议,请告诉我。我正在使用 Spring 4、Java 7 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多