一,队列。
队列是一种先进先出的数据结构。
=========================================================================
二,消息队列。
消息队列是一种中间件,可以简单理解为把要传输的数据放在队列中,
=========================================================================
三,生产者和消费者。
把数据放到消息队列叫做生产者
从消息队列里边取数据叫做消费者
=========================================================================
四,消息队列的优点。
解耦,异步,削峰。
解耦的话是指主系统把消息放到消息队列中,其他系统想消费就直接消费,不用通知主系统。
异步的话是主要是提高提高用户体验和吞吐量。
削峰的话主要是解决了高并发的场景,将消息放到消息队列中,进行一个限流缓冲。
=========================================================================
五,高可用,
无论我们是使用消息队列来做解耦,异步,还是削峰,消息队列都不可能是单机的,
如果是单机的消息队列,万一这台机器挂了,那我们整个系统就不可用了,所以我们项目中
使用消息队列都是集群模式的。
=========================================================================
六,消费者怎么得到消息队列的数据。
1.生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿,这叫push。
2.消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费pull。
=========================================================================
七,消息队列缺点,
1.系统可用性降低,
2.系统复杂度提高,
要考虑很多方面的问题,比如:消息一致性问题,重复消费问题,消息丢失问题。
=========================================================================
八,你们公司生产环境用的是什么消息中间件?
用的是RabbitMQ,支持高并发、高吞吐,还支持集群化、高可用架构部署、消息高可靠支持,
并且还是开源的,活跃度也高。
=========================================================================
九,消息的重复问题如何解决?
造成消息重复的根本原因是:网络不可达。
消费端处理消息要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。
保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现。利用一张日志
表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息。
=========================================================================
十,如何保证RabbitMQ消息的顺序性?
第一种:将消息队列拆分成多个,每个队列对应一个消费者。
第二种:保证只有一个消息队列,一个消费者,然后对这个消费者内部用内存队列做排队,
最后分发给底层的worker来处理。
=========================================================================
十一,消息基于什么传输?
由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,所以RabbitMQ使用信道的方式
来传输数据,信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。
=========================================================================
十二,如何保证消息队列消息的可靠传输?如何解决消息丢失问题?
首先消息丢失分为生产者丢失消息、消息列表丢失消息、消费者丢失消息。
1.生产者消息丢失:提供事务模式和认证模式来确保生产者不丢消息。
事务机制是指发送消息前,开启事务,然后发送消息,如果发送过程中出现什么异常,事务就会回滚,
如果发送成功则提交事务。
2.消息列表丢失消息:开启持久化磁盘的配置。
3.消费者丢失消息:将自动确认消息模式改为手动确认消息。
=========================================================================