首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >@异步与消息队列差异

@异步与消息队列差异
EN

Stack Overflow用户
提问于 2022-05-25 14:03:48
回答 1查看 263关注 0票数 2

我有一个spring引导项目,部署在两个服务器上,并使用nginx。项目中的一种方法可以做到:

  1. 在redis

中设置了一些键值。

  1. 在db

中插入某些内容

1之后,我想以异步方式完成2。

一种解决方案是让doDB()成为springboot @异步方法:

代码语言:javascript
运行
复制
Class A {
    public void ***() {
        doRedis() // 1.set some key-values in redis
        doDB() // 2.insert something in db
    }
}

Class B {
    @async
    doDB()
}

另一个解决方案是向MQ发送消息:

代码语言:javascript
运行
复制
Class A {
    public void ***() {
        doRedis() // 1.set some key-values in redis
        sendMessage() 
    }
}

Class B {
    onMessage(){
        doDB()
    }
}

如果A类和B类都在spring启动项目中,则只需将该项目部署到两个服务器中即可。我认为使用@async就足够了,没有必要使用MQ来实现异步方式,因为服务器一执行B类doDB()和服务器二执行B类doDB()没有区别。如果B类位于另一个项目中,那么使用MQ是很好的,因为它对项目一执行redis工作和项目二执行db工作是解耦的。

是对的吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-10-05 08:26:54

基本上,您是对的,如果它将位于同一服务器内的同一个应用程序中,则不需要MQ,因为异步已经有一个队列。但是,即使在同一个应用程序中,您也应该确定一些要点。

  1. 如果您关心排序消息队列更有意义,在本例中也可以使用异步,但是您必须配置线程池以只使用一个线程来处理异步

  1. 如果您关心丢失消息,如果在处理消息之前发生了一些不好的事情,则应该使用MQ将消息保存到磁盘或其他地方,以便稍后在

上处理其余的消息。

如果应用程序收到大量请求,并且在异步线程池中没有仔细设置线程,则在使用机器资源时可能会出现溢出错误或其他问题。

在应用程序的能力范围内选择,不要从第一天起就过度设计,你从你拥有的和你已经测试过的东西中分离出来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72379109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档