事件驱动的架构...无限循环

我有一个事件驱动的体系结构,其中A正在等待来自B的更改,B正在等待来自C的更改,C正在等待从A发生更改,形成一个循环。

现在,如果B改变,则A向C发射事件,其发射到B,其发射到A,其发射到C ... ad infinitum。

我现在可以改变我的计划,不要遏制这个循环,但我担心我可能会在晚些时候把自己放到一个角落里,我不能。 在设计基于事件的系统时,如何防止这种情况发生?


循环依赖非常糟糕。 我必须在A,B和C方面写下你的文章,然后才能对我有意义。 我认为你应该摆脱它。 如果你把自己放在一个角落里,那可能比你在循环依赖中遇到的问题要好很多。

你也可以避免这种情况。 A,B和C确实紧密结合。 我认为你需要重新考虑他们的责任。 也许有一个共同的D元素可以消除很多设计压力。

想到的其他东西是建筑分层。 如果你可以将A层叠在B层上,并且需要任何与B说话的人通过A层和层下的通信,那么你可以给自己一个更简单的时间。 再一次,我不太了解你的问题,所以这些只是广泛的建议。

最后一个选项,也是我最不喜欢的,是在三个组件之间传递消息。 随着每个访问,都要求每个组件都添加到消息中,以便看到该消息。 然后,获取消息的下一个组件就会提供关于谁看到它的信息。 有点像注册表。 但是,再次,最不喜欢。 先试试其他的东西。

祝你好运!


绘制你的依赖关系。 不应该有周期。 周期性依赖关系是重新组织代码的好借口。

如果您需要另一个原因来避免它们,它们也会导致死锁。


这里的每个人似乎都说循环依赖是不好的。 这在某种意义上是正确的,我尝试以几乎所有代价避免静态循环依赖。 你可以通过这个博客中的控制反转来实现:http://blog.schauderhaft.de/2011/07/17/breaking-dependency-cylces/

但是你描述的不是一个静态循环依赖,而是一个在运行时。 我不完全确定,但我认为在运行时避免循环依赖是或多或少是不可能的。 但当然这不应该导致无限循环。 为了解决那些我看到两个半选项

首先是黑客

确保由另一个事件触发的每个事件都有对原始事件的引用(或有关它的基本信息,如id)。 当你处理一个事件时,确保它不是源于你的自我。

Pro:易于实施; 完全防止递归

黑客的另一半

如果你正在同步运行,你可以在之前设置一个标志firingEvent并在之后重新设置它。 忽略当firingEvent设置时firingEvent事件。

Pro:更容易实施; 在单个线程中运行时绝对阻止递归

语义丰富的解决方案

我相信A会触发外部触发事件,而A会触发事件,因为C触发事件实际上是两个不同的事件,或者所有三个事件实际上只是一个可能来自尚未确定的源D的事件。类似的东西。 没有信息就没有办法告诉A,B和C是什么,他们正在发射什么事件。 如果你发现正确的事件,周期就会消失。

Pro:设计将更清晰并包含更多信息。

链接地址: http://www.djcxy.com/p/47861.html

上一篇: Event driven architecture...infinite loop

下一篇: Run cucumber tests on heroku