我有一个从外部源接收事件的EventsManager
。 事件
具有类型
和值
。
监听器可以注册到EventsManager
来获知特定类型事件的连续值。
对于给定类型的事件,EventsManager
promise 两件事:
- 相同的值不会连续发送两次(当监听器收到通知时,可以保证收到的值与上一次通知的值不同)。
- 对于给定类型的事件,必须保留从外部源接收值的顺序。
我有一个可用的同步
版本,但我想提高吞吐量。
典型用途:< 1k 个监听器、< 10k 事件类型、< 每秒接收的 1M 事件(但大多数被丢弃,因为没有为该类型的事件注册监听器或值未更改)。
- 实现该行为的最有效策略是什么(例如,我可以为每个事件类型使用一个队列/锁并将它们保存在 ConcurrentMap 中,但拥有 10k 队列听起来不是一个好主意)?
- 是否有任何现有库可以使用可扩展的并发结构执行类似的操作?
示例:监听器 lst1
想要监听 type1
类型的事件
EventsManager 接收:
event: type2, value: 2
event: type1, value: 1
event: type1, value: 1 //no change => discard
event: type3, value: 4
event: type1, value: 7
lst1
应该按顺序接收:1
(仅一次),然后是 7
。
最佳答案
我会尝试实现这个事件流
- 所有传入事件都会放入初始 EventQueue
- EventDispatcherThread 读取 EventQueue,并针对每种类型过滤并路由事件到适当的EventQueue(队列的简单映射)<
- EventListernerThread 的多个实例正在读取其类型的相应 EventQueue...
无需锁定/同步
关于java - 并发合并队列和监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13878585/