什么是消息队列?
消息队列,是一个以队列数据结构为基础的一个实体,这个实体是真实存在的。比如程序中的数组,数据库中的表或者redis等等。
为什么要使用队列?什么情况下才会使用队列?
实时性要求不高,比较耗时间的任务,是队列的最佳应用场景。比如说在某网站注册一个账号,当信息入库注册成功之后,该网站将会发送一封激活邮件,从而激活账号。而发送邮件的操作并不是需要实时响应的。不需要卡在注册界面,等待邮件发送成功。同时发送邮件本身就是一个耗时间的操作(需要调用第三方smtp服务器),此时应选择消息队列去处理。注册完成后,我只需要向队列投递一个消息,消息的内容中包括我要发送邮件的一些设置,以及发送时间,重试次数等消息属性。这里的投递操作(可以是入库,写入缓存等)是要消息进入一个实体的队列。其中应该有一个进程(消费者)一直在后台运行,它不断去轮训队列中的消息(按照时间顺序,队列是先进先出),看看有没有达到执行条件的,如果有就取出一条。根据配置消息,执行任务,如果成功,则销毁这条消息,继续轮训,如果失败,则重试,直到达到重试次数。这时用户已经收到注册成功的提示,但是已经去做其他事情了,邮件同时发送过来,用户点击邮件,注册成功,这是消息队列的一个典型应用。
点赞功能,在高并发的情况下,很容易造成数据库连接数占满,到那时整个网站响应缓慢,要解决数据库的压力问题,一般就是两种方案。一是提高数据库本身的能力(增加连接数,读写分离等),但是数据库是有极限的,一旦到达极限将没有办法再进行提升。此时就要考虑第二种方案,释放数据库的压力,将压力转移到缓存中。比如实际的点赞,用户的点赞请求来到之后,我将点赞请求投递到消息队列中,后续的点赞请求可以将消息合并,即只更新点赞数,不产生新的任务。此时应有一个进程不断轮训消息队列,将点赞消息消耗,并将值更新到数据库中。这样就有效的降低了数据库的压力,因为在缓存层将数个数据库更新请求合并成一个,大大提高了效率,降低了负载。
缓存是CPU的一部分,它存在于CPU中,存取数据的速度非常快,一秒钟能够存取处理十亿条指令和数据,而内存就慢很多。速度快的内存能达到几十兆就非常不错了,可见两者的速度差异是非常大的。为了解决CPU速度和内存速度差异问题,内存中被CPU访问最频繁的数据和指令被复制到CPU中的缓存,这样CPU就不经常需要到像蜗牛一样慢的内存中去存取数据了。
缓存是集成于CPU中,作为CPU运算的存储支撑。由于考虑到CPU芯片面积和成本,缓存都很小。一般现在的缓存不超过几MB,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存上或者硬盘上去找,以此提高系统性能。
内存是作为CPU与硬盘之间的存储支撑,插在主板的内存槽中。它是与CPU进行沟通的桥梁,计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存也被成为内存储器,其作用是用来存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后,CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行