我害怕使用事件总线http://code.google.com/p/guava-libraries/wiki/EventBusExplained,因为我认为它在内部使用了无界队列。如果有很多消息发布到它。它可能会遇到完整的 gc。
是否存在类似的实现,它做同样的事情是无界队列?
我害怕使用事件总线http://code.google.com/p/guava-libraries/wiki/EventBusExplained,因为我认为它在内部使用了无界队列。如果有很多消息发布到它。它可能会遇到完整的 gc。
是否存在类似的实现,它做同样的事情是无界队列?
事实上,Guava 使用了一个ConcurrentLinkedQueue
,它是无界的:
基于链接节点的无界线程安全队列。
请参阅EventBus.java 的第 151-158 行。
/** queues of events for the current thread to dispatch */ private final ThreadLocal<ConcurrentLinkedQueue<EventWithHandler>> eventsToDispatch = new ThreadLocal<ConcurrentLinkedQueue<EventWithHandler>>() { @Override protected ConcurrentLinkedQueue<EventWithHandler> initialValue() { return new ConcurrentLinkedQueue<EventWithHandler>(); } };
您可以随时修改代码以使用例如ArrayBlockingQueue
. 您是否研究过其他类似的解决方案,例如中断器?
我同意 Arjit 的观点,即在某些情况下,无界队列可能被认为是不利的。例如,如果我有一个服务正在运行,它使用来自各种来源的消息来处理它们,而我不知道传入消息的速率。它可能会超过我的工人/消费者的处理速度,我可能想建立以下合同:如果仍有许多消息未决,向工人发布新消息将失败或阻塞。这不仅可以防止内存不足,还可以保证消息在特定时间范围内得到实际处理。此外,如果服务在其限制范围内运行,客户将收到直接反馈。
@Arjit:您可以在https://github.com/bennidi/mbassador上查看 MBassador
它与 Google Guava 事件总线非常相似,但提供了更多功能 - 有界消息队列就是其中之一。它也非常快,其内部设计允许大量定制和扩展。据了解,我能够在短时间内解决其他用户的大部分功能请求。也许你试一试。