消息队列
认识
消息队列的本质是队列,队列是一种先进先出的数据结构,一般在java中用于缓存操作,创建线程池时我们需要一个阻塞队列,JDK的Lock机制也需要队列.而消息队列在rpc架构开发中用于解决特殊开发业务场景的问题,例如,解耦,异步,削峰.
多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除.
例子
rabbitmq
rabbitmq 分为消息发送和消息接收两个阶段.消息队列将输出的信息进行了打包处理,可以保证以消息为单位进行接收.
双十一期间系统受到的请求流量猛增,有可能会将系统压垮。传统做法是为了保证系统的稳定性,一般是增加服务器配置、新增服务器做负载均衡这样的话在正常时间段都能满足服务的情况下采用这种做法无疑是对服务器性能的一种浪费,并不划算!另一种做法是如果系统负载超过阈值,就会阻止用户请求,但在流量高峰时这会影响用户体验。通过消息队列就可以完美解决这个问题,引入消息队列方案后可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。
kafka
消息队列将输出的信息进行了打包处理,可以保证以消息为单位进行接收.在 Kafka 中,消息以主题 来分类,每一个主题都对应一个「消息队列」,生产者(也称为发布者)创建消息,而消费者(也称为订阅者)负责消费or读取消息。
预读会提前将一个比较大的磁盘快读入内存。后写会将很多小的逻辑写操作合并起来组合成一个大的物理写操作。并且,操作系统还会将主内存剩余的所有空闲内存空间都用作磁盘缓存,所有的磁盘读写操作都会经过统一的磁盘缓存
总结
在消息延迟方面,rabbitmq比kafka做的要好,rabbitmq会设置监听功能,在收到消息时不会立刻将消息放入队列中,而是等待消息延迟时间,到达时间后在放入队列