受体执行中的事件总线和异步

时间:2016-06-26 17:03:16

标签: multithreading performance memory optimization

我挑战自己设计和实现(在Java中,但仍然在设计级别)事件总线,用于多线程。未来计划不会严肃使用这个系统,唯一的兴趣在于挑战本身及其优化。

事件总线的设计是为了在事件触发和与其接收相关的代码之间进行异步执行。但是,通过控制事件总线的线程(EventManager),我看到了两种可能的实现方式。

我的问题是:如果这两个实施最好的那一个?

1) EventManager线程调用订阅该事件的每个系统并以顺序方式运行其代码。 虽然这种解决方案在考虑发射器 - 受体时确实是异步的,但在执行多个受体时我们仍然具有同步性。此外,如果其中一个接收器功能需要时间,我们就会延迟整个总线管理的执行。

2)每个受体系统都有自己的缓冲总线,EventManager线程只将事件重新传输到订阅系统,乘以使用的内存(事件可以同时在多个系统中重写) )但解决同步问题。

我想在一个典型的系统(即游戏,非计算重型软件或时间关键型解决方案)中,第一个是最好的。第二个可能需要大量的内存,而不是那么多的时间优化。

你之前有过这个问题吗?你有什么提示吗?

1 个答案:

答案 0 :(得分:0)

在两者之间,您需要选择您的设计要求。

对于选项1:

优点:

  • 顺序设计(根据我的经验)更容易设计和实施
  • 更容易控制和理解(因为你可以实现优先级作为序列的副作用)
  • 在每个受体之间传递的事件的变异不需要同步,因为它是线程限制的。

缺点:

  • 再次如您所讨论的,如果一个受体阻断,其他受体将受到影响。
  • 由于顺序性,受体将无法利用并行计算。

对于选项2:

优点:

  • 受体彼此独立运作(并提供更多并行化的机会)
  • 只要事件一到达缓冲区就被处理,内存就不会受到真正的负面影响
  • 阻止的接收器可以使用缓冲区存储事件以供以后处理而不是阻止行

<强>缺点:

  • 必须妥善协调受体,以便实施事件优先事项等事项,并确保所有受体(即使是那些阻止并使事件排队的受体)一起完成
  • 突变事件要求客户提交受体以使用同步以保持数据与其他受体一致

如果有的话,我个人会选择#2选项来支持性能,因为通常内存会受到性能提升的副作用。但是,如果您的目标受众不开发多线程客户端或同步很难实施,我会选择优先选项#1,安全性和可靠性。