java——异步消息队列

什么是消息队列?

消息队列,是一个以队列数据结构为基础的一个实体,这个实体是真实存在的。比如程序中的数组,数据库中的表或者redis等等。

为什么要使用队列?什么情况下才会使用队列?

实时性要求不高,比较耗时间的任务,是队列的最佳应用场景。比如说在某网站注册一个账号,当信息入库注册成功之后,该网站将会发送一封激活邮件,从而激活账号。而发送邮件的操作并不是需要实时响应的。不需要卡在注册界面,等待邮件发送成功。同时发送邮件本身就是一个耗时间的操作(需要调用第三方smtp服务器),此时应选择消息队列去处理。注册完成后,我只需要向队列投递一个消息,消息的内容中包括我要发送邮件的一些设置,以及发送时间,重试次数等消息属性。这里的投递操作(可以是入库,写入缓存等)是要消息进入一个实体的队列。其中应该有一个进程(消费者)一直在后台运行,它不断去轮训队列中的消息(按照时间顺序,队列是先进先出),看看有没有达到执行条件的,如果有就取出一条。根据配置消息,执行任务,如果成功,则销毁这条消息,继续轮训,如果失败,则重试,直到达到重试次数。这时用户已经收到注册成功的提示,但是已经去做其他事情了,邮件同时发送过来,用户点击邮件,注册成功,这是消息队列的一个典型应用。

点赞功能,在高并发的情况下,很容易造成数据库连接数占满,到那时整个网站响应缓慢,要解决数据库的压力问题,一般就是两种方案。一是提高数据库本身的能力(增加连接数,读写分离等),但是数据库是有极限的,一旦到达极限将没有办法再进行提升。此时就要考虑第二种方案,释放数据库的压力,将压力转移到缓存中。比如实际的点赞,用户的点赞请求来到之后,我将点赞请求投递到消息队列中,后续的点赞请求可以将消息合并,即只更新点赞数,不产生新的任务。此时应有一个进程不断轮训消息队列,将点赞消息消耗,并将值更新到数据库中。这样就有效的降低了数据库的压力,因为在缓存层将数个数据库更新请求合并成一个,大大提高了效率,降低了负载。

缓存是CPU的一部分,它存在于CPU中,存取数据的速度非常快,一秒钟能够存取处理十亿条指令和数据,而内存就慢很多。速度快的内存能达到几十兆就非常不错了,可见两者的速度差异是非常大的。为了解决CPU速度和内存速度差异问题,内存中被CPU访问最频繁的数据和指令被复制到CPU中的缓存,这样CPU就不经常需要到像蜗牛一样慢的内存中去存取数据了。

缓存是集成于CPU中,作为CPU运算的存储支撑。由于考虑到CPU芯片面积和成本,缓存都很小。一般现在的缓存不超过几MB,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存上或者硬盘上去找,以此提高系统性能。

内存是作为CPU与硬盘之间的存储支撑,插在主板的内存槽中。它是与CPU进行沟通的桥梁,计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存也被成为内存储器,其作用是用来存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后,CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Java消息队列可以解决人数等待的问题。通过将消息放入消息队列中,可以实现异步通信,允许用户将消息放入队列,但不立即处理它们。这样可以避免人数等待,即使有大量的消息需要处理,也可以按照自己的需求逐个处理。\[1\]此外,Java消息队列还提供了解决重复发送消息的机制。每条消息都会生成一个全局唯一的消息ID,通过这个ID可以判断消息是否重复发送,并决定是否将消息落地到数据库中。这样可以保证一条消息只能一次落地到数据库,避免重复处理。\[2\]另外,可以利用Java消息队列的高级特性,如Message Groups,来实现负载均衡的机制。通过设置消息的JMSXGroupID属性,可以将消息分发给不同的消费者,实现消息的均衡处理。\[3\]因此,Java消息队列可以有效地解决人数等待的问题,提高系统的并发性能和可靠性。 #### 引用[.reference_title] - *1* [JAVA消息中间件/消息队列](https://blog.csdn.net/qq_52093708/article/details/131096741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Java面试——消息队列](https://blog.csdn.net/zhengzhaoyang122/article/details/115796146)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值