【问题标题】:What are good use cases for an in-process events system vs microservices with a broker?进程内事件系统与带有代理的微服务有哪些好的用例?
【发布时间】:2017-11-20 11:15:25
【问题描述】:

我最近看到有不同的框架允许使用消息传递架构,但在进程中实现,使用相同和不同的线程。我知道的有 Spring、Guava EventBus 和 Reactor。

我的问题是什么是好的用例,人们希望使用它们而不是向成熟的代理发送消息。我知道它的使用可以更好地解耦业务逻辑,但在微服务架构中,您通常会发布事件以供其他微服务使用。这样做的好处是您可以通过添加代理集群来实现容错,在这些代理集群中,由一个实例中的故障导致的错误消息可以由另一个实例重试。通过发送稍后由同一系统使用的消息来实现分解和执行的逻辑,特别是当订阅者在不同的线程中执行时,在我看来很难将数据恢复到一致的状态。

【问题讨论】:

    标签: java event-handling messaging microservices


    【解决方案1】:

    微服务相对于进程内的优势实际上并不在于它代表消息消费的变化。

    微服务允许您在集群中的特定节点上执行部分代码,从而允许将繁重的计算分配到功能强大的计算机上,并将次要或轻量资源分配到功能较弱的资源上。总体而言,它可以让您更好地平衡性能,并在需要它的代码部分上扩展您的资源。

    此外,每当您更新微服务的代码时,都不会影响其他服务,因此您的更改(和错误)是独立的。如果一切都在同一个进程中运行,任何错误的更新实际上都可能导致整个解决方案无法使用。

    最后,从您的流程(第 3 方代理)中获取通信允许您与更多的人、代理、流程等共享它。否则人们必须成为您流程的一部分(模块?),而这确实效率不高。

    老实说,您在单片机中进行进程内通信的唯一充分理由是速度(内存中通信而不是在线通信)。

    【讨论】:

    • 我不同意最后一点。设计一个依赖内部消息来提高速度的系统对我来说暗示它实际上并不需要它。依靠外部代理来分派消息提供了一种通过添加新实例来扩展系统的方法。这样,任何实例都可以选择一条消息并继续该过程,当与节点故障后未处理的消息重试相结合时,增加了容错能力。如果发送的每条消息都是一系列事件的一部分,则丢失一条消息可能会破坏整个系统,外部代理集群可以帮助解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2020-06-27
    • 2021-05-19
    • 2020-04-08
    • 2017-12-16
    • 1970-01-01
    • 2011-12-22
    • 2021-07-31
    相关资源
    最近更新 更多