1. 什么是 MQ,有什么作用?
- MQ 就是消息中间件,它的作用有异步,解耦,削峰。
2. 市场上有很多 MQ 产品,我们要如何选择?
- 常见的 MQ 有 ActiveMQ,它是老牌的 MQ,性能不算太好;还有 RocketMQ,是阿里巴巴开源的 MQ,性能卓越,但是社区不活跃;RabbitMQ,性能十分强悍,社区活跃,唯一的缺点就是它不是 java 语言编写的,难以做二次开发;还有 kafka,一般用于大数据领域。我们可以根据自己的系统的并发量,以及是否要做二次开发等来确定使用哪种 MQ。
3. 你们公司用的是哪个 MQ?主要用来做什么?
- 我们公司用的是 ActiveMQ,主要用来处理异步通知的。
4. 简单说一下 ActiveMQ。
- ActiveMQ 下载安装后,其端口是 61616,图形界面端口是 8161,它主要有两种工作模式,一个是点对点,一个发布订阅。点对点的目的地是 queue,一条消息只能有一个消费者;发布订阅目的地是 topic,一条消息可以有多个消费者,消费者只能消费订阅了这个 topic 之后的消息。
5. ActiveMQ 支持哪些传输协议?
- 支持 TCP,UDP,http,SSL,NIO等协议,TCP 是默认的协议,一般我们会使用 NIO协议,在 activemq.xml 中就可以修改。
6. 如何保证消息的可靠性?
- 一个是事务,一个是签收,还有就是持久化。生产者开启事务,发送消息后需要 commit,消费者收到消息后需要进行签收。持久化就是将消息写入数据库或者磁盘。
7. ActiveMQ 有哪些持久化方式?
- kahadb,leveldb,jdbc 等,常用的是 jdbc 持久化。持久化的逻辑就是生产者生产了消息,先持久化,然后发送到 MQ 中,如果消费者消费成功就删除消息,否则就继续消费。
8. 简述 ActiveMQ jdbc 持久化的流程。
- 首先将 MySQL 驱动包加到 ActiveMQ 的 lib 目录下;
- 然后在 ActiveMQ 的配置文件中配置数据源;
- 配置好之后 ActiveMQ 收到消息就会在数据库生成三张表,activemq_acks 表用来存储发布订阅关系,activemq_locks 是集群时需要用到的表,activemq_msgs 就是存储消息的表。
9. 如何解决重复消费问题?
- 正常情况下消费者签收了消息,消息就会从 ActiveMQ 中移除,但是可能由于网络原因,ActiveMQ 没收到签收信息,就会出现重复消费问题。我们可以消费消息时往数据库或者 Redis 写一条记录,消费时如果数据库或 Redis 有这条记录了,就不再消费。
10. 如何解决消息堆积问题?
- 紧急扩容消费者,部署更多的消费者去消费。
11. 我需要往一个地址发通知,如果通知失败,隔一段时间再通知,如何实现?
- 可以用 ActicveMQ 的延时投递。在 ActiveMQ 的配置文件中开启对延时投递的支持,即
schedulerSupport=true
,然后在生产者中设置延时投递的相关参数即可。