我害怕使用事件总线http://code.google.com/p/guava-libraries/wiki/EventBusExplained,因为我认为它在内部使用无界队列。如果有很多消息发布到它。它可能会遇到完整的gc。
是否存在类似的实现,它执行与无界队列相同的操作?
答案 0 :(得分:3)
事实上,Guava使用ConcurrentLinkedQueue
,这是无限的:
基于链接节点的无界线程安全队列。
请参阅line 151-158 of EventBus.java。
/** 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
。您是否研究过其他相似的解决方案,例如disruptor?
答案 1 :(得分:1)
我同意Arjit的观点,在某些情况下,无界队列可能被认为是不利的。例如,如果我运行的服务使用来自各种来源的消息来处理它们,我不知道传入消息的速率。它可能超过我的工作人员/消费者的处理速度,我可能想要建立以下合同:如果仍有许多待处理的消息,则向工作人员发送新消息将失败或阻止。这不仅可以防止内存不足,还可以保证在特定时间范围内实际处理消息。此外,如果服务在其限制范围内运行,客户将收到直接反馈。
@Arjit:您可以在https://github.com/bennidi/mbassador
上查看MBassador它与Google Guava事件总线非常相似,但提供了更多功能 - 有限的消息队列就是其中之一。它也非常快,其内部设计允许大量的定制和扩展。据我所知,我能够在短时间内解决其他用户的大部分功能请求。也许你试一试。