【问题标题】:Spring Do I need to use an EventListener instead of Async?Spring 我需要使用 EventListener 而不是 Async 吗?
【发布时间】:2020-08-15 19:32:10
【问题描述】:

我正在使用一个使用 Spring 的 ApplicationEventPublisher 发布消息的应用程序。我们将拥有针对 rdbms 执行一些复杂的读取/更新功能的函数,然后发布该消息以执行诸如向用户发送电子邮件甚至为其他微服务发布 sqs 消息的工作。

ApplicationEventPublisher eventPublisher;
UpdateEvent event = UpdateEvent.builder().eventSource("SomeUpdate")
                    .scenarioId(scenarioId).build();
eventPublisher.publishEvent(event);

和一个听众:

public interface LocalMessageHandlingAsyncService {

    @TransactionalEventListener
    void publishUpdateEvent(UpdateEvent mediaPlanUpdateEvent);

因为某些事件会围绕刚刚处理的数据对数据库进行读取,所以我们使用@TransactionalEventListener 来确保我们处理最新提交的数据。当我看到这种类型的模式时,我想知道这与仅调用单独的异步方法相比有什么优势?

使用异步方法,我们不必担心将对象序列化为 json 或创建单独的事件对象来管理。我们仍然需要担心未处理的交易,但我相信,使用 TransactionSynchronizationManager 可以解决这个问题。

据我所知,使用事件而不是调用异步方法的优势在于,应用程序的多个区域可能想要监听事件。然而,这与我们的用例不匹配,因为我们只有一个消费者。

【问题讨论】:

    标签: spring-boot events spring-transactions spring-async


    【解决方案1】:

    正如您所提到的,对于单一消费者,这种设计模式不会带来太多好处。

    不过,我会提出其他建议:Spring Integration

    使用 Spring Integration,您可以创建管道并将诸如向用户发送电子邮件和将消息发布到 SQS 等任务本地集成到其他微服务。这使您能够:

    1. 在单个应用程序中的服务任务之间转换和处理消息
    2. 如果需要,请使用 RabbitMQ 等消息代理处理将 1. 中的相同消息分发到分布式环境(即 3. 中的服务可能在不同的机器上运行等。或者您可以发送并忘记)
    3. 在您的一项服务任务中,您实际上可以发送电子邮件等。

    【讨论】:

    • 嗯,这似乎比发布事件更多的开销和工程!我认为 Async 方法在这里仍然更可取
    • 将 Spring 集成到您的架构中取决于您的喜好。如果您不愿意更多地依赖 Spring,那么是的,即使是简单的异步也可能是要走的路。
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 2017-03-27
    • 1970-01-01
    • 2017-10-30
    • 2017-03-24
    • 2018-12-06
    • 1970-01-01
    相关资源
    最近更新 更多